Send patches - preferably formatted by git format-patch - to patches at archlinux32 dot org.
summaryrefslogtreecommitdiff
path: root/js
diff options
context:
space:
mode:
Diffstat (limited to 'js')
-rw-r--r--js/callbacks/checkrelated.php20
-rw-r--r--js/callbacks/checksave.php16
-rw-r--r--js/callbacks/deletesearches.php30
-rw-r--r--js/callbacks/gethistory.php69
-rw-r--r--js/callbacks/getpreview.php21
-rw-r--r--js/callbacks/getsearches.php30
-rw-r--r--js/callbacks/quickedit.php170
-rw-r--r--js/callbacks/savesearches.php27
-rw-r--r--js/callbacks/searchnames.php55
-rw-r--r--js/callbacks/searchtask.php43
-rw-r--r--js/callbacks/testemail.php44
-rw-r--r--js/callbacks/usersearch.php45
-rw-r--r--js/ckeditor/CHANGES.md720
-rw-r--r--js/ckeditor/LICENSE.md1264
-rw-r--r--js/ckeditor/README.md39
-rw-r--r--js/ckeditor/adapters/jquery.js10
-rw-r--r--js/ckeditor/build-config.js157
-rw-r--r--js/ckeditor/ckeditor.js946
-rw-r--r--js/ckeditor/config.js38
-rw-r--r--js/ckeditor/contents.css134
-rw-r--r--js/ckeditor/lang/af.js5
-rw-r--r--js/ckeditor/lang/ar.js5
-rw-r--r--js/ckeditor/lang/bg.js5
-rw-r--r--js/ckeditor/lang/bn.js5
-rw-r--r--js/ckeditor/lang/bs.js5
-rw-r--r--js/ckeditor/lang/ca.js5
-rw-r--r--js/ckeditor/lang/cs.js5
-rw-r--r--js/ckeditor/lang/cy.js5
-rw-r--r--js/ckeditor/lang/da.js5
-rw-r--r--js/ckeditor/lang/de.js5
-rw-r--r--js/ckeditor/lang/el.js5
-rw-r--r--js/ckeditor/lang/en-au.js5
-rw-r--r--js/ckeditor/lang/en-ca.js5
-rw-r--r--js/ckeditor/lang/en-gb.js5
-rw-r--r--js/ckeditor/lang/en.js5
-rw-r--r--js/ckeditor/lang/eo.js5
-rw-r--r--js/ckeditor/lang/es.js5
-rw-r--r--js/ckeditor/lang/et.js5
-rw-r--r--js/ckeditor/lang/eu.js5
-rw-r--r--js/ckeditor/lang/fa.js5
-rw-r--r--js/ckeditor/lang/fi.js5
-rw-r--r--js/ckeditor/lang/fo.js5
-rw-r--r--js/ckeditor/lang/fr-ca.js5
-rw-r--r--js/ckeditor/lang/fr.js5
-rw-r--r--js/ckeditor/lang/gl.js5
-rw-r--r--js/ckeditor/lang/gu.js5
-rw-r--r--js/ckeditor/lang/he.js5
-rw-r--r--js/ckeditor/lang/hi.js5
-rw-r--r--js/ckeditor/lang/hr.js5
-rw-r--r--js/ckeditor/lang/hu.js5
-rw-r--r--js/ckeditor/lang/id.js5
-rw-r--r--js/ckeditor/lang/is.js5
-rw-r--r--js/ckeditor/lang/it.js5
-rw-r--r--js/ckeditor/lang/ja.js5
-rw-r--r--js/ckeditor/lang/ka.js5
-rw-r--r--js/ckeditor/lang/km.js5
-rw-r--r--js/ckeditor/lang/ko.js5
-rw-r--r--js/ckeditor/lang/ku.js5
-rw-r--r--js/ckeditor/lang/lt.js5
-rw-r--r--js/ckeditor/lang/lv.js5
-rw-r--r--js/ckeditor/lang/mk.js5
-rw-r--r--js/ckeditor/lang/mn.js5
-rw-r--r--js/ckeditor/lang/ms.js5
-rw-r--r--js/ckeditor/lang/nb.js5
-rw-r--r--js/ckeditor/lang/nl.js5
-rw-r--r--js/ckeditor/lang/no.js5
-rw-r--r--js/ckeditor/lang/pl.js5
-rw-r--r--js/ckeditor/lang/pt-br.js5
-rw-r--r--js/ckeditor/lang/pt.js5
-rw-r--r--js/ckeditor/lang/ro.js5
-rw-r--r--js/ckeditor/lang/ru.js5
-rw-r--r--js/ckeditor/lang/si.js5
-rw-r--r--js/ckeditor/lang/sk.js5
-rw-r--r--js/ckeditor/lang/sl.js5
-rw-r--r--js/ckeditor/lang/sq.js5
-rw-r--r--js/ckeditor/lang/sr-latn.js5
-rw-r--r--js/ckeditor/lang/sr.js5
-rw-r--r--js/ckeditor/lang/sv.js5
-rw-r--r--js/ckeditor/lang/th.js5
-rw-r--r--js/ckeditor/lang/tr.js5
-rw-r--r--js/ckeditor/lang/tt.js5
-rw-r--r--js/ckeditor/lang/ug.js5
-rw-r--r--js/ckeditor/lang/uk.js5
-rw-r--r--js/ckeditor/lang/vi.js5
-rw-r--r--js/ckeditor/lang/zh-cn.js5
-rw-r--r--js/ckeditor/lang/zh.js5
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/a11yhelp.js10
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/_translationstatus.txt25
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/af.js11
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/ar.js11
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/bg.js11
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/ca.js13
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/cs.js13
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/cy.js11
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/da.js11
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/de.js13
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/el.js13
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/en-gb.js11
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/en.js11
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/eo.js13
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/es.js12
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/et.js11
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/fa.js11
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/fi.js12
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/fr-ca.js12
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/fr.js13
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/gl.js12
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/gu.js11
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/he.js11
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/hi.js11
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/hr.js11
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/hu.js13
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/id.js11
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/it.js13
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/ja.js9
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/km.js11
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/ko.js11
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/ku.js12
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/lt.js11
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/lv.js13
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/mk.js11
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/mn.js11
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/nb.js12
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/nl.js12
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/no.js11
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/pl.js13
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/pt-br.js12
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/pt.js12
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/ro.js12
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/ru.js11
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/si.js10
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/sk.js12
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/sl.js12
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/sq.js11
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/sr-latn.js11
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/sr.js11
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/sv.js12
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/th.js11
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/tr.js12
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/tt.js11
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/ug.js11
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/uk.js12
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/vi.js11
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/zh-cn.js9
-rw-r--r--js/ckeditor/plugins/a11yhelp/dialogs/lang/zh.js9
-rw-r--r--js/ckeditor/plugins/about/dialogs/about.js7
-rw-r--r--js/ckeditor/plugins/about/dialogs/hidpi/logo_ckeditor.pngbin0 -> 13339 bytes
-rw-r--r--js/ckeditor/plugins/about/dialogs/logo_ckeditor.pngbin0 -> 6757 bytes
-rw-r--r--js/ckeditor/plugins/clipboard/dialogs/paste.js11
-rw-r--r--js/ckeditor/plugins/dialog/dialogDefinition.js4
-rw-r--r--js/ckeditor/plugins/fakeobjects/images/spacer.gifbin0 -> 43 bytes
-rw-r--r--js/ckeditor/plugins/icons.pngbin0 -> 10227 bytes
-rw-r--r--js/ckeditor/plugins/icons_hidpi.pngbin0 -> 34465 bytes
-rw-r--r--js/ckeditor/plugins/image/dialogs/image.js43
-rw-r--r--js/ckeditor/plugins/image/images/noimage.pngbin0 -> 2115 bytes
-rw-r--r--js/ckeditor/plugins/link/dialogs/anchor.js7
-rw-r--r--js/ckeditor/plugins/link/dialogs/link.js26
-rw-r--r--js/ckeditor/plugins/link/images/anchor.pngbin0 -> 589 bytes
-rw-r--r--js/ckeditor/plugins/link/images/hidpi/anchor.pngbin0 -> 1379 bytes
-rw-r--r--js/ckeditor/plugins/magicline/images/hidpi/icon-rtl.pngbin0 -> 176 bytes
-rw-r--r--js/ckeditor/plugins/magicline/images/hidpi/icon.pngbin0 -> 199 bytes
-rw-r--r--js/ckeditor/plugins/magicline/images/icon-rtl.pngbin0 -> 138 bytes
-rw-r--r--js/ckeditor/plugins/magicline/images/icon.pngbin0 -> 133 bytes
-rw-r--r--js/ckeditor/plugins/pastefromword/filter/default.js31
-rw-r--r--js/ckeditor/plugins/scayt/LICENSE.md28
-rw-r--r--js/ckeditor/plugins/scayt/README.md25
-rw-r--r--js/ckeditor/plugins/scayt/dialogs/options.js17
-rw-r--r--js/ckeditor/plugins/scayt/dialogs/toolbar.css71
-rw-r--r--js/ckeditor/plugins/specialchar/dialogs/lang/_translationstatus.txt20
-rw-r--r--js/ckeditor/plugins/specialchar/dialogs/lang/af.js13
-rw-r--r--js/ckeditor/plugins/specialchar/dialogs/lang/ar.js13
-rw-r--r--js/ckeditor/plugins/specialchar/dialogs/lang/bg.js13
-rw-r--r--js/ckeditor/plugins/specialchar/dialogs/lang/ca.js14
-rw-r--r--js/ckeditor/plugins/specialchar/dialogs/lang/cs.js13
-rw-r--r--js/ckeditor/plugins/specialchar/dialogs/lang/cy.js14
-rw-r--r--js/ckeditor/plugins/specialchar/dialogs/lang/da.js13
-rw-r--r--js/ckeditor/plugins/specialchar/dialogs/lang/de.js13
-rw-r--r--js/ckeditor/plugins/specialchar/dialogs/lang/el.js13
-rw-r--r--js/ckeditor/plugins/specialchar/dialogs/lang/en-gb.js13
-rw-r--r--js/ckeditor/plugins/specialchar/dialogs/lang/en.js13
-rw-r--r--js/ckeditor/plugins/specialchar/dialogs/lang/eo.js12
-rw-r--r--js/ckeditor/plugins/specialchar/dialogs/lang/es.js13
-rw-r--r--js/ckeditor/plugins/specialchar/dialogs/lang/et.js13
-rw-r--r--js/ckeditor/plugins/specialchar/dialogs/lang/fa.js12
-rw-r--r--js/ckeditor/plugins/specialchar/dialogs/lang/fi.js13
-rw-r--r--js/ckeditor/plugins/specialchar/dialogs/lang/fr-ca.js10
-rw-r--r--js/ckeditor/plugins/specialchar/dialogs/lang/fr.js11
-rw-r--r--js/ckeditor/plugins/specialchar/dialogs/lang/gl.js13
-rw-r--r--js/ckeditor/plugins/specialchar/dialogs/lang/he.js12
-rw-r--r--js/ckeditor/plugins/specialchar/dialogs/lang/hr.js13
-rw-r--r--js/ckeditor/plugins/specialchar/dialogs/lang/hu.js12
-rw-r--r--js/ckeditor/plugins/specialchar/dialogs/lang/id.js13
-rw-r--r--js/ckeditor/plugins/specialchar/dialogs/lang/it.js14
-rw-r--r--js/ckeditor/plugins/specialchar/dialogs/lang/ja.js9
-rw-r--r--js/ckeditor/plugins/specialchar/dialogs/lang/km.js13
-rw-r--r--js/ckeditor/plugins/specialchar/dialogs/lang/ku.js13
-rw-r--r--js/ckeditor/plugins/specialchar/dialogs/lang/lt.js13
-rw-r--r--js/ckeditor/plugins/specialchar/dialogs/lang/lv.js13
-rw-r--r--js/ckeditor/plugins/specialchar/dialogs/lang/nb.js11
-rw-r--r--js/ckeditor/plugins/specialchar/dialogs/lang/nl.js13
-rw-r--r--js/ckeditor/plugins/specialchar/dialogs/lang/no.js11
-rw-r--r--js/ckeditor/plugins/specialchar/dialogs/lang/pl.js12
-rw-r--r--js/ckeditor/plugins/specialchar/dialogs/lang/pt-br.js11
-rw-r--r--js/ckeditor/plugins/specialchar/dialogs/lang/pt.js13
-rw-r--r--js/ckeditor/plugins/specialchar/dialogs/lang/ru.js13
-rw-r--r--js/ckeditor/plugins/specialchar/dialogs/lang/si.js13
-rw-r--r--js/ckeditor/plugins/specialchar/dialogs/lang/sk.js13
-rw-r--r--js/ckeditor/plugins/specialchar/dialogs/lang/sl.js12
-rw-r--r--js/ckeditor/plugins/specialchar/dialogs/lang/sq.js13
-rw-r--r--js/ckeditor/plugins/specialchar/dialogs/lang/sv.js11
-rw-r--r--js/ckeditor/plugins/specialchar/dialogs/lang/th.js13
-rw-r--r--js/ckeditor/plugins/specialchar/dialogs/lang/tr.js12
-rw-r--r--js/ckeditor/plugins/specialchar/dialogs/lang/tt.js13
-rw-r--r--js/ckeditor/plugins/specialchar/dialogs/lang/ug.js13
-rw-r--r--js/ckeditor/plugins/specialchar/dialogs/lang/uk.js12
-rw-r--r--js/ckeditor/plugins/specialchar/dialogs/lang/vi.js14
-rw-r--r--js/ckeditor/plugins/specialchar/dialogs/lang/zh-cn.js9
-rw-r--r--js/ckeditor/plugins/specialchar/dialogs/lang/zh.js12
-rw-r--r--js/ckeditor/plugins/specialchar/dialogs/specialchar.js14
-rw-r--r--js/ckeditor/plugins/table/dialogs/table.js21
-rw-r--r--js/ckeditor/plugins/tabletools/dialogs/tableCell.js17
-rw-r--r--js/ckeditor/plugins/wsc/LICENSE.md28
-rw-r--r--js/ckeditor/plugins/wsc/README.md25
-rw-r--r--js/ckeditor/plugins/wsc/dialogs/ciframe.html66
-rw-r--r--js/ckeditor/plugins/wsc/dialogs/tmpFrameset.html52
-rw-r--r--js/ckeditor/plugins/wsc/dialogs/wsc.css82
-rw-r--r--js/ckeditor/plugins/wsc/dialogs/wsc.js74
-rw-r--r--js/ckeditor/plugins/wsc/dialogs/wsc_ie.js11
-rw-r--r--js/ckeditor/samples/ajax.html82
-rw-r--r--js/ckeditor/samples/api.html207
-rw-r--r--js/ckeditor/samples/appendto.html56
-rw-r--r--js/ckeditor/samples/assets/inlineall/logo.pngbin0 -> 4283 bytes
-rw-r--r--js/ckeditor/samples/assets/outputxhtml/outputxhtml.css204
-rw-r--r--js/ckeditor/samples/assets/posteddata.php59
-rw-r--r--js/ckeditor/samples/assets/sample.css3
-rw-r--r--js/ckeditor/samples/assets/sample.jpgbin0 -> 14449 bytes
-rw-r--r--js/ckeditor/samples/assets/uilanguages/languages.js7
-rw-r--r--js/ckeditor/samples/datafiltering.html401
-rw-r--r--js/ckeditor/samples/divreplace.html141
-rw-r--r--js/ckeditor/samples/index.html128
-rw-r--r--js/ckeditor/samples/inlineall.html311
-rw-r--r--js/ckeditor/samples/inlinebycode.html121
-rw-r--r--js/ckeditor/samples/inlinetextarea.html110
-rw-r--r--js/ckeditor/samples/jquery.html100
-rw-r--r--js/ckeditor/samples/plugins/dialog/assets/my_dialog.js48
-rw-r--r--js/ckeditor/samples/plugins/dialog/dialog.html187
-rw-r--r--js/ckeditor/samples/plugins/enterkey/enterkey.html103
-rw-r--r--js/ckeditor/samples/plugins/htmlwriter/assets/outputforflash/outputforflash.flabin0 -> 85504 bytes
-rw-r--r--js/ckeditor/samples/plugins/htmlwriter/assets/outputforflash/outputforflash.swfbin0 -> 15571 bytes
-rw-r--r--js/ckeditor/samples/plugins/htmlwriter/assets/outputforflash/swfobject.js18
-rw-r--r--js/ckeditor/samples/plugins/htmlwriter/outputforflash.html280
-rw-r--r--js/ckeditor/samples/plugins/htmlwriter/outputhtml.html221
-rw-r--r--js/ckeditor/samples/plugins/magicline/magicline.html206
-rw-r--r--js/ckeditor/samples/plugins/toolbar/toolbar.html232
-rw-r--r--js/ckeditor/samples/plugins/wysiwygarea/fullpage.html77
-rw-r--r--js/ckeditor/samples/readonly.html73
-rw-r--r--js/ckeditor/samples/replacebyclass.html57
-rw-r--r--js/ckeditor/samples/replacebycode.html56
-rw-r--r--js/ckeditor/samples/sample.css365
-rw-r--r--js/ckeditor/samples/sample.js50
-rw-r--r--js/ckeditor/samples/sample_posteddata.php16
-rw-r--r--js/ckeditor/samples/tabindex.html75
-rw-r--r--js/ckeditor/samples/uicolor.html69
-rw-r--r--js/ckeditor/samples/uilanguages.html119
-rw-r--r--js/ckeditor/samples/xhtmlstyle.html231
-rw-r--r--js/ckeditor/skins/moono/dialog.css5
-rw-r--r--js/ckeditor/skins/moono/dialog_ie.css5
-rw-r--r--js/ckeditor/skins/moono/dialog_ie7.css5
-rw-r--r--js/ckeditor/skins/moono/dialog_ie8.css5
-rw-r--r--js/ckeditor/skins/moono/dialog_iequirks.css5
-rw-r--r--js/ckeditor/skins/moono/dialog_opera.css5
-rw-r--r--js/ckeditor/skins/moono/editor.css5
-rw-r--r--js/ckeditor/skins/moono/editor_gecko.css5
-rw-r--r--js/ckeditor/skins/moono/editor_ie.css5
-rw-r--r--js/ckeditor/skins/moono/editor_ie7.css5
-rw-r--r--js/ckeditor/skins/moono/editor_ie8.css5
-rw-r--r--js/ckeditor/skins/moono/editor_iequirks.css5
-rw-r--r--js/ckeditor/skins/moono/icons.pngbin0 -> 10227 bytes
-rw-r--r--js/ckeditor/skins/moono/icons_hidpi.pngbin0 -> 34465 bytes
-rw-r--r--js/ckeditor/skins/moono/images/arrow.pngbin0 -> 191 bytes
-rw-r--r--js/ckeditor/skins/moono/images/close.pngbin0 -> 468 bytes
-rw-r--r--js/ckeditor/skins/moono/images/hidpi/close.pngbin0 -> 1271 bytes
-rw-r--r--js/ckeditor/skins/moono/images/hidpi/lock-open.pngbin0 -> 1329 bytes
-rw-r--r--js/ckeditor/skins/moono/images/hidpi/lock.pngbin0 -> 1299 bytes
-rw-r--r--js/ckeditor/skins/moono/images/hidpi/refresh.pngbin0 -> 1842 bytes
-rw-r--r--js/ckeditor/skins/moono/images/lock-open.pngbin0 -> 349 bytes
-rw-r--r--js/ckeditor/skins/moono/images/lock.pngbin0 -> 475 bytes
-rw-r--r--js/ckeditor/skins/moono/images/mini.pngbin0 -> 818 bytes
-rw-r--r--js/ckeditor/skins/moono/images/refresh.pngbin0 -> 422 bytes
-rw-r--r--js/ckeditor/skins/moono/readme.md51
-rw-r--r--js/ckeditor/styles.js111
-rw-r--r--js/details.js46
-rw-r--r--js/functions.js576
-rw-r--r--js/index.js91
-rw-r--r--js/jit/jit.js16841
-rw-r--r--js/jscalendar/calendar-blue.css232
-rw-r--r--js/jscalendar/calendar-blue2.css236
-rw-r--r--js/jscalendar/calendar-brown.css225
-rw-r--r--js/jscalendar/calendar-green.css229
-rw-r--r--js/jscalendar/calendar-setup.js203
-rw-r--r--js/jscalendar/calendar-setup_stripped.js22
-rw-r--r--js/jscalendar/calendar-system.css225
-rw-r--r--js/jscalendar/calendar-tas.css239
-rw-r--r--js/jscalendar/calendar-win2k-1.css271
-rw-r--r--js/jscalendar/calendar-win2k-2.css271
-rw-r--r--js/jscalendar/calendar-win2k-cold-1.css265
-rw-r--r--js/jscalendar/calendar-win2k-cold-2.css271
-rw-r--r--js/jscalendar/calendar.js1807
-rw-r--r--js/jscalendar/calendar.php119
-rw-r--r--js/jscalendar/calendar_stripped.js14
-rw-r--r--js/jscalendar/img.gifbin0 -> 223 bytes
-rw-r--r--js/jscalendar/lang/calendar-af.js39
-rw-r--r--js/jscalendar/lang/calendar-al.js101
-rw-r--r--js/jscalendar/lang/calendar-bg.js131
-rw-r--r--js/jscalendar/lang/calendar-big5-utf8.js123
-rw-r--r--js/jscalendar/lang/calendar-big5.js123
-rw-r--r--js/jscalendar/lang/calendar-br.js108
-rw-r--r--js/jscalendar/lang/calendar-ca.js123
-rw-r--r--js/jscalendar/lang/calendar-cs.js69
-rw-r--r--js/jscalendar/lang/calendar-da.js125
-rw-r--r--js/jscalendar/lang/calendar-de.js127
-rw-r--r--js/jscalendar/lang/calendar-du.js45
-rw-r--r--js/jscalendar/lang/calendar-el.js100
-rw-r--r--js/jscalendar/lang/calendar-en.js127
-rw-r--r--js/jscalendar/lang/calendar-es.js129
-rw-r--r--js/jscalendar/lang/calendar-fi.js102
-rw-r--r--js/jscalendar/lang/calendar-fr.js127
-rw-r--r--js/jscalendar/lang/calendar-he.js122
-rw-r--r--js/jscalendar/lang/calendar-hr.js53
-rw-r--r--js/jscalendar/lang/calendar-hu.js126
-rw-r--r--js/jscalendar/lang/calendar-it.js126
-rw-r--r--js/jscalendar/lang/calendar-ja.js127
-rw-r--r--js/jscalendar/lang/calendar-jp.js45
-rw-r--r--js/jscalendar/lang/calendar-ko.js119
-rw-r--r--js/jscalendar/lang/calendar-lt.js114
-rw-r--r--js/jscalendar/lang/calendar-lv.js123
-rw-r--r--js/jscalendar/lang/calendar-mk.js119
-rw-r--r--js/jscalendar/lang/calendar-nl.js75
-rw-r--r--js/jscalendar/lang/calendar-no.js127
-rw-r--r--js/jscalendar/lang/calendar-pl-utf8.js93
-rw-r--r--js/jscalendar/lang/calendar-pl.js133
-rw-r--r--js/jscalendar/lang/calendar-pt.js123
-rw-r--r--js/jscalendar/lang/calendar-ro.js66
-rw-r--r--js/jscalendar/lang/calendar-ru.js126
-rw-r--r--js/jscalendar/lang/calendar-si.js97
-rw-r--r--js/jscalendar/lang/calendar-sk.js68
-rw-r--r--js/jscalendar/lang/calendar-sp.js110
-rw-r--r--js/jscalendar/lang/calendar-sr.js122
-rw-r--r--js/jscalendar/lang/calendar-sv.js98
-rw-r--r--js/jscalendar/lang/calendar-tr.js50
-rw-r--r--js/jscalendar/lang/calendar-zh.js123
-rw-r--r--js/jscalendar/menuarrow.gifbin0 -> 68 bytes
-rw-r--r--js/jscalendar/menuarrow2.gifbin0 -> 49 bytes
-rw-r--r--js/jscalendar/skins/aqua/active-bg.gifbin0 -> 89 bytes
-rw-r--r--js/jscalendar/skins/aqua/dark-bg.gifbin0 -> 85 bytes
-rw-r--r--js/jscalendar/skins/aqua/hover-bg.gifbin0 -> 89 bytes
-rw-r--r--js/jscalendar/skins/aqua/menuarrow.gifbin0 -> 49 bytes
-rw-r--r--js/jscalendar/skins/aqua/normal-bg.gifbin0 -> 110 bytes
-rw-r--r--js/jscalendar/skins/aqua/rowhover-bg.gifbin0 -> 110 bytes
-rw-r--r--js/jscalendar/skins/aqua/status-bg.gifbin0 -> 116 bytes
-rw-r--r--js/jscalendar/skins/aqua/theme.css236
-rw-r--r--js/jscalendar/skins/aqua/title-bg.gifbin0 -> 116 bytes
-rw-r--r--js/jscalendar/skins/aqua/today-bg.gifbin0 -> 1122 bytes
-rw-r--r--js/lightbox/css/lightbox.css27
-rw-r--r--js/lightbox/images/bullet.gifbin0 -> 49 bytes
-rw-r--r--js/lightbox/images/close.gifbin0 -> 222 bytes
-rw-r--r--js/lightbox/images/closelabel.gifbin0 -> 979 bytes
-rw-r--r--js/lightbox/images/loading.gifbin0 -> 2767 bytes
-rw-r--r--js/lightbox/images/nextlabel.gifbin0 -> 1252 bytes
-rw-r--r--js/lightbox/images/prevlabel.gifbin0 -> 1264 bytes
-rw-r--r--js/lightbox/js/lightbox.js497
-rw-r--r--js/prototype/prototype.js6081
-rw-r--r--js/script.aculo.us/builder.js136
-rw-r--r--js/script.aculo.us/controls.js965
-rw-r--r--js/script.aculo.us/dragdrop.js974
-rw-r--r--js/script.aculo.us/effects.js1123
-rw-r--r--js/script.aculo.us/scriptaculous.js68
-rw-r--r--js/script.aculo.us/slider.js275
-rw-r--r--js/script.aculo.us/sound.js59
-rw-r--r--js/script.aculo.us/unittest.js568
-rw-r--r--js/tablecontrol.js487
-rw-r--r--js/tabs.js148
382 files changed, 48835 insertions, 0 deletions
diff --git a/js/callbacks/checkrelated.php b/js/callbacks/checkrelated.php
new file mode 100644
index 0000000..3ce3ee8
--- /dev/null
+++ b/js/callbacks/checkrelated.php
@@ -0,0 +1,20 @@
+<?php
+/*
+ Checks if a related tasks belongs to a different project.
+*/
+
+define('IN_FS', true);
+
+require_once('../../header.php');
+
+$sql = $db->query('SELECT project_id
+ FROM {tasks}
+ WHERE task_id = ?',
+ array(Get::val('related_task')));
+
+$relatedproject = $db->fetchOne($sql);
+
+if (Get::val('project') == $relatedproject || !$relatedproject) {
+ echo 'ok';
+}
+?>
diff --git a/js/callbacks/checksave.php b/js/callbacks/checksave.php
new file mode 100644
index 0000000..a5fd1a4
--- /dev/null
+++ b/js/callbacks/checksave.php
@@ -0,0 +1,16 @@
+<?php
+/*
+ Checks if a task can be saved without danger or not.
+*/
+
+define('IN_FS', true);
+
+require_once('../../header.php');
+
+$res = $db->query('SELECT last_edited_time FROM {tasks} WHERE task_id = ?', array(Get::val('task_id')));
+$last_edit = $db->fetchOne($res);
+
+if (Get::val('time') >= $last_edit) {
+ echo 'ok';
+}
+?>
diff --git a/js/callbacks/deletesearches.php b/js/callbacks/deletesearches.php
new file mode 100644
index 0000000..2ff9e3b
--- /dev/null
+++ b/js/callbacks/deletesearches.php
@@ -0,0 +1,30 @@
+<?php
+/*
+ This script is the AJAX callback that deletes a user's saved search
+*/
+
+define('IN_FS', true);
+
+require_once('../../header.php');
+
+if (Cookie::has('flyspray_userid') && Cookie::has('flyspray_passhash')) {
+ $user = new User(Cookie::val('flyspray_userid'));
+ $user->check_account_ok();
+
+ if( !Post::has('csrftoken') ){
+ http_response_code(428); # 'Precondition Required'
+ die('missingtoken');
+ }elseif( Post::val('csrftoken')==$_SESSION['csrftoken']){
+ # empty
+ }else{
+ http_response_code(412); # 'Precondition Failed'
+ die('wrongtoken');
+ }
+
+ if (!$user->isAnon()) {
+ $db->query('DELETE FROM {searches} WHERE id = ? AND user_id = ?', array(Post::num('id'), $user->id));
+ echo $db->affectedRows();
+ }
+}
+
+?>
diff --git a/js/callbacks/gethistory.php b/js/callbacks/gethistory.php
new file mode 100644
index 0000000..617b992
--- /dev/null
+++ b/js/callbacks/gethistory.php
@@ -0,0 +1,69 @@
+<?php
+/*
+ This script gets the history of a task and
+ returns it for HTML display in a page.
+*/
+
+define('IN_FS', true);
+
+header('Content-type: text/html; charset=utf-8');
+
+require_once('../../header.php');
+require_once('../../includes/events.inc.php');
+
+$csp->emit();
+
+if( !isset($_GET['task_id']) or !is_numeric($_GET['task_id'])){
+ die();
+} else {
+ $task_id = Get::num('task_id');
+}
+
+# recalculate $proj for permission check
+$result = $db->query('SELECT project_id FROM {tasks} WHERE task_id = ?', array($task_id));
+$project_id = $db->fetchOne($result);
+if (!$project_id) {
+ die();
+}
+$proj = new Project($project_id);
+
+// Initialise user
+if (Cookie::has('flyspray_userid') && Cookie::has('flyspray_passhash')) {
+ $user = new User(Cookie::val('flyspray_userid'));
+ $user->check_account_ok();
+} else {
+ $user = new User(0, $proj);
+}
+
+load_translations();
+
+# set project of task asked for and then check permissions based on that
+if ( !($task = Flyspray::getTaskDetails($task_id)) ) {
+ die();
+}
+
+# also check the calculated view task permission in addition to view_history permission
+if (!$user->can_view_task($task) or !$user->perms('view_history')) {
+ die();
+}
+
+if ($details = Get::num('details')) {
+ $details = " AND h.history_id = $details";
+} else {
+ $details = null;
+}
+
+$sql = get_events($task_id, $details);
+$histories = $db->fetchAllArray($sql);
+
+$page = new FSTpl;
+$page->setTheme($proj->prefs['theme_style']);
+$page->uses('histories', 'details');
+if ($details) {
+ event_description($histories[0]); // modifies global variables
+ $page->assign('details_previous', $GLOBALS['details_previous']);
+ $page->assign('details_new', $GLOBALS['details_new']);
+}
+$page->display('details.tabs.history.callback.tpl');
+
+?>
diff --git a/js/callbacks/getpreview.php b/js/callbacks/getpreview.php
new file mode 100644
index 0000000..94d973a
--- /dev/null
+++ b/js/callbacks/getpreview.php
@@ -0,0 +1,21 @@
+<?php
+define('IN_FS', true);
+
+header('Content-type: text/html; charset=utf-8');
+
+$webdir = dirname(dirname(dirname(htmlspecialchars($_SERVER['PHP_SELF'], ENT_QUOTES, 'utf-8'))));
+require_once('../../header.php');
+
+if (Cookie::has('flyspray_userid') && Cookie::has('flyspray_passhash')) {
+ $user = new User(Cookie::val('flyspray_userid'));
+ $user->check_account_ok();
+} else {
+ $user = new User(0, $proj);
+}
+
+# TODO csrftoken checking
+
+
+echo TextFormatter::render(Post::val('text'));
+
+?>
diff --git a/js/callbacks/getsearches.php b/js/callbacks/getsearches.php
new file mode 100644
index 0000000..215d2d8
--- /dev/null
+++ b/js/callbacks/getsearches.php
@@ -0,0 +1,30 @@
+<?php
+/*
+ This script gets the searches of current user and
+ returns it for HTML display in a page.
+*/
+
+define('IN_FS', true);
+
+header('Content-type: text/html; charset=utf-8');
+
+require_once('../../header.php');
+
+// Initialise user
+if (Cookie::has('flyspray_userid') && Cookie::has('flyspray_passhash')) {
+ $user = new User(Cookie::val('flyspray_userid'));
+ $user->check_account_ok();
+} else {
+ $user = new User(0, $proj);
+}
+
+// don't allow anonymous users to access this page at all
+if ($user->isAnon()) {
+ die();
+}
+
+$user->save_search(); # currently used for loading user searches from db into user object ...
+$page = new FSTpl;
+$page->setTheme($proj->prefs['theme_style']);
+$page->display('links.searches.tpl');
+?>
diff --git a/js/callbacks/quickedit.php b/js/callbacks/quickedit.php
new file mode 100644
index 0000000..fda26ea
--- /dev/null
+++ b/js/callbacks/quickedit.php
@@ -0,0 +1,170 @@
+<?php
+
+define('IN_FS', true);
+
+header('Content-type: text/html; charset=utf-8');
+
+require_once('../../header.php');
+global $proj, $fs;
+
+if (Cookie::has('flyspray_userid') && Cookie::has('flyspray_passhash')) {
+ $user = new User(Cookie::val('flyspray_userid'));
+ $user->check_account_ok();
+} else {
+ $user = new User(0, $proj);
+}
+
+// don't allow anonymous users to access this page at all
+if ($user->isAnon()) {
+ die();
+}
+load_translations();
+
+if( !Post::has('csrftoken') ){
+ http_response_code(428); # 'Precondition Required'
+ die('missingtoken');
+} elseif( Post::val('csrftoken')==$_SESSION['csrftoken']){
+ # ok
+} else{
+ http_response_code(412); # 'Precondition Failed'
+ die('wrongtoken');
+}
+
+$task = Flyspray::getTaskDetails(Post::val('task_id'));
+if (!$user->can_edit_task($task)){
+ http_response_code(403); # 'Forbidden'
+ die(L('nopermission'));
+}
+
+# check field for update against allowed dbfields for quickedit.
+# maybe FUTURE: add (dynamic read from database) allowed CUSTOM FIELDS checks for the project and user
+# (if there is urgent request for implementing custom fields into Flyspray
+# and using of tag-feature isn't enough to accomplish - like numbers/dates/timestamps as custom fields)
+$allowedFields=array(
+ 'due_date',
+ 'item_status',
+ 'percent_complete',
+ 'task_type',
+ 'product_category',
+ 'operating_system',
+ 'task_severity',
+ 'task_priority',
+ 'product_version',
+ 'closedby_version'
+);
+if ($proj->prefs['use_effort_tracking'] && $user->perms('track_effort')){
+ $allowedFields[]='estimated_effort';
+}
+
+if (!in_array(Post::val('name'), $allowedFields)){
+ http_response_code(403);
+ die(L('invalidfield'));
+}
+
+$value = Post::val('value');
+
+# check if user is not sending manipulated invalid values
+switch(Post::val('name')){
+ case 'due_date':
+ $value = Flyspray::strtotime(Post::val('value'));
+ $value = intval($value);
+ break;
+
+ case 'estimated_effort':
+ $value = effort::editStringToSeconds(Post::val('value'), $proj->prefs['hours_per_manday'], $proj->prefs['estimated_effort_format']);
+ $value = intval($value);
+ break;
+
+ case 'task_severity':
+ if(!preg_match("/^[1-5]$/", $value)){
+ http_response_code(403);
+ die(L('invalidvalue'));
+ }
+ break;
+
+ case 'task_priority':
+ if(!preg_match("/^[1-6]$/", $value)){
+ http_response_code(403);
+ die(L('invalidvalue'));
+ }
+ break;
+
+ case 'percent_complete':
+ if(!is_numeric($value) || $value<0 || $value>100){
+ http_response_code(403);
+ die(L('invalidvalue'));
+ }
+ break;
+
+ case 'item_status':
+ $res=$db->query('SELECT * FROM {list_status} WHERE (project_id=0 OR project_id=?) AND show_in_list=1 AND status_id=?', array($task['project_id'], $value) );
+ if($db->countRows($res)<1){
+ http_response_code(403);
+ die(L('invalidvalue'));
+ }
+ break;
+
+ case 'task_type':
+ $res=$db->query('SELECT * FROM {list_tasktype} WHERE (project_id=0 OR project_id=?) AND show_in_list=1 AND tasktype_id=?', array($task['project_id'], $value) );
+ if($db->countRows($res)<1){
+ http_response_code(403);
+ die(L('invalidvalue'));
+ }
+ break;
+
+ case 'operating_system':
+ $res=$db->query('SELECT * FROM {list_os} WHERE (project_id=0 OR project_id=?) AND show_in_list=1 AND os_id=?', array($task['project_id'], $value) );
+ if($db->countRows($res)<1){
+ http_response_code(403);
+ die(L('invalidvalue'));
+ }
+ break;
+
+ case 'product_category':
+ $res=$db->query('SELECT * FROM {list_category} WHERE (project_id=0 OR project_id=?) AND show_in_list=1 AND category_id=?', array($task['project_id'], $value) );
+ if($db->countRows($res)<1){
+ http_response_code(403);
+ die(L('invalidvalue'));
+ }
+ break;
+
+ case 'product_version':
+ $res=$db->query('SELECT * FROM {list_version} WHERE (project_id=0 OR project_id=?) AND show_in_list=1 AND version_id=? AND version_tense=2', array($task['project_id'], $value) );
+ if($db->countRows($res)<1){
+ http_response_code(403);
+ die(L('invalidvalue'));
+ }
+ break;
+ case 'closedby_version':
+ $res=$db->query('SELECT * FROM {list_version} WHERE (project_id=0 OR project_id=?) AND show_in_list=1 AND version_id=? AND version_tense=3', array($task['project_id'], $value) );
+ if($db->countRows($res)<1){
+ http_response_code(403);
+ die(L('invalidvalue'));
+ }
+ break;
+ default:
+ http_response_code(403);
+ die(L('invalidfield'));
+ break;
+}
+
+$oldvalue = $task[Post::val('name')];
+
+$time=time();
+$sql = $db->query("UPDATE {tasks} SET ".Post::val('name')." = ?,last_edited_time = ? WHERE task_id = ?", array($value, $time, Post::val('task_id')));
+
+# load $proj again of task with correct project_id for getting active notification types in notification class
+$proj= new Project($task['project_id']);
+
+// Log the changed field in task history
+Flyspray::logEvent($task['task_id'], 3, $value, $oldvalue, Post::val('name'), $time);
+
+// Get the details of the task we just updated to generate the changed-task message
+$new_details_full = Flyspray::getTaskDetails($task['task_id']);
+$changes = Flyspray::compare_tasks($task, $new_details_full);
+if (count($changes) > 0) {
+ $notify = new Notifications;
+ $notify->create(NOTIFY_TASK_CHANGED, $task['task_id'], $changes, null, NOTIFY_BOTH, $proj->prefs['lang_code']);
+}
+
+?>
diff --git a/js/callbacks/savesearches.php b/js/callbacks/savesearches.php
new file mode 100644
index 0000000..e656a0a
--- /dev/null
+++ b/js/callbacks/savesearches.php
@@ -0,0 +1,27 @@
+<?php
+/**
+ * This script is the AJAX callback that saves a user's search
+ */
+
+define('IN_FS', true);
+
+require_once('../../header.php');
+
+if (Cookie::has('flyspray_userid') && Cookie::has('flyspray_passhash')) {
+ $user = new User(Cookie::val('flyspray_userid'));
+ $user->check_account_ok();
+
+ if( !Post::has('csrftoken') ){
+ http_response_code(428); # 'Precondition Required'
+ die('missingtoken');
+ }elseif( Post::val('csrftoken')==$_SESSION['csrftoken']){
+ # empty
+ }else{
+ http_response_code(412); # 'Precondition Failed'
+ die('wrongtoken');
+ }
+
+ $user->save_search();
+}
+
+?>
diff --git a/js/callbacks/searchnames.php b/js/callbacks/searchnames.php
new file mode 100644
index 0000000..f696955
--- /dev/null
+++ b/js/callbacks/searchnames.php
@@ -0,0 +1,55 @@
+<?php
+
+/**
+ * This script is the AJAX callback that performs a search
+ * for users, and returns true if the user_name is not given.
+ */
+
+define('IN_FS', true);
+
+header('Content-type: text/html; charset=utf-8');
+
+require_once('../../header.php');
+
+
+if (Cookie::has('flyspray_userid') && Cookie::has('flyspray_passhash')) {
+ $user = new User(Cookie::val('flyspray_userid'));
+ $user->check_account_ok();
+} else {
+ $user = new User(0, $proj);
+}
+
+if ($user->isAnon()) {
+ # at least allow for guests when user registration is enabled, fix FS#2528
+ if( !($user->can_register() or $user->can_self_register()) ){
+ die();
+ }
+}
+
+if (Req::has('name')) {
+ $searchterm = strtolower(Req::val('name'));
+} else {
+ die();
+}
+
+// Get the list of users from the global groups above
+$get_users = $db->query('
+ SELECT count(u.user_name) AS anz_u_user, count(r.user_name) AS anz_r_user
+ FROM {users} u
+ LEFT JOIN {registrations} r ON u.user_name = r.user_name
+ WHERE LOWER(u.user_name) = ? OR LOWER(r.user_name) = ?',
+ array($searchterm, $searchterm)
+);
+
+load_translations();
+
+while ($row = $db->fetchRow($get_users)){
+ if ($row['anz_u_user'] > '0' || $row['anz_r_user'] > '0') {
+ $html = 'false|' . eL('usernametaken');
+ } else {
+ $html = 'true';
+ }
+}
+
+echo $html;
+?>
diff --git a/js/callbacks/searchtask.php b/js/callbacks/searchtask.php
new file mode 100644
index 0000000..47b0241
--- /dev/null
+++ b/js/callbacks/searchtask.php
@@ -0,0 +1,43 @@
+<?php
+define('IN_FS', true);
+require_once('../../header.php');
+
+
+// Require inputs
+if(!Post::has('detail') || !Post::has('summary') || !Post::has('project_id'))
+{
+ return;
+}
+
+
+// Load user profile
+if (Cookie::has('flyspray_userid') && Cookie::has('flyspray_passhash')){
+ $user = new User(Cookie::val('flyspray_userid'));
+ $user->check_account_ok();
+} else {
+ $user = new User(0, $proj);
+}
+
+// Require right to open a task on current project
+if(!$user->can_open_task($proj)){
+ return;
+}
+
+
+// Prepare SQL params
+$params = array(
+ 'project_id' => Post::num('project_id'),
+ 'summary' => "%" . trim(Post::val('summary')) . "%",
+ 'details' => "%" . trim(Post::val('detail')) . "%"
+);
+
+$sql = $db->query('SELECT count(*)
+ FROM {tasks} t
+ WHERE t.project_id = ?
+ AND t.item_summary like ?
+ AND t.detailed_desc like ?',
+ $params);
+$sametask = $db->fetchOne($sql);
+echo $sametask;
+
+?>
diff --git a/js/callbacks/testemail.php b/js/callbacks/testemail.php
new file mode 100644
index 0000000..788a12f
--- /dev/null
+++ b/js/callbacks/testemail.php
@@ -0,0 +1,44 @@
+<?php
+
+define('IN_FS', true);
+
+header('Content-type: text/html; charset=utf-8');
+
+require_once('../../header.php');
+global $proj, $fs;
+
+if (Cookie::has('flyspray_userid') && Cookie::has('flyspray_passhash')) {
+ $user = new User(Cookie::val('flyspray_userid'));
+ $user->check_account_ok();
+} else {
+ $user = new User(0, $proj);
+}
+
+// don't allow anonymous users to access this page at all
+if ($user->isAnon()) {
+ die(L('nopermission'));
+}
+load_translations();
+
+if( !Post::has('csrftoken') ){
+ http_response_code(428); # 'Precondition Required'
+ die('missingtoken');
+}elseif( Post::val('csrftoken')==$_SESSION['csrftoken']){
+ # empty
+}else{
+ http_response_code(412); # 'Precondition Failed'
+ die('wrongtoken');
+}
+if (!$user->perms('is_admin')){
+ http_response_code(403); # 'Forbidden'
+ die(L('nopermission'));
+}
+
+$notify = new Notifications;
+$result=$notify->sendEmail($user->infos['email_address'],'test','testcontent',1);
+
+if($result !=1){
+ http_response_code(406); # 'Not Acceptable'
+}
+echo 'ok';
+?>
diff --git a/js/callbacks/usersearch.php b/js/callbacks/usersearch.php
new file mode 100644
index 0000000..a17833d
--- /dev/null
+++ b/js/callbacks/usersearch.php
@@ -0,0 +1,45 @@
+<?php
+/*
+ This script is the AJAX callback that performs a search
+ for users, and returns them in an ordered list.
+*/
+
+define('IN_FS', true);
+header('Content-type: text/html; charset=utf-8');
+require_once('../../header.php');
+
+if (Cookie::has('flyspray_userid') && Cookie::has('flyspray_passhash')) {
+ $user = new User(Cookie::val('flyspray_userid'));
+ $user->check_account_ok();
+} else {
+ $user = new User(0, $proj);
+}
+
+// don't allow anonymous users to access this page at all
+if ($user->isAnon()) {
+ die();
+}
+$first = reset($_POST);
+if (is_array($first)) {
+ $first = reset($first);
+}
+$searchterm = '%' . $first . '%';
+
+// Get the list of users from the global groups above
+$get_users = $db->query('SELECT real_name, user_name, profile_image
+ FROM {users} u
+ WHERE u.user_name LIKE ? OR u.real_name LIKE ?',
+ array($searchterm, $searchterm), 20);
+
+$html = '<ul class="autocomplete">';
+
+while ($row = $db->fetchRow($get_users)) {
+ $data = array_map(array('Filters','noXSS'), $row);
+ $html .= '<li title="' . $data['real_name'] . '">'.($data['profile_image']!='' ? '<img src="avatars/'.$data['profile_image'].'" />' : '<span class="noavatar"></span>' ). $data['user_name'] . '<span class="informal"> ' . $data['real_name'] . '</span></li>';
+}
+
+$html .= '</ul>';
+
+echo $html;
+
+?>
diff --git a/js/ckeditor/CHANGES.md b/js/ckeditor/CHANGES.md
new file mode 100644
index 0000000..8b8ff47
--- /dev/null
+++ b/js/ckeditor/CHANGES.md
@@ -0,0 +1,720 @@
+CKEditor 4 Changelog
+====================
+
+## CKEditor 4.4.7
+
+Fixed Issues:
+
+* [#12825](http://dev.ckeditor.com/ticket/12825): Fixed: Preventing the [Table Resize](http://ckeditor.com/addon/tableresize) plugin from operating on elements outside the editor. Thanks to [Paul Martin](https://github.com/Paul-Martin)!
+* [#12157](http://dev.ckeditor.com/ticket/12157): Fixed: Lost text formatting on pressing *Tab* when the [`config.tabSpaces`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-tabSpaces) configuration option value was greater than zero.
+* [#12777](http://dev.ckeditor.com/ticket/12777): Fixed: The `table-layout` CSS property should be reset by skins. Thanks to [vita10gy](https://github.com/vita10gy)!
+* [#12812](http://dev.ckeditor.com/ticket/12812): Fixed: An uncaught security exception is thrown when [Line Utilities](http://ckeditor.com/addon/lineutils) are used in an inline editor loaded in a cross-domain `iframe`. Thanks to [Vitaliy Zurian](https://github.com/thecatontheflat)!
+* [#12735](http://dev.ckeditor.com/ticket/12735): Fixed: [`config.fillEmptyBlocks`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-fillEmptyBlocks) should only apply when outputting data.
+* [#10032](http://dev.ckeditor.com/ticket/10032): Fixed: [Paste from Word](http://ckeditor.com/addon/pastefromword) filter is executed for every paste after using the button.
+* [#12597](http://dev.ckeditor.com/ticket/12597): [Blink/Webkit] Fixed: Multi-byte Japanese characters entry not working properly after *Shift+Enter*.
+* [#12387](http://dev.ckeditor.com/ticket/12387): Fixed: An error is thrown if a skin does not have the [`chameleon`](http://docs.ckeditor.com/#!/api/CKEDITOR.skin-method-chameleon) property defined and [`config.uiColor`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-uiColor) is defined.
+* [#12747](http://dev.ckeditor.com/ticket/12747): [IE8-10] Fixed: Opening a drop-down for a specific selection when the editor is maximized results in incorrect drop-down panel position.
+* [#12850](http://dev.ckeditor.com/ticket/12850): [IEQM] Fixed: An error is thrown after focusing the editor.
+
+## CKEditor 4.4.6
+
+**Security Updates:**
+
+* Fixed XSS vulnerability in the HTML parser reported by [Maco Cortes](https://www.facebook.com/Maaacoooo).
+
+ Issue summary: It was possible to execute XSS inside CKEditor after persuading the victim to: (i) switch CKEditor to source mode, then (ii) paste a specially crafted HTML code, prepared by the attacker, into the opened CKEditor source area, and (iii) switch back to WYSIWYG mode.
+
+**An upgrade is highly recommended!**
+
+New Features:
+
+* [#12501](http://dev.ckeditor.com/ticket/12501): Allowed dashes in element names in the [string format of allowed content rules](http://docs.ckeditor.com/#!/guide/dev_allowed_content_rules-section-string-format).
+* [#12550](http://dev.ckeditor.com/ticket/12550): Added the `<main>` element to the [`CKEDITOR.dtd`](http://docs.ckeditor.com/#!/api/CKEDITOR.dtd).
+
+Fixed Issues:
+
+* [#12506](http://dev.ckeditor.com/ticket/12506): [Safari] Fixed: Cannot paste into inline editor if the page has `user-select: none` style. Thanks to [shaohua](https://github.com/shaohua)!
+* [#12683](http://dev.ckeditor.com/ticket/12683): Fixed: [Filter](http://docs.ckeditor.com/#!/guide/dev_acf) fails to remove custom tags. Thanks to [timselier](https://github.com/timselier)!
+* [#12489](http://dev.ckeditor.com/ticket/12489) and [#12491](http://dev.ckeditor.com/ticket/12491): Fixed: Various issues related to restoring the selection after performing operations on filler character. See the [fixed cases](http://dev.ckeditor.com/ticket/12491#comment:4).
+* [#12621](http://dev.ckeditor.com/ticket/12621): Fixed: Cannot remove inline styles (bold, italic, etc.) in empty lines.
+* [#12630](http://dev.ckeditor.com/ticket/12630): [Chrome] Fixed: Selection is placed outside the paragraph when the [New Page](http://ckeditor.com/addon/newpage) button is clicked. This patch significantly simplified the way how the initial selection (a selection after the content of the editable is overwritten) is being fixed. That might have fixed many related scenarios in all browsers.
+* [#11647](http://dev.ckeditor.com/ticket/11647): Fixed: The [`editor.blur`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-blur) event is not fired on first blur after initializing the inline editor on an already focused element.
+* [#12601](http://dev.ckeditor.com/ticket/12601): Fixed: [Strikethrough](http://ckeditor.com/addon/basicstyles) button tooltip spelling.
+* [#12546](http://dev.ckeditor.com/ticket/12546): Fixed: The Preview tab in the [Document Properties](http://ckeditor.com/addon/docprops) dialog window is always disabled.
+* [#12300](http://dev.ckeditor.com/ticket/12300): Fixed: The [`editor.change`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-change) event fired on first navigation key press after typing.
+* [#12141](http://dev.ckeditor.com/ticket/12141): Fixed: List items are lost when indenting a list item with content wrapped with a block element.
+* [#12515](http://dev.ckeditor.com/ticket/12515): Fixed: Cursor is in the wrong position when undoing after adding an image and typing some text.
+* [#12484](http://dev.ckeditor.com/ticket/12484): [Blink/Webkit] Fixed: DOM is changed outside the editor area in a certain case.
+* [#12688](http://dev.ckeditor.com/ticket/12688): Improved the tests of the [styles system](http://docs.ckeditor.com/#!/api/CKEDITOR.style) and fixed two minor issues.
+* [#12403](http://dev.ckeditor.com/ticket/12403): Fixed: Changing the [font](http://ckeditor.com/addon/font) style should not lead to nesting it in the previous style element.
+* [#12609](http://dev.ckeditor.com/ticket/12609): Fixed: Incorrect `config.magicline_putEverywhere` name used for a [Magic Line](http://ckeditor.com/addon/magicline) all-encompassing [`config.magicline_everywhere`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-magicline_everywhere) configuration option.
+
+
+## CKEditor 4.4.5
+
+New Features:
+
+* [#12279](http://dev.ckeditor.com/ticket/12279): Added a possibility to pass a custom evaluator to [`node.getAscendant()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.node-method-getAscendant).
+
+Fixed Issues:
+
+* [#12423](http://dev.ckeditor.com/ticket/12423): [Safari7.1+] Fixed: *Enter* key moved cursor to a strange position.
+* [#12381](http://dev.ckeditor.com/ticket/12381): [iOS] Fixed: Selection issue. Thanks to [Remiremi](https://github.com/Remiremi)!
+* [#10804](http://dev.ckeditor.com/ticket/10804): Fixed: `CKEDITOR_GETURL` is not used with some plugins where it should be used. Thanks to [Thomas Andraschko](https://github.com/tandraschko)!
+* [#9137](http://dev.ckeditor.com/ticket/9137): Fixed: The `<base>` tag is not created when `<head>` has an attribute. Thanks to [naoki.fujikawa](https://github.com/naoki-fujikawa)!
+* [#12377](http://dev.ckeditor.com/ticket/12377): Fixed: Errors thrown in the [Image](http://ckeditor.com/addon/image) plugin when removing preview from the dialog window definition. Thanks to [Axinet](https://github.com/Axinet)!
+* [#12162](http://dev.ckeditor.com/ticket/12162): Fixed: Auto paragraphing and *Enter* key in nested editables.
+* [#12315](http://dev.ckeditor.com/ticket/12315): Fixed: Marked [`config.autoParagraph`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-autoParagraph) as deprecated.
+* [#12113](http://dev.ckeditor.com/ticket/12113): Fixed: A [code snippet](http://ckeditor.com/addon/codesnippet) should be presented in the [elements path](http://ckeditor.com/addon/elementspath) as "code snippet" (translatable).
+* [#12311](http://dev.ckeditor.com/ticket/12311): Fixed: [Remove Format](http://ckeditor.com/addon/removeformat) should also remove `<cite>` elements.
+* [#12261](http://dev.ckeditor.com/ticket/12261): Fixed: Filter has to be destroyed and removed from [`CKEDITOR.filter.instances`](http://docs.ckeditor.com/#!/api/CKEDITOR.filter-static-property-instances) on editor destroy.
+* [#12398](http://dev.ckeditor.com/ticket/12398): Fixed: [Maximize](http://ckeditor.com/addon/maximize) does not work on an instance without a [title](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-title).
+* [#12097](http://dev.ckeditor.com/ticket/12097): Fixed: JAWS not reading the number of options correctly in the [Text Color and Background Color](http://ckeditor.com/addon/colorbutton) button menu.
+* [#12411](http://dev.ckeditor.com/ticket/12411): Fixed: [Page Break](http://ckeditor.com/addon/pagebreak) used directly in the editable breaks the editor.
+* [#12354](http://dev.ckeditor.com/ticket/12354): Fixed: Various issues in undo manager when holding keys.
+* [#12324](http://dev.ckeditor.com/ticket/12324): [IE8] Fixed: Undo steps are not recorded when changing the caret position by clicking below the body.
+* [#12332](http://dev.ckeditor.com/ticket/12332): Fixed: Lowered DOM events listeners' priorities in undo manager in order to avoid ambiguity.
+* [#12402](http://dev.ckeditor.com/ticket/12402): [Blink] Fixed: Workaround for Blink bug with `document.title` which breaks updating title in the full HTML mode.
+* [#12338](http://dev.ckeditor.com/ticket/12338): Fixed: The CKEditor package contains unoptimized images.
+
+
+## CKEditor 4.4.4
+
+Fixed Issues:
+
+* [#12268](http://dev.ckeditor.com/ticket/12268): Cleanup of [UI Color](http://ckeditor.com/addon/uicolor) YUI styles. Thanks to [CasherWest](https://github.com/CasherWest)!
+* [#12263](http://dev.ckeditor.com/ticket/12263): Fixed: [Paste from Word](http://ckeditor.com/addon/pastefromword) filter does not properly normalize semicolons style text. Thanks to [Alin Purcaru](https://github.com/mesmerizero)!
+* [#12243](http://dev.ckeditor.com/ticket/12243): Fixed: Text formatting lost when pasting from Word. Thanks to [Alin Purcaru](https://github.com/mesmerizero)!
+* [#111739](http://dev.ckeditor.com/ticket/11739): Fixed: `keypress` listeners should not be used in the undo manager. A complete rewrite of keyboard handling in the undo manager was made. Numerous smaller issues were fixed, among others:
+ * [#10926](http://dev.ckeditor.com/ticket/10926): [Chrome@Android] Fixed: Typing does not record snapshots and does not fire the [`editor.change`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-change) event.
+ * [#11611](http://dev.ckeditor.com/ticket/11611): [Firefox] Fixed: The [`editor.change`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-change) event is fired when pressing Arrow keys.
+ * [#12219](http://dev.ckeditor.com/ticket/12219): [Safari] Fixed: Some modifications of the [`UndoManager.locked`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.undo.UndoManager-property-locked) property violate strict mode in the [Undo](http://ckeditor.com/addon/undo) plugin.
+* [#10916](http://dev.ckeditor.com/ticket/10916): Fixed: [Magic Line](http://ckeditor.com/addon/magicline) icon in Right-To-Left environments.
+* [#11970](http://dev.ckeditor.com/ticket/11970): [IE] Fixed: CKEditor `paste` event is not fired when pasting with *Shift+Ins*.
+* [#12111](http://dev.ckeditor.com/ticket/12111): Fixed: Linked image attributes are not read when opening the image dialog window by doubleclicking.
+* [#10030](http://dev.ckeditor.com/ticket/10030): [IE] Fixed: Prevented "Unspecified Error" thrown in various cases when IE8-9 does not allow access to `document.activeElement`.
+* [#12273](http://dev.ckeditor.com/ticket/12273): Fixed: Applying block style in a description list breaks it.
+* [#12218](http://dev.ckeditor.com/ticket/12218): Fixed: Minor syntax issue in CSS files.
+* [#12178](http://dev.ckeditor.com/ticket/12178): [Blink/WebKit] Fixed: Iterator does not return the block if the selection is located at the end of it.
+* [#12185](http://dev.ckeditor.com/ticket/12185): [IE9QM] Fixed: Error thrown when moving the mouse over focused editor's scrollbar.
+* [#12215](http://dev.ckeditor.com/ticket/12215): Fixed: Basepath resolution does not recognize semicolon as a query separator.
+* [#12135](http://dev.ckeditor.com/ticket/12135): Fixed: [Remove Format](http://ckeditor.com/addon/removeformat) does not work on widgets.
+* [#12298](http://dev.ckeditor.com/ticket/12298): [IE11] Fixed: Clicking below `<body>` in Compatibility Mode will no longer reset selection to the first line.
+* [#12204](http://dev.ckeditor.com/ticket/12204): Fixed: Editor's voice label is not affected by [`config.title`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-title).
+* [#11915](http://dev.ckeditor.com/ticket/11915): Fixed: With [SCAYT](http://ckeditor.com/addon/scayt) enabled, cursor moves to the beginning of the first highlighted, misspelled word after typing or pasting into the editor.
+* [SCAYT](https://github.com/WebSpellChecker/ckeditor-plugin-scayt/issues/69): Fixed: Error thrown in the console after enabling [SCAYT](http://ckeditor.com/addon/scayt) and trying to add a new image.
+
+
+Other Changes:
+
+* [#12296](http://dev.ckeditor.com/ticket/12296): Merged `benderjs-ckeditor` into the main CKEditor repository.
+
+## CKEditor 4.4.3
+
+**Security Updates:**
+
+* Fixed XSS vulnerability in the Preview plugin reported by Mario Heiderich of [Cure53](https://cure53.de/).
+
+**An upgrade is highly recommended!**
+
+New Features:
+
+* [#12164](http://dev.ckeditor.com/ticket/12164): Added the "Justify" option to the "Horizontal Alignment" drop-down in the Table Cell Properties dialog window.
+
+Fixed Issues:
+
+* [#12110](http://dev.ckeditor.com/ticket/12110): Fixed: Editor crash after deleting a table. Thanks to [Alin Purcaru](https://github.com/mesmerizero)!
+* [#11897](http://dev.ckeditor.com/ticket/11897): Fixed: *Enter* key used in an empty list item creates a new line instead of breaking the list. Thanks to [noam-si](https://github.com/noam-si)!
+* [#12140](http://dev.ckeditor.com/ticket/12140): Fixed: Double-clicking linked widgets opens two dialog windows.
+* [#12132](http://dev.ckeditor.com/ticket/12132): Fixed: Image is inserted with `width` and `height` styles even when they are not allowed.
+* [#9317](http://dev.ckeditor.com/ticket/9317): [IE] Fixed: [`config.disableObjectResizing`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-disableObjectResizing) does not work on IE. **Note**: We were not able to fix this issue on IE11+ because necessary events stopped working. See a [last resort workaround](http://dev.ckeditor.com/ticket/9317#comment:16) and make sure to [support our complaint to Microsoft](https://connect.microsoft.com/IE/feedback/details/742593/please-respect-execcommand-enableobjectresizing-in-contenteditable-elements).
+* [#9638](http://dev.ckeditor.com/ticket/9638): Fixed: There should be no information about accessibility help available under the *Alt+0* keyboard shortcut if the [Accessibility Help](http://ckeditor.com/addon/a11yhelp) plugin is not available.
+* [#8117](http://dev.ckeditor.com/ticket/8117) and [#9186](http://dev.ckeditor.com/ticket/9186): Fixed: In HTML5 `<meta>` tags should be allowed everywhere, including inside the `<body>` element.
+* [#10422](http://dev.ckeditor.com/ticket/10422): Fixed: [`config.fillEmptyBlocks`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-fillEmptyBlocks) not working properly if a function is specified.
+
+## CKEditor 4.4.2
+
+Important Notes:
+
+* The CKEditor testing environment is now publicly available. Read more about how to set up the environment and execute tests in the [CKEditor Testing Environment](http://docs.ckeditor.com/#!/guide/dev_tests) guide.
+ Please note that the [`tests/`](https://github.com/ckeditor/ckeditor-dev/tree/master/tests) directory which contains editor tests is not available in release packages. It can only be found in the development version of CKEditor on [GitHub](https://github.com/ckeditor/ckeditor-dev/).
+
+New Features:
+
+* [#11909](http://dev.ckeditor.com/ticket/11909): Introduced a parameter to prevent the [`editor.setData()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-setData) method from recording undo snapshots.
+
+Fixed Issues:
+
+* [#11757](http://dev.ckeditor.com/ticket/11757): Fixed: Imperfections in the [Moono](http://ckeditor.com/addon/moono) skin. Thanks to [danyaPostfactum](https://github.com/danyaPostfactum)!
+* [#10091](http://dev.ckeditor.com/ticket/10091): Blockquote should be treated like an object by the styles system. Thanks to [dan-james-deeson](https://github.com/dan-james-deeson)!
+* [#11478](http://dev.ckeditor.com/ticket/11478): Fixed: Issue with passing jQuery objects to [adapter](http://docs.ckeditor.com/#!/guide/dev_jquery) configuration.
+* [#10867](http://dev.ckeditor.com/ticket/10867): Fixed: Issue with setting encoded URI as image link.
+* [#11983](http://dev.ckeditor.com/ticket/11983): Fixed: Clicking a nested widget does not focus it. Additionally, performance of the [`widget.repository.getByElement()`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget.repository-method-getByElement) method was improved.
+* [#12000](http://dev.ckeditor.com/ticket/12000): Fixed: Nested widgets should be initialized on [`editor.setData()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-setData) and [`nestedEditable.setData()`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget.nestedEditable-method-setData).
+* [#12022](http://dev.ckeditor.com/ticket/12022): Fixed: Outer widget's drag handler is not created at all if it has any nested widgets inside.
+* [#11960](http://dev.ckeditor.com/ticket/11960): [Blink/WebKit] Fixed: The caret should be scrolled into view on *Backspace* and *Delete* (covers only the merging blocks case).
+* [#11306](http://dev.ckeditor.com/ticket/11306): [OSX][Blink/WebKit] Fixed: No widget entries in the context menu on widget right-click.
+* [#11957](http://dev.ckeditor.com/ticket/11957): Fixed: Alignment labels in the [Enhanced Image](http://ckeditor.com/addon/image2) dialog window are not translated.
+* [#11980](http://dev.ckeditor.com/ticket/11980): [Blink/WebKit] Fixed: `<span>` elements created when joining adjacent elements (non-collapsed selection).
+* [#12009](http://dev.ckeditor.com/ticket/12009): [Nested widgets] Integration with the [Magic Line](http://ckeditor.com/addon/magicline) plugin.
+* [#11387](http://dev.ckeditor.com/ticket/11387): Fixed: `role="radiogroup"` should be applied only to radio inputs' container.
+* [#7975](http://dev.ckeditor.com/ticket/7975): [IE8] Fixed: Errors when trying to select an empty table cell.
+* [#11947](http://dev.ckeditor.com/ticket/11947): [Firefox+IE11] Fixed: *Shift+Enter* in lists produces two line breaks.
+* [#11972](http://dev.ckeditor.com/ticket/11972): Fixed: Feature detection in the [`element.setText()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.element-method-setText) method should not trigger the layout engine.
+* [#7634](http://dev.ckeditor.com/ticket/7634): Fixed: The [Flash Dialog](http://ckeditor.com/addon/flash) plugin omits the `allowFullScreen` parameter in the editor data if set to `true`.
+* [#11910](http://dev.ckeditor.com/ticket/11910): Fixed: [Enhanced Image](http://ckeditor.com/addon/image2) does not take [`config.baseHref`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-baseHref) into account when updating image dimensions.
+* [#11753](http://dev.ckeditor.com/ticket/11753): Fixed: Wrong [`checkDirty()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-checkDirty) method value after focusing or blurring a widget.
+* [#11830](http://dev.ckeditor.com/ticket/11830): Fixed: Impossible to pass some arguments to [CKBuilder](https://github.com/ckeditor/ckbuilder) when using the `/dev/builder/build.sh` script.
+* [#11945](http://dev.ckeditor.com/ticket/11945): Fixed: [Form Elements](http://ckeditor.com/addon/forms) plugin should not change a core method.
+* [#11384](http://dev.ckeditor.com/ticket/11384): [IE9+] Fixed: `IndexSizeError` thrown when pasting into a non-empty selection anchored in one text node.
+
+## CKEditor 4.4.1
+
+New Features:
+
+* [#9661](http://dev.ckeditor.com/ticket/9661): Added the option to [configure](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-linkJavaScriptLinksAllowed) anchor tags with JavaScript code in the `href` attribute.
+
+Fixed Issues:
+
+* [#11861](http://dev.ckeditor.com/ticket/11861): [Webkit/Blink] Fixed: Span elements created while joining adjacent elements. **Note:** This patch only covers cases when *Backspace* or *Delete* is pressed on a collapsed (empty) selection. The remaining case, with a non-empty selection, will be fixed in the next release.
+* [#10714](http://dev.ckeditor.com/ticket/10714): [iOS] Fixed: Selection and drop-downs are broken if a touch event listener is used due to a [Webkit bug](https://bugs.webkit.org/show_bug.cgi?id=128924). Thanks to [Arty Gus](https://github.com/artygus)!
+* [#11911](http://dev.ckeditor.com/ticket/11911): Fixed setting the `dir` attribute for a preloaded language in [CKEDITOR.lang](http://docs.ckeditor.com/#!/api/CKEDITOR.lang). Thanks to [Akash Mohapatra](https://github.com/akashmohapatra)!
+* [#11926](http://dev.ckeditor.com/ticket/11926): Fixed: [Code Snippet](http://ckeditor.com/addon/codesnippet) does not decode HTML entities when loading code from the `<code>` element.
+* [#11223](http://dev.ckeditor.com/ticket/11223): Fixed: Issue when [Protected Source](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-protectedSource) was not working in the `<title>` element.
+* [#11859](http://dev.ckeditor.com/ticket/11859): Fixed: Removed the [Source Dialog](http://ckeditor.com/addon/sourcedialog) plugin dependency from the [Code Snippet](http://ckeditor.com/addon/codesnippet) sample.
+* [#11754](http://dev.ckeditor.com/ticket/11754): [Chrome] Fixed: Infinite loop when content includes not closed attributes.
+* [#11848](http://dev.ckeditor.com/ticket/11848): [IE] Fixed: [`editor.insertElement()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-insertElement) throwing an exception when there was no selection in the editor.
+* [#11801](http://dev.ckeditor.com/ticket/11801): Fixed: Editor anchors unavailable when linking the [Enhanced Image](http://ckeditor.com/addon/image2) widget.
+* [#11626](http://dev.ckeditor.com/ticket/11626): Fixed: [Table Resize](http://ckeditor.com/addon/tableresize) sets invalid column width.
+* [#11872](http://dev.ckeditor.com/ticket/11872): Made [`element.addClass()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.element-method-addClass) chainable symmetrically to [`element.removeClass()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.element-method-removeClass).
+* [#11813](http://dev.ckeditor.com/ticket/11813): Fixed: Link lost while pasting a captioned image and restoring an undo snapshot ([Enhanced Image](http://ckeditor.com/addon/image2)).
+* [#11814](http://dev.ckeditor.com/ticket/11814): Fixed: _Link_ and _Unlink_ entries persistently displayed in the [Enhanced Image](http://ckeditor.com/addon/image2) context menu.
+* [#11839](http://dev.ckeditor.com/ticket/11839): [IE9] Fixed: The caret jumps out of the editable area when resizing the editor in the source mode.
+* [#11822](http://dev.ckeditor.com/ticket/11822): [Webkit] Fixed: Editing anchors by double-click is broken in some cases.
+* [#11823](http://dev.ckeditor.com/ticket/11823): [IE8] Fixed: [Table Resize](http://ckeditor.com/addon/tableresize) throws an error over scrollbar.
+* [#11788](http://dev.ckeditor.com/ticket/11788): Fixed: It is not possible to change the language back to _Not set_ in the [Code Snippet](http://ckeditor.com/addon/codesnippet) dialog window.
+* [#11788](http://dev.ckeditor.com/ticket/11788): Fixed: [Filter](http://docs.ckeditor.com/#!/api/CKEDITOR.htmlParser.filter) rules are not applied inside elements with the `contenteditable` attribute set to `true`.
+* [#11798](http://dev.ckeditor.com/ticket/11798): Fixed: Inserting a non-editable element inside a table cell breaks the table.
+* [#11793](http://dev.ckeditor.com/ticket/11793): Fixed: Drop-down is not "on" when clicking it while the editor is blurred.
+* [#11850](http://dev.ckeditor.com/ticket/11850): Fixed: Fake objects with the `contenteditable` attribute set to `false` are not downcasted properly.
+* [#11811](http://dev.ckeditor.com/ticket/11811): Fixed: Widget's data is not encoded correctly when passed to an attribute.
+* [#11777](http://dev.ckeditor.com/ticket/11777): Fixed encoding ampersand in the [Mathematical Formulas](http://ckeditor.com/addon/mathjax) plugin.
+* [#11880](http://dev.ckeditor.com/ticket/11880): [IE8-9] Fixed: Linked image has a default thick border.
+
+Other Changes:
+
+* [#11807](http://dev.ckeditor.com/ticket/11807): Updated jQuery version used in the sample to 1.11.0 and tested CKEditor jQuery Adapter with version 1.11.0 and 2.1.0.
+* [#9504](http://dev.ckeditor.com/ticket/9504): Stopped using deprecated `attribute.specified` in all browsers except Internet Explorer.
+* [#11809](http://dev.ckeditor.com/ticket/11809): Changed tab size in `<pre>` to 4 spaces.
+
+## CKEditor 4.4
+
+**Important Notes:**
+
+* Marked the [`editor.beforePaste`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-beforePaste) event as deprecated.
+* The default class of captioned images has changed to `image` (was: `caption`). Please note that once edited in CKEditor 4.4+, all existing images of the `caption` class (`<figure class="caption">`) will be [filtered out](http://docs.ckeditor.com/#!/guide/dev_advanced_content_filter) unless the [`config.image2_captionedClass`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-image2_captionedClass) option is set to `caption`. For backward compatibility (i.e. when upgrading), it is highly recommended to use this setting, which also helps prevent CSS conflicts, etc. This does not apply to new CKEditor integrations.
+* Widgets without defined buttons are no longer registered automatically to the [Advanced Content Filter](http://docs.ckeditor.com/#!/guide/dev_advanced_content_filter). Before CKEditor 4.4 widgets were registered to the ACF which was an incorrect behavior ([#11567](http://dev.ckeditor.com/ticket/11567)). This change should not have any impact on standard scenarios, but if your button does not execute the widget command, you need to set [`allowedContent`](http://docs.ckeditor.com/#!/api/CKEDITOR.feature-property-allowedContent) and [`requiredContent`](http://docs.ckeditor.com/#!/api/CKEDITOR.feature-property-requiredContent) properties for it manually, because the editor will not be able to find them.
+* The [Show Borders](http://ckeditor.com/addon/showborders) plugin was added to the Standard installation package in order to ensure that unstyled tables are still visible for the user ([#11665](http://dev.ckeditor.com/ticket/11665)).
+* Since CKEditor 4.4 the editor instance should be passed to [`CKEDITOR.style`](http://docs.ckeditor.com/#!/api/CKEDITOR.style) methods to ensure full compatibility with other features (e.g. applying styles to widgets requires that). We ensured backward compatibility though, so the [`CKEDITOR.style`](http://docs.ckeditor.com/#!/api/CKEDITOR.style) will work even when the editor instance is not provided.
+
+New Features:
+
+* [#11297](http://dev.ckeditor.com/ticket/11297): Styles can now be applied to widgets. The definition of a style which can be applied to a specific widget must contain two additional properties &mdash; `type` and `widget`. Read more in the [Widget Styles](http://docs.ckeditor.com/#!/guide/dev_styles-section-widget-styles) section of the "Syles Drop-down" guide. Note that by default, widgets support only classes and no other attributes or styles. Related changes and features:
+ * Introduced the [`CKEDITOR.style.addCustomHandler()`](http://docs.ckeditor.com/#!/api/CKEDITOR.style-static-method-addCustomHandler) method for registering custom style handlers.
+ * The [`CKEDITOR.style.apply()`](http://docs.ckeditor.com/#!/api/CKEDITOR.style-method-apply) and [`CKEDITOR.style.remove()`](http://docs.ckeditor.com/#!/api/CKEDITOR.style-method-remove) methods are now called with an editor instance instead of the document so they can be reused by the [`CKEDITOR.editor.applyStyle()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-applyStyle) and [`CKEDITOR.editor.removeStyle()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-removeStyle) methods. Backward compatibility was preserved, but from CKEditor 4.4 it is highly recommended to pass an editor instead of a document to these methods.
+ * Many new methods and properties were introduced in the [Widget API](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget) to make the handling of styles by widgets fully customizable. See: [`widget.definition.styleableElements`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget.definition-property-styleableElements), [`widget.definition.styleToAllowedContentRule`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget.definition-property-styleToAllowedContentRules), [`widget.addClass()`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget-method-addClass), [`widget.removeClass()`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget-method-removeClass), [`widget.getClasses()`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget-method-getClasses), [`widget.hasClass()`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget-method-hasClass), [`widget.applyStyle()`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget-method-applyStyle), [`widget.removeStyle()`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget-method-removeStyle), [`widget.checkStyleActive()`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget-method-checkStyleActive).
+ * Integration with the [Allowed Content Filter](http://docs.ckeditor.com/#!/guide/dev_advanced_content_filter) required an introduction of the [`CKEDITOR.style.toAllowedContent()`](http://docs.ckeditor.com/#!/api/CKEDITOR.style-method-toAllowedContentRules) method which can be implemented by the custom style handler and if exists, it is used by the [`CKEDITOR.filter`](http://docs.ckeditor.com/#!/api/CKEDITOR.filter) to translate a style to [allowed content rules](http://docs.ckeditor.com/#!/api/CKEDITOR.filter.allowedContentRules).
+* [#11300](http://dev.ckeditor.com/ticket/11300): Various changes in the [Enhanced Image](http://ckeditor.com/addon/image2) plugin:
+ * Introduced the [`config.image2_captionedClass`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-image2_captionedClass) option to configure the class of captioned images.
+ * Introduced the [`config.image2_alignClasses`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-image2_alignClasses) option to configure the way images are aligned with CSS classes.
+ If this setting is defined, the editor produces classes instead of inline styles for aligned images.
+ * Default image caption can be translated (customized) with the `editor.lang.image2.captionPlaceholder` string.
+* [#11341](http://dev.ckeditor.com/ticket/11341): [Enhanced Image](http://ckeditor.com/addon/image2) plugin: It is now possible to add a link to any image type.
+* [#10202](http://dev.ckeditor.com/ticket/10202): Introduced wildcard support in the [Allowed Content Rules](http://docs.ckeditor.com/#!/guide/dev_allowed_content_rules) format.
+* [#10276](http://dev.ckeditor.com/ticket/10276): Introduced blacklisting in the [Allowed Content Filter](http://docs.ckeditor.com/#!/guide/dev_advanced_content_filter).
+* [#10480](http://dev.ckeditor.com/ticket/10480): Introduced code snippets with code highlighting. There are two versions available so far &mdash; the default [Code Snippet](http://ckeditor.com/addon/codesnippet) which uses the [highlight.js](http://highlightjs.org) library and the [Code Snippet GeSHi](http://ckeditor.com/addon/codesnippetgeshi) which uses the [GeSHi](http://qbnz.com/highlighter/) library.
+* [#11737](http://dev.ckeditor.com/ticket/11737): Introduced an option to prevent [filtering](http://docs.ckeditor.com/#!/guide/dev_advanced_content_filter) of an element that matches custom criteria (see [`filter.addElementCallback()`](http://docs.ckeditor.com/#!/api/CKEDITOR.filter-method-addElementCallback)).
+* [#11532](http://dev.ckeditor.com/ticket/11532): Introduced the [`editor.addContentsCss()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-addContentsCss) method that can be used for [adding custom CSS files](http://docs.ckeditor.com/#!/guide/plugin_sdk_styles).
+* [#11536](http://dev.ckeditor.com/ticket/11536): Added the [`CKEDITOR.tools.htmlDecode()`](http://docs.ckeditor.com/#!/api/CKEDITOR.tools-method-htmlDecode) method for decoding HTML entities.
+* [#11225](http://dev.ckeditor.com/ticket/11225): Introduced the [`CKEDITOR.tools.transparentImageData`](http://docs.ckeditor.com/#!/api/CKEDITOR.tools-property-transparentImageData) property which contains transparent image data to be used in CSS or as image source.
+
+Other Changes:
+
+* [#11377](http://dev.ckeditor.com/ticket/11377): Unified internal representation of empty anchors using the [fake objects](http://ckeditor.com/addon/fakeobjects).
+* [#11422](http://dev.ckeditor.com/ticket/11422): Removed Firefox 3.x, Internet Explorer 6 and Opera 12.x leftovers in code.
+* [#5217](http://dev.ckeditor.com/ticket/5217): Setting data (including switching between modes) creates a new undo snapshot. Besides that:
+ * Introduced the [`editable.status`](http://docs.ckeditor.com/#!/api/CKEDITOR.editable-property-status) property.
+ * Introduced a new `forceUpdate` option for the [`editor.lockSnapshot`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-lockSnapshot) event.
+ * Fixed: Selection not being unlocked in inline editor after setting data ([#11500](http://dev.ckeditor.com/ticket/11500)).
+* The [WebSpellChecker](http://ckeditor.com/addon/wsc) plugin was updated to the latest version.
+
+Fixed Issues:
+
+* [#10190](http://dev.ckeditor.com/ticket/10190): Fixed: Removing block style with [`editor.removeStyle()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-removeStyle) should result in a paragraph and not a div.
+* [#11727](http://dev.ckeditor.com/ticket/11727): Fixed: The editor tries to select a non-editable image which was clicked.
+
+## CKEditor 4.3.5
+
+New Features:
+
+* Added new translation: Tatar.
+
+Fixed Issues:
+
+* [#11677](http://dev.ckeditor.com/ticket/11677): Fixed: Undo/Redo keystrokes are blocked in the source mode.
+* [#11717](http://dev.ckeditor.com/ticket/11717): [Document Properties](http://ckeditor.com/addon/docprops) plugin requires the [Color Dialog](http://ckeditor.com/addon/colordialog) plugin to work.
+
+## CKEditor 4.3.4
+
+Fixed Issues:
+
+* [#11597](http://dev.ckeditor.com/ticket/11597): [IE11] Fixed: Error thrown when trying to open the [preview](http://ckeditor.com/addon/preview) using the keyboard.
+* [#11544](http://dev.ckeditor.com/ticket/11544): [Placeholders](http://ckeditor.com/addon/placeholder) will no longer be upcasted in parents not accepting `<span>` elements.
+* [#8663](http://dev.ckeditor.com/ticket/8663): Fixed [`element.renameNode()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.element-method-renameNode) not clearing the [`element.getName()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.element-method-getName) cache.
+* [#11574](http://dev.ckeditor.com/ticket/11574): Fixed: *Backspace* destroying the DOM structure if an inline editable is placed in a list item.
+* [#11603](http://dev.ckeditor.com/ticket/11603): Fixed: [Table Resize](http://ckeditor.com/addon/tableresize) attaches to tables outside the editable.
+* [#9205](http://dev.ckeditor.com/ticket/9205), [#7805](http://dev.ckeditor.com/ticket/7805), [#8216](http://dev.ckeditor.com/ticket/8216): Fixed: `{cke_protected_1}` appearing in data in various cases where HTML comments are placed next to `"` or `'`.
+* [#11635](http://dev.ckeditor.com/ticket/11635): Fixed: Some attributes are not protected before the content is passed through the fix bin.
+* [#11660](http://dev.ckeditor.com/ticket/11660): [IE] Fixed: Table content is lost when some extra markup is inside the table.
+* [#11641](http://dev.ckeditor.com/ticket/11641): Fixed: Switching between modes in the classic editor removes content styles for the inline editor.
+* [#11568](http://dev.ckeditor.com/ticket/11568): Fixed: [Styles](http://ckeditor.com/addon/stylescombo) drop-down list is not enabled on selection change.
+
+## CKEditor 4.3.3
+
+Fixed Issues:
+
+* [#11500](http://dev.ckeditor.com/ticket/11500): [Webkit/Blink] Fixed: Selection lost when setting data in another inline editor. Additionally, [`selection.removeAllRanges()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.selection-method-removeAllRanges) is now scoped to selection's [root](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.selection-property-root).
+* [#11104](http://dev.ckeditor.com/ticket/11104): [IE] Fixed: Various issues with scrolling and selection when focusing widgets.
+* [#11487](http://dev.ckeditor.com/ticket/11487): Moving mouse over the [Enhanced Image](http://ckeditor.com/addon/image2) widget will no longer change the value returned by the [`editor.checkDirty()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-checkDirty) method.
+* [#8673](http://dev.ckeditor.com/ticket/8673): [WebKit] Fixed: Cannot select and remove the [Page Break](http://ckeditor.com/addon/pagebreak).
+* [#11413](http://dev.ckeditor.com/ticket/11413): Fixed: Incorrect [`editor.execCommand()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-execCommand) behavior.
+* [#11438](http://dev.ckeditor.com/ticket/11438): Splitting table cells vertically is no longer changing table structure.
+* [#8899](http://dev.ckeditor.com/ticket/8899): Fixed: Links in the [About CKEditor](http://ckeditor.com/addon/about) dialog window now open in a new browser window or tab.
+* [#11490](http://dev.ckeditor.com/ticket/11490): Fixed: [Menu button](http://ckeditor.com/addon/menubutton) panel not showing in the source mode.
+* [#11417](http://dev.ckeditor.com/ticket/11417): The [`widget.doubleclick`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget-event-doubleclick) event is not canceled anymore after editing was triggered.
+* [#11253](http://dev.ckeditor.com/ticket/11253): [IE] Fixed: Clipped upload button in the [Enhanced Image](http://ckeditor.com/addon/image2) dialog window.
+* [#11359](http://dev.ckeditor.com/ticket/11359): Standardized the way anchors are discovered by the [Link](http://ckeditor.com/addon/link) plugin.
+* [#11058](http://dev.ckeditor.com/ticket/11058): [IE8] Fixed: Error when deleting a table row.
+* [#11508](http://dev.ckeditor.com/ticket/11508): Fixed: [`htmlDataProcessor`](http://docs.ckeditor.com/#!/api/CKEDITOR.htmlDataProcessor) discovering protected attributes within other attributes' values.
+* [#11533](http://dev.ckeditor.com/ticket/11533): Widgets: Avoid recurring upcasts if the DOM structure was modified during an upcast.
+* [#11400](http://dev.ckeditor.com/ticket/11400): Fixed: The [`domObject.removeAllListeners()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.domObject-method-removeAllListeners) method does not remove custom listeners completely.
+* [#11493](http://dev.ckeditor.com/ticket/11493): Fixed: The [`selection.getRanges()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.selection-method-getRanges) method does not override cached ranges when used with the `onlyEditables` argument.
+* [#11390](http://dev.ckeditor.com/ticket/11390): [IE] All [XML](http://ckeditor.com/addon/xml) plugin [methods](http://docs.ckeditor.com/#!/api/CKEDITOR.xml) now work in IE10+.
+* [#11542](http://dev.ckeditor.com/ticket/11542): [IE11] Fixed: Blurry toolbar icons when Right-to-Left UI language is set.
+* [#11504](http://dev.ckeditor.com/ticket/11504): Fixed: When [`config.fullPage`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-fullPage) is set to `true`, entities are not encoded in editor output.
+* [#11004](http://dev.ckeditor.com/ticket/11004): Integrated [Enhanced Image](http://ckeditor.com/addon/image2) dialog window with [Advanced Content Filter](http://docs.ckeditor.com/#!/guide/dev_advanced_content_filter).
+* [#11439](http://dev.ckeditor.com/ticket/11439): Fixed: Properties get cloned in the Cell Properties dialog window if multiple cells are selected.
+
+## CKEditor 4.3.2
+
+Fixed Issues:
+
+* [#11331](http://dev.ckeditor.com/ticket/11331): A menu button will have a changed label when selected instead of using the `aria-pressed` attribute.
+* [#11177](http://dev.ckeditor.com/ticket/11177): Widget drag handler improvements:
+ * [#11176](http://dev.ckeditor.com/ticket/11176): Fixed: Initial position is not updated when the widget data object is empty.
+ * [#11001](http://dev.ckeditor.com/ticket/11001): Fixed: Multiple synchronous layout recalculations are caused by initial drag handler positioning causing performance issues.
+ * [#11161](http://dev.ckeditor.com/ticket/11161): Fixed: Drag handler is not repositioned in various situations.
+ * [#11281](http://dev.ckeditor.com/ticket/11281): Fixed: Drag handler and mask are duplicated after widget reinitialization.
+* [#11207](http://dev.ckeditor.com/ticket/11207): [Firefox] Fixed: Misplaced [Enhanced Image](http://ckeditor.com/addon/image2) resizer in the inline editor.
+* [#11102](http://dev.ckeditor.com/ticket/11102): `CKEDITOR.template` improvements:
+ * [#11102](http://dev.ckeditor.com/ticket/11102): Added newline character support.
+ * [#11216](http://dev.ckeditor.com/ticket/11216): Added "\\'" substring support.
+* [#11121](http://dev.ckeditor.com/ticket/11121): [Firefox] Fixed: High Contrast mode is enabled when the editor is loaded in a hidden iframe.
+* [#11350](http://dev.ckeditor.com/ticket/11350): The default value of [`config.contentsCss`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-contentsCss) is affected by [`CKEDITOR.getUrl()`](http://docs.ckeditor.com/#!/api/CKEDITOR-method-getUrl).
+* [#11097](http://dev.ckeditor.com/ticket/11097): Improved the [Autogrow](http://ckeditor.com/addon/autogrow) plugin performance when dealing with very big tables.
+* [#11290](http://dev.ckeditor.com/ticket/11290): Removed redundant code in the [Source Dialog](http://ckeditor.com/addon/sourcedialog) plugin.
+* [#11133](http://dev.ckeditor.com/ticket/11133): [Page Break](http://ckeditor.com/addon/pagebreak) becomes editable if pasted.
+* [#11126](http://dev.ckeditor.com/ticket/11126): Fixed: Native Undo executed once the bottom of the snapshot stack is reached.
+* [#11131](http://dev.ckeditor.com/ticket/11131): [Div Editing Area](http://ckeditor.com/addon/divarea): Fixed: Error thrown when switching to source mode if the selection was in widget's nested editable.
+* [#11139](http://dev.ckeditor.com/ticket/11139): [Div Editing Area](http://ckeditor.com/addon/divarea): Fixed: Elements Path is not cleared after switching to source mode.
+* [#10778](http://dev.ckeditor.com/ticket/10778): Fixed a bug with range enlargement. The range no longer expands to visible whitespace.
+* [#11146](http://dev.ckeditor.com/ticket/11146): [IE] Fixed: Preview window switches Internet Explorer to Quirks Mode.
+* [#10762](http://dev.ckeditor.com/ticket/10762): [IE] Fixed: JavaScript code displayed in preview window's URL bar.
+* [#11186](http://dev.ckeditor.com/ticket/11186): Introduced the [`widgets.repository.addUpcastCallback()`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget.repository-method-addUpcastCallback) method that allows to block upcasting given element to a widget.
+* [#11307](http://dev.ckeditor.com/ticket/11307): Fixed: Paste as Plain Text conflict with the [MooTools](http://mootools.net) library.
+* [#11140](http://dev.ckeditor.com/ticket/11140): [IE11] Fixed: Anchors are not draggable.
+* [#11379](http://dev.ckeditor.com/ticket/11379): Changed default contents `line-height` to unitless values to avoid huge text overlapping (like in [#9696](http://dev.ckeditor.com/ticket/9696)).
+* [#10787](http://dev.ckeditor.com/ticket/10787): [Firefox] Fixed: Broken replacement of text while pasting into `div`-based editor.
+* [#10884](http://dev.ckeditor.com/ticket/10884): Widgets integration with the [Show Blocks](http://ckeditor.com/addon/showblocks) plugin.
+* [#11021](http://dev.ckeditor.com/ticket/11021): Fixed: An error thrown when selecting entire editable contents while fake selection is on.
+* [#11086](http://dev.ckeditor.com/ticket/11086): [IE8] Re-enable inline widgets drag&drop in Internet Explorer 8.
+* [#11372](http://dev.ckeditor.com/ticket/11372): Widgets: Special characters encoded twice in nested editables.
+* [#10068](http://dev.ckeditor.com/ticket/10068): Fixed: Support for protocol-relative URLs.
+* [#11283](http://dev.ckeditor.com/ticket/11283): [Enhanced Image](http://ckeditor.com/addon/image2): A `<div>` element with `text-align: center` and an image inside is not recognised correctly.
+* [#11196](http://dev.ckeditor.com/ticket/11196): [Accessibility Instructions](http://ckeditor.com/addon/a11yhelp): Allowed additional keyboard button labels to be translated in the dialog window.
+
+## CKEditor 4.3.1
+
+**Important Notes:**
+
+* To match the naming convention, the `language` button is now `Language` ([#11201](http://dev.ckeditor.com/ticket/11201)).
+* [Enhanced Image](http://ckeditor.com/addon/image2) button, context menu, command, and icon names match those of the [Image](http://ckeditor.com/addon/image) plugin ([#11222](http://dev.ckeditor.com/ticket/11222)).
+
+Fixed Issues:
+
+* [#11244](http://dev.ckeditor.com/ticket/11244): Changed: The [`widget.repository.checkWidgets()`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget.repository-method-checkWidgets) method now fires the [`widget.repository.checkWidgets`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget.repository-event-checkWidgets) event, so from CKEditor 4.3.1 it is preferred to use the method rather than fire the event.
+* [#11171](http://dev.ckeditor.com/ticket/11171): Fixed: [`editor.insertElement()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-insertElement) and [`editor.insertText()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-insertText) methods do not call the [`widget.repository.checkWidgets()`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget.repository-method-checkWidgets) method.
+* [#11085](http://dev.ckeditor.com/ticket/11085): [IE8] Replaced preview generated by the [Mathematical Formulas](http://ckeditor.com/addon/mathjax) widget with a placeholder.
+* [#11044](http://dev.ckeditor.com/ticket/11044): Enhanced WAI-ARIA support for the [Language](http://ckeditor.com/addon/language) plugin drop-down menu.
+* [#11075](http://dev.ckeditor.com/ticket/11075): With drop-down menu button focused, pressing the *Down Arrow* key will now open the menu and focus its first option.
+* [#11165](http://dev.ckeditor.com/ticket/11165): Fixed: The [File Browser](http://ckeditor.com/addon/filebrowser) plugin cannot be removed from the editor.
+* [#11159](http://dev.ckeditor.com/ticket/11159): [IE9-10] [Enhanced Image](http://ckeditor.com/addon/image2): Fixed buggy discovery of image dimensions.
+* [#11101](http://dev.ckeditor.com/ticket/11101): Drop-down lists no longer break when given double quotes.
+* [#11077](http://dev.ckeditor.com/ticket/11077): [Enhanced Image](http://ckeditor.com/addon/image2): Empty undo step recorded when resizing the image.
+* [#10853](http://dev.ckeditor.com/ticket/10853): [Enhanced Image](http://ckeditor.com/addon/image2): Widget has paragraph wrapper when de-captioning unaligned image.
+* [#11198](http://dev.ckeditor.com/ticket/11198): Widgets: Drag handler is not fully visible when an inline widget is in a heading.
+* [#11132](http://dev.ckeditor.com/ticket/11132): [Firefox] Fixed: Caret is lost after drag and drop of an inline widget.
+* [#11182](http://dev.ckeditor.com/ticket/11182): [IE10-11] Fixed: Editor crashes (IE11) or works with minor issues (IE10) if a page is loaded in Quirks Mode. See [`env.quirks`](http://docs.ckeditor.com/#!/api/CKEDITOR.env-property-quirks) for more details.
+* [#11204](http://dev.ckeditor.com/ticket/11204): Added `figure` and `figcaption` styles to the `contents.css` file so [Enhanced Image](http://ckeditor.com/addon/image2) looks nicer.
+* [#11202](http://dev.ckeditor.com/ticket/11202): Fixed: No newline in [BBCode](http://ckeditor.com/addon/bbcode) mode.
+* [#10890](http://dev.ckeditor.com/ticket/10890): Fixed: Error thrown when pressing the *Delete* key in a list item.
+* [#10055](http://dev.ckeditor.com/ticket/10055): [IE8-10] Fixed: *Delete* pressed on a selected image causes the browser to go back.
+* [#11183](http://dev.ckeditor.com/ticket/11183): Fixed: Inserting a horizontal rule or a table in multiple row selection causes a browser crash. Additionally, the [`editor.insertElement()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-insertElement) method does not insert the element into every range of a selection any more.
+* [#11042](http://dev.ckeditor.com/ticket/11042): Fixed: Selection made on an element containing a non-editable element was not auto faked.
+* [#11125](http://dev.ckeditor.com/ticket/11125): Fixed: Keyboard navigation through menu and drop-down items will now cycle.
+* [#11011](http://dev.ckeditor.com/ticket/11011): Fixed: The [`editor.applyStyle()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-applyStyle) method removes attributes from nested elements.
+* [#11179](http://dev.ckeditor.com/ticket/11179): Fixed: [`editor.destroy()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-destroy) does not cleanup content generated by the [Table Resize](http://ckeditor.com/addon/tableresize) plugin for inline editors.
+* [#11237](http://dev.ckeditor.com/ticket/11237): Fixed: Table border attribute value is deleted when pasting content from Microsoft Word.
+* [#11250](http://dev.ckeditor.com/ticket/11250): Fixed: HTML entities inside the `<textarea>` element are not encoded.
+* [#11260](http://dev.ckeditor.com/ticket/11260): Fixed: Initially disabled buttons are not read by JAWS as disabled.
+* [#11200](http://dev.ckeditor.com/ticket/11200): Added [Clipboard](http://ckeditor.com/addon/clipboard) plugin as a dependency for [Widget](http://ckeditor.com/addon/widget) to fix drag and drop.
+
+## CKEditor 4.3
+
+New Features:
+
+* [#10612](http://dev.ckeditor.com/ticket/10612): Internet Explorer 11 support.
+* [#10869](http://dev.ckeditor.com/ticket/10869): Widgets: Added better integration with the [Elements Path](http://ckeditor.com/addon/elementspath) plugin.
+* [#10886](http://dev.ckeditor.com/ticket/10886): Widgets: Added tooltip to the drag handle.
+* [#10933](http://dev.ckeditor.com/ticket/10933): Widgets: Introduced drag and drop of block widgets with the [Line Utilities](http://ckeditor.com/addon/lineutils) plugin.
+* [#10936](http://dev.ckeditor.com/ticket/10936): Widget System changes for easier integration with other dialog systems.
+* [#10895](http://dev.ckeditor.com/ticket/10895): [Enhanced Image](http://ckeditor.com/addon/image2): Added file browser integration.
+* [#11002](http://dev.ckeditor.com/ticket/11002): Added the [`draggable`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget.definition-property-draggable) option to disable drag and drop support for widgets.
+* [#10937](http://dev.ckeditor.com/ticket/10937): [Mathematical Formulas](http://ckeditor.com/addon/mathjax) widget improvements:
+ * loading indicator ([#10948](http://dev.ckeditor.com/ticket/10948)),
+ * applying paragraph changes (like font color change) to iframe ([#10841](http://dev.ckeditor.com/ticket/10841)),
+ * Firefox and IE9 clipboard fixes ([#10857](http://dev.ckeditor.com/ticket/10857)),
+ * fixing same origin policy issue ([#10840](http://dev.ckeditor.com/ticket/10840)),
+ * fixing undo bugs ([#10842](http://dev.ckeditor.com/ticket/10842), [#10930](http://dev.ckeditor.com/ticket/10930)),
+ * fixing other minor bugs.
+* [#10862](http://dev.ckeditor.com/ticket/10862): [Placeholder](http://ckeditor.com/addon/placeholder) plugin was rewritten as a widget.
+* [#10822](http://dev.ckeditor.com/ticket/10822): Added styles system integration with non-editable elements (for example widgets) and their nested editables. Styles cannot change non-editable content and are applied in nested editable only if allowed by its type and content filter.
+* [#10856](http://dev.ckeditor.com/ticket/10856): Menu buttons will now toggle the visibility of their panels when clicked multiple times. [Language](http://ckeditor.com/addon/language) plugin fixes: Added active language highlighting, added an option to remove the language.
+* [#10028](http://dev.ckeditor.com/ticket/10028): New [`config.dialog_noConfirmCancel`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-dialog_noConfirmCancel) configuration option that eliminates the need to confirm closing of a dialog window when the user changed any of its fields.
+* [#10848](http://dev.ckeditor.com/ticket/10848): Integrate remaining plugins ([Styles](http://ckeditor.com/addon/stylescombo), [Format](http://ckeditor.com/addon/format), [Font](http://ckeditor.com/addon/font), [Color Button](http://ckeditor.com/addon/colorbutton), [Language](http://ckeditor.com/addon/language) and [Indent](http://ckeditor.com/addon/indent)) with [active filter](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-property-activeFilter).
+* [#10855](http://dev.ckeditor.com/ticket/10855): Change the extension of emoticons in the [BBCode](http://ckeditor.com/addon/bbcode) sample from GIF to PNG.
+
+Fixed Issues:
+
+* [#10831](http://dev.ckeditor.com/ticket/10831): [Enhanced Image](http://ckeditor.com/addon/image2): Merged `image2inline` and `image2block` into one `image2` widget.
+* [#10835](http://dev.ckeditor.com/ticket/10835): [Enhanced Image](http://ckeditor.com/addon/image2): Improved visibility of the resize handle.
+* [#10836](http://dev.ckeditor.com/ticket/10836): [Enhanced Image](http://ckeditor.com/addon/image2): Preserve custom mouse cursor while resizing the image.
+* [#10939](http://dev.ckeditor.com/ticket/10939): [Firefox] [Enhanced Image](http://ckeditor.com/addon/image2): hovering the image causes it to change.
+* [#10866](http://dev.ckeditor.com/ticket/10866): Fixed: Broken *Tab* key navigation in the [Enhanced Image](http://ckeditor.com/addon/image2) dialog window.
+* [#10833](http://dev.ckeditor.com/ticket/10833): Fixed: *Lock ratio* option should be on by default in the [Enhanced Image](http://ckeditor.com/addon/image2) dialog window.
+* [#10881](http://dev.ckeditor.com/ticket/10881): Various improvements to *Enter* key behavior in nested editables.
+* [#10879](http://dev.ckeditor.com/ticket/10879): [Remove Format](http://ckeditor.com/addon/removeformat) should not leak from a nested editable.
+* [#10877](http://dev.ckeditor.com/ticket/10877): Fixed: [WebSpellChecker](http://ckeditor.com/addon/wsc) fails to apply changes if a nested editable was focused.
+* [#10877](http://dev.ckeditor.com/ticket/10877): Fixed: [SCAYT](http://ckeditor.com/addon/wsc) blocks typing in nested editables.
+* [#11079](http://dev.ckeditor.com/ticket/11079): Add button icons to the [Placeholder](http://ckeditor.com/addon/placeholder) sample.
+* [#10870](http://dev.ckeditor.com/ticket/10870): The `paste` command is no longer being disabled when the clipboard is empty.
+* [#10854](http://dev.ckeditor.com/ticket/10854): Fixed: Firefox prepends `<br>` to `<body>`, so it is stripped by the HTML data processor.
+* [#10823](http://dev.ckeditor.com/ticket/10823): Fixed: [Link](http://ckeditor.com/addon/link) plugin does not work with non-editable content.
+* [#10828](http://dev.ckeditor.com/ticket/10828): [Magic Line](http://ckeditor.com/addon/magicline) integration with the Widget System.
+* [#10865](http://dev.ckeditor.com/ticket/10865): Improved hiding copybin, so copying widgets works smoothly.
+* [#11066](http://dev.ckeditor.com/ticket/11066): Widget's private parts use CSS reset.
+* [#11027](http://dev.ckeditor.com/ticket/11027): Fixed: Block commands break on widgets; added the [`contentDomInvalidated`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-contentDomInvalidated) event.
+* [#10430](http://dev.ckeditor.com/ticket/10430): Resolve dependence of the [Image](http://ckeditor.com/addon/image) plugin on the [Form Elements](http://ckeditor.com/addon/forms) plugin.
+* [#10911](http://dev.ckeditor.com/ticket/10911): Fixed: Browser *Alt* hotkeys will no longer be blocked while a widget is focused.
+* [#11082](http://dev.ckeditor.com/ticket/11082): Fixed: Selected widget is not copied or cut when using toolbar buttons or context menu.
+* [#11083](http://dev.ckeditor.com/ticket/11083): Fixed list and div element application to block widgets.
+* [#10887](http://dev.ckeditor.com/ticket/10887): Internet Explorer 8 compatibility issues related to the Widget System.
+* [#11074](http://dev.ckeditor.com/ticket/11074): Temporarily disabled inline widget drag and drop, because of seriously buggy native `range#moveToPoint` method.
+* [#11098](http://dev.ckeditor.com/ticket/11098): Fixed: Wrong selection position after undoing widget drag and drop.
+* [#11110](http://dev.ckeditor.com/ticket/11110): Fixed: IFrame and Flash objects are being incorrectly pasted in certain conditions.
+* [#11129](http://dev.ckeditor.com/ticket/11129): Page break is lost when loading data.
+* [#11123](http://dev.ckeditor.com/ticket/11123): [Firefox] Widget is destroyed after being dragged outside of `<body>`.
+* [#11124](http://dev.ckeditor.com/ticket/11124): Fixed the [Elements Path](http://ckeditor.com/addon/elementspath) in an editor using the [Div Editing Area](http://ckeditor.com/addon/divarea).
+
+## CKEditor 4.3 Beta
+
+New Features:
+
+* [#9764](http://dev.ckeditor.com/ticket/9764): Widget System.
+ * [Widget plugin](http://ckeditor.com/addon/widget) introducing the [Widget API](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget).
+ * New [`editor.enterMode`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-property-enterMode) and [`editor.shiftEnterMode`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-property-shiftEnterMode) properties &ndash; normalized versions of [`config.enterMode`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-enterMode) and [`config.shiftEnterMode`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-shiftEnterMode).
+ * Dynamic editor settings. Starting from CKEditor 4.3 Beta, *Enter* mode values and [content filter](http://docs.ckeditor.com/#!/guide/dev_advanced_content_filter) instances may be changed dynamically (for example when the caret was placed in an element in which editor features should be adjusted). When you are implementing a new editor feature, you should base its behavior on [dynamic](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-property-activeEnterMode) or [static](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-property-enterMode) *Enter* mode values depending on whether this feature works in selection context or globally on editor content.
+ * Dynamic *Enter* mode values &ndash; [`editor.setActiveEnterMode()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-setActiveEnterMode) method, [`editor.activeEnterModeChange`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-activeEnterModeChange) event, and two properties: [`editor.activeEnterMode`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-property-activeEnterMode) and [`editor.activeShiftEnterMode`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-property-activeShiftEnterMode).
+ * Dynamic content filter instances &ndash; [`editor.setActiveFilter()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-setActiveFilter) method, [`editor.activeFilterChange`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-activeFilterChange) event, and [`editor.activeFilter`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-property-activeFilter) property.
+ * "Fake" selection was introduced. It makes it possible to virtually select any element when the real selection remains hidden. See the [`selection.fake()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.selection-method-fake) method.
+ * Default [`htmlParser.filter`](http://docs.ckeditor.com/#!/api/CKEDITOR.htmlParser.filter) rules are not applied to non-editable elements (elements with `contenteditable` attribute set to `false` and their descendants) anymore. To add a rule which will be applied to all elements you need to pass an additional argument to the [`filter.addRules()`](http://docs.ckeditor.com/#!/api/CKEDITOR.htmlParser.filter-method-addRules) method.
+ * Dozens of new methods were introduced &ndash; most interesting ones:
+ * [`document.find()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.document-method-find),
+ * [`document.findOne()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.document-method-findOne),
+ * [`editable.insertElementIntoRange()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editable-method-insertElementIntoRange),
+ * [`range.moveToClosestEditablePosition()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.range-method-moveToClosestEditablePosition),
+ * New methods for [`htmlParser.node`](http://docs.ckeditor.com/#!/api/CKEDITOR.htmlParser.node) and [`htmlParser.element`](http://docs.ckeditor.com/#!/api/CKEDITOR.htmlParser.element).
+* [#10659](http://dev.ckeditor.com/ticket/10659): New [Enhanced Image](http://ckeditor.com/addon/image2) plugin that introduces a widget with integrated image captions, an option to center images, and dynamic "click and drag" resizing.
+* [#10664](http://dev.ckeditor.com/ticket/10664): New [Mathematical Formulas](http://ckeditor.com/addon/mathjax) plugin that introduces the MathJax widget.
+* [#7987](https://dev.ckeditor.com/ticket/7987): New [Language](http://ckeditor.com/addon/language) plugin that implements Language toolbar button to support [WCAG 3.1.2 Language of Parts](http://www.w3.org/TR/UNDERSTANDING-WCAG20/meaning-other-lang-id.html).
+* [#10708](http://dev.ckeditor.com/ticket/10708): New [smileys](http://ckeditor.com/addon/smiley).
+
+## CKEditor 4.2.3
+
+Fixed Issues:
+
+* [#10994](http://dev.ckeditor.com/ticket/10994): Fixed: Loading external jQuery library when opening the [jQuery Adapter](http://docs.ckeditor.com/#!/guide/dev_jquery) sample directly from file.
+* [#10975](http://dev.ckeditor.com/ticket/10975): [IE] Fixed: Error thrown while opening the color palette.
+* [#9929](http://dev.ckeditor.com/ticket/9929): [Blink/WebKit] Fixed: A non-breaking space is created once a character is deleted and a regular space is typed.
+* [#10963](http://dev.ckeditor.com/ticket/10963): Fixed: JAWS issue with the keyboard shortcut for [Magic Line](http://ckeditor.com/addon/magicline).
+* [#11096](http://dev.ckeditor.com/ticket/11096): Fixed: TypeError: Object has no method 'is'.
+
+## CKEditor 4.2.2
+
+Fixed Issues:
+
+* [#9314](http://dev.ckeditor.com/ticket/9314): Fixed: Incorrect error message on closing a dialog window without saving changs.
+* [#10308](http://dev.ckeditor.com/ticket/10308): [IE10] Fixed: Unspecified error when deleting a row.
+* [#10945](http://dev.ckeditor.com/ticket/10945): [Chrome] Fixed: Clicking with a mouse inside the editor does not show the caret.
+* [#10912](http://dev.ckeditor.com/ticket/10912): Prevent default action when content of a non-editable link is clicked.
+* [#10913](http://dev.ckeditor.com/ticket/10913): Fixed [`CKEDITOR.plugins.addExternal()`](http://docs.ckeditor.com/#!/api/CKEDITOR.resourceManager-method-addExternal) not handling paths including file name specified.
+* [#10666](http://dev.ckeditor.com/ticket/10666): Fixed [`CKEDITOR.tools.isArray()`](http://docs.ckeditor.com/#!/api/CKEDITOR.tools-method-isArray) not working cross frame.
+* [#10910](http://dev.ckeditor.com/ticket/10910): [IE9] Fixed JavaScript error thrown in Compatibility Mode when clicking and/or typing in the editing area.
+* [#10868](http://dev.ckeditor.com/ticket/10868): [IE8] Prevent the browser from crashing when applying the Inline Quotation style.
+* [#10915](http://dev.ckeditor.com/ticket/10915): Fixed: Invalid CSS filter in the Kama skin.
+* [#10914](http://dev.ckeditor.com/ticket/10914): Plugins [Indent List](http://ckeditor.com/addon/indentlist) and [Indent Block](http://ckeditor.com/addon/indentblock) are now included in the build configuration.
+* [#10812](http://dev.ckeditor.com/ticket/10812): Fixed [`range.createBookmark2()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.range-method-createBookmark2) incorrectly normalizing offsets. This bug was causing many issues: [#10850](http://dev.ckeditor.com/ticket/10850), [#10842](http://dev.ckeditor.com/ticket/10842).
+* [#10951](http://dev.ckeditor.com/ticket/10951): Reviewed and optimized focus handling on panels (combo, menu buttons, color buttons, and context menu) to enhance accessibility. Fixed [#10705](http://dev.ckeditor.com/ticket/10705), [#10706](http://dev.ckeditor.com/ticket/10706) and [#10707](http://dev.ckeditor.com/ticket/10707).
+* [#10704](http://dev.ckeditor.com/ticket/10704): Fixed a JAWS issue with the Select Color dialog window title not being announced.
+* [#10753](http://dev.ckeditor.com/ticket/10753): The floating toolbar in inline instances now has a dedicated accessibility label.
+
+## CKEditor 4.2.1
+
+Fixed Issues:
+
+* [#10301](http://dev.ckeditor.com/ticket/10301): [IE9-10] Undo fails after 3+ consecutive paste actions with a JavaScript error.
+* [#10689](http://dev.ckeditor.com/ticket/10689): Save toolbar button saves only the first editor instance.
+* [#10368](http://dev.ckeditor.com/ticket/10368): Move language reading direction definition (`dir`) from main language file to core.
+* [#9330](http://dev.ckeditor.com/ticket/9330): Fixed pasting anchors from MS Word.
+* [#8103](http://dev.ckeditor.com/ticket/8103): Fixed pasting nested lists from MS Word.
+* [#9958](http://dev.ckeditor.com/ticket/9958): [IE9] Pressing the "OK" button will trigger the `onbeforeunload` event in the popup dialog.
+* [#10662](http://dev.ckeditor.com/ticket/10662): Fixed styles from the Styles drop-down list not registering to the ACF in case when the [Shared Spaces plugin](http://ckeditor.com/addon/sharedspace) is used.
+* [#9654](http://dev.ckeditor.com/ticket/9654): Problems with Internet Explorer 10 Quirks Mode.
+* [#9816](http://dev.ckeditor.com/ticket/9816): Floating toolbar does not reposition vertically in several cases.
+* [#10646](http://dev.ckeditor.com/ticket/10646): Removing a selected sublist or nested table with *Backspace/Delete* removes the parent element.
+* [#10623](http://dev.ckeditor.com/ticket/10623): [WebKit] Page is scrolled when opening a drop-down list.
+* [#10004](http://dev.ckeditor.com/ticket/10004): [ChromeVox] Button names are not announced.
+* [#10731](http://dev.ckeditor.com/ticket/10731): [WebSpellChecker](http://ckeditor.com/addon/wsc) plugin breaks cloning of editor configuration.
+* It is now possible to set per instance [WebSpellChecker](http://ckeditor.com/addon/wsc) plugin configuration instead of setting the configuration globally.
+
+## CKEditor 4.2
+
+**Important Notes:**
+
+* Dropped compatibility support for Internet Explorer 7 and Firefox 3.6.
+
+* Both the Basic and the Standard distribution packages will not contain the new [Indent Block](http://ckeditor.com/addon/indentblock) plugin. Because of this the [Advanced Content Filter](http://docs.ckeditor.com/#!/guide/dev_advanced_content_filter) might remove block indentations from existing contents. If you want to prevent this, either [add an appropriate ACF rule to your filter](http://docs.ckeditor.com/#!/guide/dev_allowed_content_rules) or create a custom build based on the Basic/Standard package and add the Indent Block plugin in [CKBuilder](http://ckeditor.com/builder).
+
+New Features:
+
+* [#10027](http://dev.ckeditor.com/ticket/10027): Separated list and block indentation into two plugins: [Indent List](http://ckeditor.com/addon/indentlist) and [Indent Block](http://ckeditor.com/addon/indentblock).
+* [#8244](http://dev.ckeditor.com/ticket/8244): Use *(Shift+)Tab* to indent and outdent lists.
+* [#10281](http://dev.ckeditor.com/ticket/10281): The [jQuery Adapter](http://docs.ckeditor.com/#!/guide/dev_jquery) is now available. Several jQuery-related issues fixed: [#8261](http://dev.ckeditor.com/ticket/8261), [#9077](http://dev.ckeditor.com/ticket/9077), [#8710](http://dev.ckeditor.com/ticket/8710), [#8530](http://dev.ckeditor.com/ticket/8530), [#9019](http://dev.ckeditor.com/ticket/9019), [#6181](http://dev.ckeditor.com/ticket/6181), [#7876](http://dev.ckeditor.com/ticket/7876), [#6906](http://dev.ckeditor.com/ticket/6906).
+* [#10042](http://dev.ckeditor.com/ticket/10042): Introduced [`config.title`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-title) setting to change the human-readable title of the editor.
+* [#9794](http://dev.ckeditor.com/ticket/9794): Added [`editor.change`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-change) event.
+* [#9923](http://dev.ckeditor.com/ticket/9923): HiDPI support in the editor UI. HiDPI icons for [Moono skin](http://ckeditor.com/addon/moono) added.
+* [#8031](http://dev.ckeditor.com/ticket/8031): Handle `required` attributes on `<textarea>` elements &mdash; introduced [`editor.required`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-required) event.
+* [#10280](http://dev.ckeditor.com/ticket/10280): Ability to replace `<textarea>` elements with the inline editor.
+
+Fixed Issues:
+
+* [#10599](http://dev.ckeditor.com/ticket/10599): [Indent](http://ckeditor.com/addon/indent) plugin is no longer required by the [List](http://ckeditor.com/addon/list) plugin.
+* [#10370](http://dev.ckeditor.com/ticket/10370): Inconsistency in data events between framed and inline editors.
+* [#10438](http://dev.ckeditor.com/ticket/10438): [FF, IE] No selection is done on an editable element on executing [`editor.setData()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-setData).
+
+## CKEditor 4.1.3
+
+New Features:
+
+* Added new translation: Indonesian.
+
+Fixed Issues:
+
+* [#10644](http://dev.ckeditor.com/ticket/10644): Fixed a critical bug when pasting plain text in Blink-based browsers.
+* [#5189](http://dev.ckeditor.com/ticket/5189): [Find/Replace](http://ckeditor.com/addon/find) dialog window: rename "Cancel" button to "Close".
+* [#10562](http://dev.ckeditor.com/ticket/10562): [Housekeeping] Unified CSS gradient filter formats in the [Moono](http://ckeditor.com/addon/moono) skin.
+* [#10537](http://dev.ckeditor.com/ticket/10537): Advanced Content Filter should register a default rule for [`config.shiftEnterMode`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-shiftEnterMode).
+* [#10610](http://dev.ckeditor.com/ticket/10610): [`CKEDITOR.dialog.addIframe()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dialog-static-method-addIframe) incorrectly sets the iframe size in dialog windows.
+
+## CKEditor 4.1.2
+
+New Features:
+
+* Added new translation: Sinhala.
+
+Fixed Issues:
+
+* [#10339](http://dev.ckeditor.com/ticket/10339): Fixed: Error thrown when inserted data was totally stripped out after filtering and processing.
+* [#10298](http://dev.ckeditor.com/ticket/10298): Fixed: Data processor breaks attributes containing protected parts.
+* [#10367](http://dev.ckeditor.com/ticket/10367): Fixed: [`editable.insertText()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editable-method-insertText) loses characters when `RegExp` replace controls are being inserted.
+* [#10165](http://dev.ckeditor.com/ticket/10165): [IE] Access denied error when `document.domain` has been altered.
+* [#9761](http://dev.ckeditor.com/ticket/9761): Update the *Backspace* key state in [`keystrokeHandler.blockedKeystrokes`](http://docs.ckeditor.com/#!/api/CKEDITOR.keystrokeHandler-property-blockedKeystrokes) when calling [`editor.setReadOnly()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-setReadOnly).
+* [#6504](http://dev.ckeditor.com/ticket/6504): Fixed: Race condition while loading several [`config.customConfig`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-customConfig) files.
+* [#10146](http://dev.ckeditor.com/ticket/10146): [Firefox] Empty lines are being removed while [`config.enterMode`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-enterMode) is [`CKEDITOR.ENTER_BR`](http://docs.ckeditor.com/#!/api/CKEDITOR-property-ENTER_BR).
+* [#10360](http://dev.ckeditor.com/ticket/10360): Fixed: ARIA `role="application"` should not be used for dialog windows.
+* [#10361](http://dev.ckeditor.com/ticket/10361): Fixed: ARIA `role="application"` should not be used for floating panels.
+* [#10510](http://dev.ckeditor.com/ticket/10510): Introduced unique voice labels to differentiate between different editor instances.
+* [#9945](http://dev.ckeditor.com/ticket/9945): [iOS] Scrolling not possible on iPad.
+* [#10389](http://dev.ckeditor.com/ticket/10389): Fixed: Invalid HTML in the "Text and Table" template.
+* [WebSpellChecker](http://ckeditor.com/addon/wsc) plugin user interface was changed to match CKEditor 4 style.
+
+## CKEditor 4.1.1
+
+New Features:
+
+* Added new translation: Albanian.
+
+Fixed Issues:
+
+* [#10172](http://dev.ckeditor.com/ticket/10172): Pressing *Delete* or *Backspace* in an empty table cell moves the cursor to the next/previous cell.
+* [#10219](http://dev.ckeditor.com/ticket/10219): Error thrown when destroying an editor instance in parallel with a `mouseup` event.
+* [#10265](http://dev.ckeditor.com/ticket/10265): Wrong loop type in the [File Browser](http://ckeditor.com/addon/filebrowser) plugin.
+* [#10249](http://dev.ckeditor.com/ticket/10249): Wrong undo/redo states at start.
+* [#10268](http://dev.ckeditor.com/ticket/10268): [Show Blocks](http://ckeditor.com/addon/showblocks) does not recover after switching to Source view.
+* [#9995](http://dev.ckeditor.com/ticket/9995): HTML code in the `<textarea>` should not be modified by the [`htmlDataProcessor`](http://docs.ckeditor.com/#!/api/CKEDITOR.htmlDataProcessor).
+* [#10320](http://dev.ckeditor.com/ticket/10320): [Justify](http://ckeditor.com/addon/justify) plugin should add elements to Advanced Content Filter based on current [Enter mode](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-enterMode).
+* [#10260](http://dev.ckeditor.com/ticket/10260): Fixed: Advanced Content Filter blocks [`tabSpaces`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-tabSpaces). Unified `data-cke-*` attributes filtering.
+* [#10315](http://dev.ckeditor.com/ticket/10315): [WebKit] [Undo manager](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.undo.UndoManager) should not record snapshots after a filling character was added/removed.
+* [#10291](http://dev.ckeditor.com/ticket/10291): [WebKit] Space after a filling character should be secured.
+* [#10330](http://dev.ckeditor.com/ticket/10330): [WebKit] The filling character is not removed on `keydown` in specific cases.
+* [#10285](http://dev.ckeditor.com/ticket/10285): Fixed: Styled text pasted from MS Word causes an infinite loop.
+* [#10131](http://dev.ckeditor.com/ticket/10131): Fixed: [`undoManager.update()`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.undo.UndoManager-method-update) does not refresh the command state.
+* [#10337](http://dev.ckeditor.com/ticket/10337): Fixed: Unable to remove `<s>` using [Remove Format](http://ckeditor.com/addon/removeformat).
+
+## CKEditor 4.1
+
+Fixed Issues:
+
+* [#10192](http://dev.ckeditor.com/ticket/10192): Closing lists with the *Enter* key does not work with [Advanced Content Filter](http://docs.ckeditor.com/#!/guide/dev_advanced_content_filter) in several cases.
+* [#10191](http://dev.ckeditor.com/ticket/10191): Fixed allowed content rules unification, so the [`filter.allowedContent`](http://docs.ckeditor.com/#!/api/CKEDITOR.filter-property-allowedContent) property always contains rules in the same format.
+* [#10224](http://dev.ckeditor.com/ticket/10224): Advanced Content Filter does not remove non-empty `<a>` elements anymore.
+* Minor issues in plugin integration with Advanced Content Filter:
+ * [#10166](http://dev.ckeditor.com/ticket/10166): Added transformation from the `align` attribute to `float` style to preserve backward compatibility after the introduction of Advanced Content Filter.
+ * [#10195](http://dev.ckeditor.com/ticket/10195): [Image](http://ckeditor.com/addon/image) plugin no longer registers rules for links to Advanced Content Filter.
+ * [#10213](http://dev.ckeditor.com/ticket/10213): [Justify](http://ckeditor.com/addon/justify) plugin is now correctly registering rules to Advanced Content Filter when [`config.justifyClasses`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-justifyClasses) is defined.
+
+## CKEditor 4.1 RC
+
+New Features:
+
+* [#9829](http://dev.ckeditor.com/ticket/9829): Advanced Content Filter - data and features activation based on editor configuration.
+
+ Brand new data filtering system that works in 2 modes:
+
+ * Based on loaded features (toolbar items, plugins) - the data will be filtered according to what the editor in its
+ current configuration can handle.
+ * Based on [`config.allowedContent`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-allowedContent) rules - the data
+ will be filtered and the editor features (toolbar items, commands, keystrokes) will be enabled if they are allowed.
+
+ See the `datafiltering.html` sample, [guides](http://docs.ckeditor.com/#!/guide/dev_advanced_content_filter) and [`CKEDITOR.filter` API documentation](http://docs.ckeditor.com/#!/api/CKEDITOR.filter).
+* [#9387](http://dev.ckeditor.com/ticket/9387): Reintroduced [Shared Spaces](http://ckeditor.com/addon/sharedspace) - the ability to display toolbar and bottom editor space in selected locations and to share them by different editor instances.
+* [#9907](http://dev.ckeditor.com/ticket/9907): Added the [`contentPreview`](http://docs.ckeditor.com/#!/api/CKEDITOR-event-contentPreview) event for preview data manipulation.
+* [#9713](http://dev.ckeditor.com/ticket/9713): Introduced the [Source Dialog](http://ckeditor.com/addon/sourcedialog) plugin that brings raw HTML editing for inline editor instances.
+* Included in [#9829](http://dev.ckeditor.com/ticket/9829): Introduced new events, [`toHtml`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-toHtml) and [`toDataFormat`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-toDataFormat), allowing for better integration with data processing.
+* [#9981](http://dev.ckeditor.com/ticket/9981): Added ability to filter [`htmlParser.fragment`](http://docs.ckeditor.com/#!/api/CKEDITOR.htmlParser.fragment), [`htmlParser.element`](http://docs.ckeditor.com/#!/api/CKEDITOR.htmlParser.element) etc. by many [`htmlParser.filter`](http://docs.ckeditor.com/#!/api/CKEDITOR.htmlParser.filter)s before writing structure to an HTML string.
+* Included in [#10103](http://dev.ckeditor.com/ticket/10103):
+ * Introduced the [`editor.status`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-property-status) property to make it easier to check the current status of the editor.
+ * Default [`command`](http://docs.ckeditor.com/#!/api/CKEDITOR.command) state is now [`CKEDITOR.TRISTATE_DISABLE`](http://docs.ckeditor.com/#!/api/CKEDITOR-property-TRISTATE_DISABLED). It will be activated on [`editor.instanceReady`](http://docs.ckeditor.com/#!/api/CKEDITOR-event-instanceReady) or immediately after being added if the editor is already initialized.
+* [#9796](http://dev.ckeditor.com/ticket/9796): Introduced `<s>` as a default tag for strikethrough, which replaces obsolete `<strike>` in HTML5.
+
+## CKEditor 4.0.3
+
+Fixed Issues:
+
+* [#10196](http://dev.ckeditor.com/ticket/10196): Fixed context menus not opening with keyboard shortcuts when [Autogrow](http://ckeditor.com/addon/autogrow) is enabled.
+* [#10212](http://dev.ckeditor.com/ticket/10212): [IE7-10] Undo command throws errors after multiple switches between Source and WYSIWYG view.
+* [#10219](http://dev.ckeditor.com/ticket/10219): [Inline editor] Error thrown after calling [`editor.destroy()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-destroy).
+
+## CKEditor 4.0.2
+
+Fixed Issues:
+
+* [#9779](http://dev.ckeditor.com/ticket/9779): Fixed overriding [`CKEDITOR.getUrl()`](http://docs.ckeditor.com/#!/api/CKEDITOR-method-getUrl) with `CKEDITOR_GETURL`.
+* [#9772](http://dev.ckeditor.com/ticket/9772): Custom buttons in the dialog window footer have different look and size ([Moono](http://ckeditor.com/addon/moono), [Kama](http://ckeditor.com/addon/kama) skins).
+* [#9029](http://dev.ckeditor.com/ticket/9029): Custom styles added with the [`stylesSet.add()`](http://docs.ckeditor.com/#!/api/CKEDITOR.stylesSet-method-add) are displayed in the wrong order.
+* [#9887](http://dev.ckeditor.com/ticket/9887): Disable [Magic Line](http://ckeditor.com/addon/magicline) when [`editor.readOnly`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-property-readOnly) is set.
+* [#9882](http://dev.ckeditor.com/ticket/9882): Fixed empty document title on [`editor.getData()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-getData) if set via the Document Properties dialog window.
+* [#9773](http://dev.ckeditor.com/ticket/9773): Fixed rendering problems with selection fields in the Kama skin.
+* [#9851](http://dev.ckeditor.com/ticket/9851): The [`selectionChange`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-selectionChange) event is not fired when mouse selection ended outside editable.
+* [#9903](http://dev.ckeditor.com/ticket/9903): [Inline editor] Bad positioning of floating space with page horizontal scroll.
+* [#9872](http://dev.ckeditor.com/ticket/9872): [`editor.checkDirty()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-checkDirty) returns `true` when called onload. Removed the obsolete `editor.mayBeDirty` flag.
+* [#9893](http://dev.ckeditor.com/ticket/9893): [IE] Fixed broken toolbar when editing mixed direction content in Quirks mode.
+* [#9845](http://dev.ckeditor.com/ticket/9845): Fixed TAB navigation in the [Link](http://ckeditor.com/addon/link) dialog window when the Anchor option is used and no anchors are available.
+* [#9883](http://dev.ckeditor.com/ticket/9883): Maximizing was making the entire page editable with [divarea](http://ckeditor.com/addon/divarea)-based editors.
+* [#9940](http://dev.ckeditor.com/ticket/9940): [Firefox] Navigating back to a page with the editor was making the entire page editable.
+* [#9966](http://dev.ckeditor.com/ticket/9966): Fixed: Unable to type square brackets with French keyboard layout. Changed [Magic Line](http://ckeditor.com/addon/magicline) keystrokes.
+* [#9507](http://dev.ckeditor.com/ticket/9507): [Firefox] Selection is moved before editable position when the editor is focused for the first time.
+* [#9947](http://dev.ckeditor.com/ticket/9947): [WebKit] Editor overflows parent container in some edge cases.
+* [#10105](http://dev.ckeditor.com/ticket/10105): Fixed: Broken [sourcearea](http://ckeditor.com/addon/sourcearea) view when an RTL language is set.
+* [#10123](http://dev.ckeditor.com/ticket/10123): [WebKit] Fixed: Several dialog windows have broken layout since the latest WebKit release.
+* [#10152](http://dev.ckeditor.com/ticket/10152): Fixed: Invalid ARIA property used on menu items.
+
+## CKEditor 4.0.1.1
+
+Fixed Issues:
+
+* Security update: Added protection against XSS attack and possible path disclosure in the PHP sample.
+
+## CKEditor 4.0.1
+
+Fixed Issues:
+
+* [#9655](http://dev.ckeditor.com/ticket/9655): Support for IE Quirks Mode in the new [Moono skin](http://ckeditor.com/addon/moono).
+* Accessibility issues (mainly in inline editor): [#9364](http://dev.ckeditor.com/ticket/9364), [#9368](http://dev.ckeditor.com/ticket/9368), [#9369](http://dev.ckeditor.com/ticket/9369), [#9370](http://dev.ckeditor.com/ticket/9370), [#9541](http://dev.ckeditor.com/ticket/9541), [#9543](http://dev.ckeditor.com/ticket/9543), [#9841](http://dev.ckeditor.com/ticket/9841), [#9844](http://dev.ckeditor.com/ticket/9844).
+* [Magic Line](http://ckeditor.com/addon/magicline) plugin:
+ * [#9481](http://dev.ckeditor.com/ticket/9481): Added accessibility support for Magic Line.
+ * [#9509](http://dev.ckeditor.com/ticket/9509): Added Magic Line support for forms.
+ * [#9573](http://dev.ckeditor.com/ticket/9573): Magic Line does not disappear on `mouseout` in a specific case.
+* [#9754](http://dev.ckeditor.com/ticket/9754): [WebKit] Cutting & pasting simple unformatted text generates an inline wrapper in WebKit browsers.
+* [#9456](http://dev.ckeditor.com/ticket/9456): [Chrome] Properly paste bullet list style from MS Word.
+* [#9699](http://dev.ckeditor.com/ticket/9699), [#9758](http://dev.ckeditor.com/ticket/9758): Improved selection locking when selecting by dragging.
+* Context menu:
+ * [#9712](http://dev.ckeditor.com/ticket/9712): Opening the context menu destroys editor focus.
+ * [#9366](http://dev.ckeditor.com/ticket/9366): Context menu should be displayed over the floating toolbar.
+ * [#9706](http://dev.ckeditor.com/ticket/9706): Context menu generates a JavaScript error in inline mode when the editor is attached to a header element.
+* [#9800](http://dev.ckeditor.com/ticket/9800): Hide float panel when resizing the window.
+* [#9721](http://dev.ckeditor.com/ticket/9721): Padding in content of div-based editor puts the editing area under the bottom UI space.
+* [#9528](http://dev.ckeditor.com/ticket/9528): Host page `box-sizing` style should not influence the editor UI elements.
+* [#9503](http://dev.ckeditor.com/ticket/9503): [Form Elements](http://ckeditor.com/addon/forms) plugin adds context menu listeners only on supported input types. Added support for `tel`, `email`, `search` and `url` input types.
+* [#9769](http://dev.ckeditor.com/ticket/9769): Improved floating toolbar positioning in a narrow window.
+* [#9875](http://dev.ckeditor.com/ticket/9875): Table dialog window does not populate width correctly.
+* [#8675](http://dev.ckeditor.com/ticket/8675): Deleting cells in a nested table removes the outer table cell.
+* [#9815](http://dev.ckeditor.com/ticket/9815): Cannot edit dialog window fields in an editor initialized in the jQuery UI modal dialog.
+* [#8888](http://dev.ckeditor.com/ticket/8888): CKEditor dialog windows do not show completely in a small window.
+* [#9360](http://dev.ckeditor.com/ticket/9360): [Inline editor] Blocks shown for a `<div>` element stay permanently even after the user exits editing the `<div>`.
+* [#9531](http://dev.ckeditor.com/ticket/9531): [Firefox & Inline editor] Toolbar is lost when closing the Format drop-down list by clicking its button.
+* [#9553](http://dev.ckeditor.com/ticket/9553): Table width incorrectly set when the `border-width` style is specified.
+* [#9594](http://dev.ckeditor.com/ticket/9594): Cannot tab past CKEditor when it is in read-only mode.
+* [#9658](http://dev.ckeditor.com/ticket/9658): [IE9] Justify not working on selected images.
+* [#9686](http://dev.ckeditor.com/ticket/9686): Added missing contents styles for `<pre>` elements.
+* [#9709](http://dev.ckeditor.com/ticket/9709): [Paste from Word](http://ckeditor.com/addon/pastefromword) should not depend on configuration from other styles.
+* [#9726](http://dev.ckeditor.com/ticket/9726): Removed [Color Dialog](http://ckeditor.com/addon/colordialog) plugin dependency from [Table Tools](http://ckeditor.com/addon/tabletools).
+* [#9765](http://dev.ckeditor.com/ticket/9765): Toolbar Collapse command documented incorrectly in the [Accessibility Instructions](http://ckeditor.com/addon/a11yhelp) dialog window.
+* [#9771](http://dev.ckeditor.com/ticket/9771): [WebKit & Opera] Fixed scrolling issues when pasting.
+* [#9787](http://dev.ckeditor.com/ticket/9787): [IE9] `onChange` is not fired for checkboxes in dialogs.
+* [#9842](http://dev.ckeditor.com/ticket/9842): [Firefox 17] When opening a toolbar menu for the first time and pressing the *Down Arrow* key, focus goes to the next toolbar button instead of the menu options.
+* [#9847](http://dev.ckeditor.com/ticket/9847): [Elements Path](http://ckeditor.com/addon/elementspath) should not be initialized in the inline editor.
+* [#9853](http://dev.ckeditor.com/ticket/9853): [`editor.addRemoveFormatFilter()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-addRemoveFormatFilter) is exposed before it really works.
+* [#8893](http://dev.ckeditor.com/ticket/8893): Value of the [`pasteFromWordCleanupFile`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-pasteFromWordCleanupFile) configuration option is now taken from the instance configuration.
+* [#9693](http://dev.ckeditor.com/ticket/9693): Removed "Live Preview" checkbox from UI color picker.
+
+
+## CKEditor 4.0
+
+The first stable release of the new CKEditor 4 code line.
+
+The CKEditor JavaScript API has been kept compatible with CKEditor 4, whenever
+possible. The list of relevant changes can be found in the [API Changes page of
+the CKEditor 4 documentation][1].
+
+[1]: http://docs.ckeditor.com/#!/guide/dev_api_changes "API Changes"
diff --git a/js/ckeditor/LICENSE.md b/js/ckeditor/LICENSE.md
new file mode 100644
index 0000000..72cc97c
--- /dev/null
+++ b/js/ckeditor/LICENSE.md
@@ -0,0 +1,1264 @@
+Software License Agreement
+==========================
+
+CKEditor - The text editor for Internet - http://ckeditor.com
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+
+Licensed under the terms of any of the following licenses at your
+choice:
+
+ - GNU General Public License Version 2 or later (the "GPL")
+ http://www.gnu.org/licenses/gpl.html
+ (See Appendix A)
+
+ - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ http://www.gnu.org/licenses/lgpl.html
+ (See Appendix B)
+
+ - Mozilla Public License Version 1.1 or later (the "MPL")
+ http://www.mozilla.org/MPL/MPL-1.1.html
+ (See Appendix C)
+
+You are not required to, but if you want to explicitly declare the
+license you have chosen to be bound to when using, reproducing,
+modifying and distributing this software, just include a text file
+titled "legal.txt" in your version of this software, indicating your
+license choice. In any case, your choice will not restrict any
+recipient of your version of this software to use, reproduce, modify
+and distribute this software under any of the above licenses.
+
+Sources of Intellectual Property Included in CKEditor
+-----------------------------------------------------
+
+Where not otherwise indicated, all CKEditor content is authored by
+CKSource engineers and consists of CKSource-owned intellectual
+property. In some specific instances, CKEditor will incorporate work
+done by developers outside of CKSource with their express permission.
+
+Trademarks
+----------
+
+CKEditor is a trademark of CKSource - Frederico Knabben. All other brand
+and product names are trademarks, registered trademarks or service
+marks of their respective holders.
+
+---
+
+Appendix A: The GPL License
+---------------------------
+
+GNU GENERAL PUBLIC LICENSE
+Version 2, June 1991
+
+ Copyright (C) 1989, 1991 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.
+
+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
+
+
+Appendix B: The LGPL License
+----------------------------
+
+GNU LESSER GENERAL PUBLIC LICENSE
+Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 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
+
+
+Appendix C: The MPL License
+---------------------------
+
+MOZILLA PUBLIC LICENSE
+Version 1.1
+
+1. Definitions.
+
+ 1.0.1. "Commercial Use" means distribution or otherwise making the
+ Covered Code available to a third party.
+
+ 1.1. "Contributor" means each entity that creates or contributes to
+ the creation of Modifications.
+
+ 1.2. "Contributor Version" means the combination of the Original
+ Code, prior Modifications used by a Contributor, and the Modifications
+ made by that particular Contributor.
+
+ 1.3. "Covered Code" means the Original Code or Modifications or the
+ combination of the Original Code and Modifications, in each case
+ including portions thereof.
+
+ 1.4. "Electronic Distribution Mechanism" means a mechanism generally
+ accepted in the software development community for the electronic
+ transfer of data.
+
+ 1.5. "Executable" means Covered Code in any form other than Source
+ Code.
+
+ 1.6. "Initial Developer" means the individual or entity identified
+ as the Initial Developer in the Source Code notice required by Exhibit
+ A.
+
+ 1.7. "Larger Work" means a work which combines Covered Code or
+ portions thereof with code not governed by the terms of this License.
+
+ 1.8. "License" means this document.
+
+ 1.8.1. "Licensable" means having the right to grant, to the maximum
+ extent possible, whether at the time of the initial grant or
+ subsequently acquired, any and all of the rights conveyed herein.
+
+ 1.9. "Modifications" means any addition to or deletion from the
+ substance or structure of either the Original Code or any previous
+ Modifications. When Covered Code is released as a series of files, a
+ Modification is:
+ A. Any addition to or deletion from the contents of a file
+ containing Original Code or previous Modifications.
+
+ B. Any new file that contains any part of the Original Code or
+ previous Modifications.
+
+ 1.10. "Original Code" means Source Code of computer software code
+ which is described in the Source Code notice required by Exhibit A as
+ Original Code, and which, at the time of its release under this
+ License is not already Covered Code governed by this License.
+
+ 1.10.1. "Patent Claims" means any patent claim(s), now owned or
+ hereafter acquired, including without limitation, method, process,
+ and apparatus claims, in any patent Licensable by grantor.
+
+ 1.11. "Source Code" means the preferred form of the Covered Code for
+ making modifications to it, including all modules it contains, plus
+ any associated interface definition files, scripts used to control
+ compilation and installation of an Executable, or source code
+ differential comparisons against either the Original Code or another
+ well known, available Covered Code of the Contributor's choice. The
+ Source Code can be in a compressed or archival form, provided the
+ appropriate decompression or de-archiving software is widely available
+ for no charge.
+
+ 1.12. "You" (or "Your") means an individual or a legal entity
+ exercising rights under, and complying with all of the terms of, this
+ License or a future version of this License issued under Section 6.1.
+ For legal entities, "You" includes any entity which 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. Source Code License.
+
+ 2.1. The Initial Developer Grant.
+ The Initial Developer hereby grants You a world-wide, royalty-free,
+ non-exclusive license, subject to third party intellectual property
+ claims:
+ (a) under intellectual property rights (other than patent or
+ trademark) Licensable by Initial Developer to use, reproduce,
+ modify, display, perform, sublicense and distribute the Original
+ Code (or portions thereof) with or without Modifications, and/or
+ as part of a Larger Work; and
+
+ (b) under Patents Claims infringed by the making, using or
+ selling of Original Code, to make, have made, use, practice,
+ sell, and offer for sale, and/or otherwise dispose of the
+ Original Code (or portions thereof).
+
+ (c) the licenses granted in this Section 2.1(a) and (b) are
+ effective on the date Initial Developer first distributes
+ Original Code under the terms of this License.
+
+ (d) Notwithstanding Section 2.1(b) above, no patent license is
+ granted: 1) for code that You delete from the Original Code; 2)
+ separate from the Original Code; or 3) for infringements caused
+ by: i) the modification of the Original Code or ii) the
+ combination of the Original Code with other software or devices.
+
+ 2.2. Contributor Grant.
+ Subject to third party intellectual property claims, 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 Contributor, to use, reproduce, modify,
+ display, perform, sublicense and distribute the Modifications
+ created by such Contributor (or portions thereof) either on an
+ unmodified basis, with other Modifications, as Covered Code
+ and/or as part of a Larger Work; and
+
+ (b) under Patent Claims infringed by the making, using, or
+ selling of Modifications made by that Contributor either alone
+ and/or in combination with its Contributor Version (or portions
+ of such combination), to make, use, sell, offer for sale, have
+ made, and/or otherwise dispose of: 1) Modifications made by that
+ Contributor (or portions thereof); and 2) the combination of
+ Modifications made by that Contributor with its Contributor
+ Version (or portions of such combination).
+
+ (c) the licenses granted in Sections 2.2(a) and 2.2(b) are
+ effective on the date Contributor first makes Commercial Use of
+ the Covered Code.
+
+ (d) Notwithstanding Section 2.2(b) above, no patent license is
+ granted: 1) for any code that Contributor has deleted from the
+ Contributor Version; 2) separate from the Contributor Version;
+ 3) for infringements caused by: i) third party modifications of
+ Contributor Version or ii) the combination of Modifications made
+ by that Contributor with other software (except as part of the
+ Contributor Version) or other devices; or 4) under Patent Claims
+ infringed by Covered Code in the absence of Modifications made by
+ that Contributor.
+
+3. Distribution Obligations.
+
+ 3.1. Application of License.
+ The Modifications which You create or to which You contribute are
+ governed by the terms of this License, including without limitation
+ Section 2.2. The Source Code version of Covered Code may be
+ distributed only under the terms of this License or a future version
+ of this License released under Section 6.1, and You must include a
+ copy of this License with every copy of the Source Code You
+ distribute. You may not offer or impose any terms on any Source Code
+ version that alters or restricts the applicable version of this
+ License or the recipients' rights hereunder. However, You may include
+ an additional document offering the additional rights described in
+ Section 3.5.
+
+ 3.2. Availability of Source Code.
+ Any Modification which You create or to which You contribute must be
+ made available in Source Code form under the terms of this License
+ either on the same media as an Executable version or via an accepted
+ Electronic Distribution Mechanism to anyone to whom you made an
+ Executable version available; and if made available via Electronic
+ Distribution Mechanism, must remain available for at least twelve (12)
+ months after the date it initially became available, or at least six
+ (6) months after a subsequent version of that particular Modification
+ has been made available to such recipients. You are responsible for
+ ensuring that the Source Code version remains available even if the
+ Electronic Distribution Mechanism is maintained by a third party.
+
+ 3.3. Description of Modifications.
+ You must cause all Covered Code to which You contribute to contain a
+ file documenting the changes You made to create that Covered Code and
+ the date of any change. You must include a prominent statement that
+ the Modification is derived, directly or indirectly, from Original
+ Code provided by the Initial Developer and including the name of the
+ Initial Developer in (a) the Source Code, and (b) in any notice in an
+ Executable version or related documentation in which You describe the
+ origin or ownership of the Covered Code.
+
+ 3.4. Intellectual Property Matters
+ (a) Third Party Claims.
+ If Contributor has knowledge that a license under a third party's
+ intellectual property rights is required to exercise the rights
+ granted by such Contributor under Sections 2.1 or 2.2,
+ Contributor must include a text file with the Source Code
+ distribution titled "LEGAL" which describes the claim and the
+ party making the claim in sufficient detail that a recipient will
+ know whom to contact. If Contributor obtains such knowledge after
+ the Modification is made available as described in Section 3.2,
+ Contributor shall promptly modify the LEGAL file in all copies
+ Contributor makes available thereafter and shall take other steps
+ (such as notifying appropriate mailing lists or newsgroups)
+ reasonably calculated to inform those who received the Covered
+ Code that new knowledge has been obtained.
+
+ (b) Contributor APIs.
+ If Contributor's Modifications include an application programming
+ interface and Contributor has knowledge of patent licenses which
+ are reasonably necessary to implement that API, Contributor must
+ also include this information in the LEGAL file.
+
+ (c) Representations.
+ Contributor represents that, except as disclosed pursuant to
+ Section 3.4(a) above, Contributor believes that Contributor's
+ Modifications are Contributor's original creation(s) and/or
+ Contributor has sufficient rights to grant the rights conveyed by
+ this License.
+
+ 3.5. Required Notices.
+ You must duplicate the notice in Exhibit A in each file of the Source
+ Code. If it is not possible to put such notice in a particular Source
+ Code file due to its structure, then You must include such notice in a
+ location (such as a relevant directory) where a user would be likely
+ to look for such a notice. If You created one or more Modification(s)
+ You may add your name as a Contributor to the notice described in
+ Exhibit A. You must also duplicate this License in any documentation
+ for the Source Code where You describe recipients' rights or ownership
+ rights relating to Covered Code. You may choose to offer, and to
+ charge a fee for, warranty, support, indemnity or liability
+ obligations to one or more recipients of Covered Code. However, You
+ may do so only on Your own behalf, and not on behalf of the Initial
+ Developer or any Contributor. You must make it absolutely clear than
+ any such warranty, support, indemnity or liability obligation is
+ offered by You alone, and You hereby agree to indemnify the Initial
+ Developer and every Contributor for any liability incurred by the
+ Initial Developer or such Contributor as a result of warranty,
+ support, indemnity or liability terms You offer.
+
+ 3.6. Distribution of Executable Versions.
+ You may distribute Covered Code in Executable form only if the
+ requirements of Section 3.1-3.5 have been met for that Covered Code,
+ and if You include a notice stating that the Source Code version of
+ the Covered Code is available under the terms of this License,
+ including a description of how and where You have fulfilled the
+ obligations of Section 3.2. The notice must be conspicuously included
+ in any notice in an Executable version, related documentation or
+ collateral in which You describe recipients' rights relating to the
+ Covered Code. You may distribute the Executable version of Covered
+ Code or ownership rights under a license of Your choice, which may
+ contain terms different from this License, provided that You are in
+ compliance with the terms of this License and that the license for the
+ Executable version does not attempt to limit or alter the recipient's
+ rights in the Source Code version from the rights set forth in this
+ License. If You distribute the Executable version under a different
+ license You must make it absolutely clear that any terms which differ
+ from this License are offered by You alone, not by the Initial
+ Developer or any Contributor. You hereby agree to indemnify the
+ Initial Developer and every Contributor for any liability incurred by
+ the Initial Developer or such Contributor as a result of any such
+ terms You offer.
+
+ 3.7. Larger Works.
+ You may create a Larger Work by combining Covered Code with other code
+ not governed by the terms of this License and distribute the Larger
+ Work as a single product. In such a case, You must make sure the
+ requirements of this License are fulfilled for the Covered Code.
+
+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 Code 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 included in the LEGAL file described in Section 3.4 and must
+ be included with all distributions of the Source Code. 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. Application of this License.
+
+ This License applies to code to which the Initial Developer has
+ attached the notice in Exhibit A and to related Covered Code.
+
+6. Versions of the License.
+
+ 6.1. New Versions.
+ Netscape Communications Corporation ("Netscape") may publish revised
+ and/or new versions of the License from time to time. Each version
+ will be given a distinguishing version number.
+
+ 6.2. Effect of New Versions.
+ Once Covered Code has been published under a particular version of the
+ License, You may always continue to use it under the terms of that
+ version. You may also choose to use such Covered Code under the terms
+ of any subsequent version of the License published by Netscape. No one
+ other than Netscape has the right to modify the terms applicable to
+ Covered Code created under this License.
+
+ 6.3. Derivative Works.
+ If You create or use a modified version of this License (which you may
+ only do in order to apply it to code which is not already Covered Code
+ governed by this License), You must (a) rename Your license so that
+ the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape",
+ "MPL", "NPL" or any confusingly similar phrase do not appear in your
+ license (except to note that your license differs from this License)
+ and (b) otherwise make it clear that Your version of the license
+ contains terms which differ from the Mozilla Public License and
+ Netscape Public License. (Filling in the name of the Initial
+ Developer, Original Code or Contributor in the notice described in
+ Exhibit A shall not of themselves be deemed to be modifications of
+ this License.)
+
+7. DISCLAIMER OF WARRANTY.
+
+ COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+ WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE 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 CODE
+ IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT,
+ YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER 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 CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
+
+8. TERMINATION.
+
+ 8.1. This License and the rights granted hereunder will terminate
+ automatically if You fail to comply with terms herein and fail to cure
+ such breach within 30 days of becoming aware of the breach. All
+ sublicenses to the Covered Code which are properly granted shall
+ survive any termination of this License. Provisions which, by their
+ nature, must remain in effect beyond the termination of this License
+ shall survive.
+
+ 8.2. If You initiate litigation by asserting a patent infringement
+ claim (excluding declatory judgment actions) against Initial Developer
+ or a Contributor (the Initial Developer or Contributor against whom
+ You file such action is referred to as "Participant") alleging that:
+
+ (a) such Participant's Contributor Version directly or indirectly
+ infringes any patent, then any and all rights granted by such
+ Participant to You under Sections 2.1 and/or 2.2 of this License
+ shall, upon 60 days notice from Participant terminate prospectively,
+ unless if within 60 days after receipt of notice You either: (i)
+ agree in writing to pay Participant a mutually agreeable reasonable
+ royalty for Your past and future use of Modifications made by such
+ Participant, or (ii) withdraw Your litigation claim with respect to
+ the Contributor Version against such Participant. If within 60 days
+ of notice, a reasonable royalty and payment arrangement are not
+ mutually agreed upon in writing by the parties or the litigation claim
+ is not withdrawn, the rights granted by Participant to You under
+ Sections 2.1 and/or 2.2 automatically terminate at the expiration of
+ the 60 day notice period specified above.
+
+ (b) any software, hardware, or device, other than such Participant's
+ Contributor Version, directly or indirectly infringes any patent, then
+ any rights granted to You by such Participant under Sections 2.1(b)
+ and 2.2(b) are revoked effective as of the date You first made, used,
+ sold, distributed, or had made, Modifications made by that
+ Participant.
+
+ 8.3. If You assert a patent infringement claim against Participant
+ alleging that such Participant's Contributor Version directly or
+ indirectly infringes any patent where such claim is resolved (such as
+ by license or settlement) prior to the initiation of patent
+ infringement litigation, then the reasonable value of the licenses
+ granted by such Participant under Sections 2.1 or 2.2 shall be taken
+ into account in determining the amount or value of any payment or
+ license.
+
+ 8.4. In the event of termination under Sections 8.1 or 8.2 above,
+ all end user license agreements (excluding distributors and resellers)
+ which have been validly granted by You or any distributor hereunder
+ prior to termination shall survive termination.
+
+9. LIMITATION OF LIABILITY.
+
+ UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT
+ (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL
+ DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE,
+ OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR
+ ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY
+ CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR 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.
+
+10. U.S. GOVERNMENT END USERS.
+
+ The Covered Code is a "commercial item," as that term is defined in
+ 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer
+ software" and "commercial computer software documentation," as such
+ terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48
+ C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995),
+ all U.S. Government End Users acquire Covered Code with only those
+ rights set forth herein.
+
+11. MISCELLANEOUS.
+
+ This License represents the complete agreement concerning 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. This License shall be governed by
+ California law provisions (except to the extent applicable law, if
+ any, provides otherwise), excluding its conflict-of-law provisions.
+ With respect to disputes in which at least one party is a citizen of,
+ or an entity chartered or registered to do business in the United
+ States of America, any litigation relating to this License shall be
+ subject to the jurisdiction of the Federal Courts of the Northern
+ District of California, with venue lying in Santa Clara County,
+ California, with the losing party responsible for costs, including
+ without limitation, court costs and reasonable attorneys' fees and
+ expenses. The application of the United Nations Convention on
+ Contracts for the International Sale of Goods is expressly excluded.
+ Any law or regulation which provides that the language of a contract
+ shall be construed against the drafter shall not apply to this
+ License.
+
+12. RESPONSIBILITY FOR CLAIMS.
+
+ As between Initial Developer and the Contributors, each party is
+ responsible for claims and damages arising, directly or indirectly,
+ out of its utilization of rights under this License and You agree to
+ work with Initial Developer and Contributors to distribute such
+ responsibility on an equitable basis. Nothing herein is intended or
+ shall be deemed to constitute any admission of liability.
+
+13. MULTIPLE-LICENSED CODE.
+
+ Initial Developer may designate portions of the Covered Code as
+ "Multiple-Licensed". "Multiple-Licensed" means that the Initial
+ Developer permits you to utilize portions of the Covered Code under
+ Your choice of the NPL or the alternative licenses, if any, specified
+ by the Initial Developer in the file described in Exhibit A.
+
+EXHIBIT A -Mozilla Public License.
+
+ ``The contents of this file are subject to the Mozilla Public License
+ Version 1.1 (the "License"); you may not use this file except in
+ compliance with the License. You may obtain a copy of the License at
+ http://www.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ License for the specific language governing rights and limitations
+ under the License.
+
+ The Original Code is ______________________________________.
+
+ The Initial Developer of the Original Code is ________________________.
+ Portions created by ______________________ are Copyright (C) ______
+ _______________________. All Rights Reserved.
+
+ Contributor(s): ______________________________________.
+
+ Alternatively, the contents of this file may be used under the terms
+ of the _____ license (the "[___] License"), in which case the
+ provisions of [______] License are applicable instead of those
+ above. If you wish to allow use of your version of this file only
+ under the terms of the [____] License and not to allow others to use
+ your version of this file under the MPL, indicate your decision by
+ deleting the provisions above and replace them with the notice and
+ other provisions required by the [___] License. If you do not delete
+ the provisions above, a recipient may use your version of this file
+ under either the MPL or the [___] License."
+
+ [NOTE: The text of this Exhibit A may differ slightly from the text of
+ the notices in the Source Code files of the Original Code. You should
+ use the text of this Exhibit A rather than the text found in the
+ Original Code Source Code for Your Modifications.]
diff --git a/js/ckeditor/README.md b/js/ckeditor/README.md
new file mode 100644
index 0000000..c5a55cd
--- /dev/null
+++ b/js/ckeditor/README.md
@@ -0,0 +1,39 @@
+CKEditor 4
+==========
+
+Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved.
+http://ckeditor.com - See LICENSE.md for license information.
+
+CKEditor is a text editor to be used inside web pages. It's not a replacement
+for desktop text editors like Word or OpenOffice, but a component to be used as
+part of web applications and websites.
+
+## Documentation
+
+The full editor documentation is available online at the following address:
+http://docs.ckeditor.com
+
+## Installation
+
+Installing CKEditor is an easy task. Just follow these simple steps:
+
+ 1. **Download** the latest version from the CKEditor website:
+ http://ckeditor.com. You should have already completed this step, but be
+ sure you have the very latest version.
+ 2. **Extract** (decompress) the downloaded file into the root of your website.
+
+**Note:** CKEditor is by default installed in the `ckeditor` folder. You can
+place the files in whichever you want though.
+
+## Checking Your Installation
+
+The editor comes with a few sample pages that can be used to verify that
+installation proceeded properly. Take a look at the `samples` directory.
+
+To test your installation, just call the following page at your website:
+
+ http://<your site>/<CKEditor installation path>/samples/index.html
+
+For example:
+
+ http://www.example.com/ckeditor/samples/index.html
diff --git a/js/ckeditor/adapters/jquery.js b/js/ckeditor/adapters/jquery.js
new file mode 100644
index 0000000..704635f
--- /dev/null
+++ b/js/ckeditor/adapters/jquery.js
@@ -0,0 +1,10 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+(function(a){CKEDITOR.config.jqueryOverrideVal="undefined"==typeof CKEDITOR.config.jqueryOverrideVal?!0:CKEDITOR.config.jqueryOverrideVal;"undefined"!=typeof a&&(a.extend(a.fn,{ckeditorGet:function(){var a=this.eq(0).data("ckeditorInstance");if(!a)throw"CKEditor is not initialized yet, use ckeditor() with a callback.";return a},ckeditor:function(g,d){if(!CKEDITOR.env.isCompatible)throw Error("The environment is incompatible.");if(!a.isFunction(g))var k=d,d=g,g=k;var i=[],d=d||{};this.each(function(){var b=
+a(this),c=b.data("ckeditorInstance"),f=b.data("_ckeditorInstanceLock"),h=this,j=new a.Deferred;i.push(j.promise());if(c&&!f)g&&g.apply(c,[this]),j.resolve();else if(f)c.once("instanceReady",function(){setTimeout(function(){c.element?(c.element.$==h&&g&&g.apply(c,[h]),j.resolve()):setTimeout(arguments.callee,100)},0)},null,null,9999);else{if(d.autoUpdateElement||"undefined"==typeof d.autoUpdateElement&&CKEDITOR.config.autoUpdateElement)d.autoUpdateElementJquery=!0;d.autoUpdateElement=!1;b.data("_ckeditorInstanceLock",
+!0);c=a(this).is("textarea")?CKEDITOR.replace(h,d):CKEDITOR.inline(h,d);b.data("ckeditorInstance",c);c.on("instanceReady",function(d){var e=d.editor;setTimeout(function(){if(e.element){d.removeListener();e.on("dataReady",function(){b.trigger("dataReady.ckeditor",[e])});e.on("setData",function(a){b.trigger("setData.ckeditor",[e,a.data])});e.on("getData",function(a){b.trigger("getData.ckeditor",[e,a.data])},999);e.on("destroy",function(){b.trigger("destroy.ckeditor",[e])});e.on("save",function(){a(h.form).submit();
+return!1},null,null,20);if(e.config.autoUpdateElementJquery&&b.is("textarea")&&a(h.form).length){var c=function(){b.ckeditor(function(){e.updateElement()})};a(h.form).submit(c);a(h.form).bind("form-pre-serialize",c);b.bind("destroy.ckeditor",function(){a(h.form).unbind("submit",c);a(h.form).unbind("form-pre-serialize",c)})}e.on("destroy",function(){b.removeData("ckeditorInstance")});b.removeData("_ckeditorInstanceLock");b.trigger("instanceReady.ckeditor",[e]);g&&g.apply(e,[h]);j.resolve()}else setTimeout(arguments.callee,
+100)},0)},null,null,9999)}});var f=new a.Deferred;this.promise=f.promise();a.when.apply(this,i).then(function(){f.resolve()});this.editor=this.eq(0).data("ckeditorInstance");return this}}),CKEDITOR.config.jqueryOverrideVal&&(a.fn.val=CKEDITOR.tools.override(a.fn.val,function(g){return function(d){if(arguments.length){var k=this,i=[],f=this.each(function(){var b=a(this),c=b.data("ckeditorInstance");if(b.is("textarea")&&c){var f=new a.Deferred;c.setData(d,function(){f.resolve()});i.push(f.promise());
+return!0}return g.call(b,d)});if(i.length){var b=new a.Deferred;a.when.apply(this,i).done(function(){b.resolveWith(k)});return b.promise()}return f}var f=a(this).eq(0),c=f.data("ckeditorInstance");return f.is("textarea")&&c?c.getData():g.call(f)}})))})(window.jQuery); \ No newline at end of file
diff --git a/js/ckeditor/build-config.js b/js/ckeditor/build-config.js
new file mode 100644
index 0000000..6c34525
--- /dev/null
+++ b/js/ckeditor/build-config.js
@@ -0,0 +1,157 @@
+/**
+ * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md or http://ckeditor.com/license
+ */
+
+/**
+ * This file was added automatically by CKEditor builder.
+ * You may re-use it at any time to build CKEditor again.
+ *
+ * If you would like to build CKEditor online again
+ * (for example to upgrade), visit one the following links:
+ *
+ * (1) http://ckeditor.com/builder
+ * Visit online builder to build CKEditor from scratch.
+ *
+ * (2) http://ckeditor.com/builder/e41bccb8290b6d530f8478ddafe95c48
+ * Visit online builder to build CKEditor, starting with the same setup as before.
+ *
+ * (3) http://ckeditor.com/builder/download/e41bccb8290b6d530f8478ddafe95c48
+ * Straight download link to the latest version of CKEditor (Optimized) with the same setup as before.
+ *
+ * NOTE:
+ * This file is not used by CKEditor, you may remove it.
+ * Changing this file will not change your CKEditor configuration.
+ */
+
+var CKBUILDER_CONFIG = {
+ skin: 'moono',
+ preset: 'standard',
+ ignore: [
+ '.bender',
+ 'bender.js',
+ 'bender-err.log',
+ 'bender-out.log',
+ 'dev',
+ '.DS_Store',
+ '.editorconfig',
+ '.gitattributes',
+ '.gitignore',
+ 'gruntfile.js',
+ '.idea',
+ '.jscsrc',
+ '.jshintignore',
+ '.jshintrc',
+ '.mailmap',
+ 'node_modules',
+ 'package.json',
+ 'README.md',
+ 'tests'
+ ],
+ plugins : {
+ 'a11yhelp' : 1,
+ 'about' : 1,
+ 'basicstyles' : 1,
+ 'blockquote' : 1,
+ 'clipboard' : 1,
+ 'contextmenu' : 1,
+ 'elementspath' : 1,
+ 'enterkey' : 1,
+ 'entities' : 1,
+ 'filebrowser' : 1,
+ 'floatingspace' : 1,
+ 'format' : 1,
+ 'horizontalrule' : 1,
+ 'htmlwriter' : 1,
+ 'image' : 1,
+ 'indentlist' : 1,
+ 'link' : 1,
+ 'list' : 1,
+ 'magicline' : 1,
+ 'maximize' : 1,
+ 'pastefromword' : 1,
+ 'pastetext' : 1,
+ 'removeformat' : 1,
+ 'resize' : 1,
+ 'scayt' : 1,
+ 'showborders' : 1,
+ 'sourcearea' : 1,
+ 'specialchar' : 1,
+ 'stylescombo' : 1,
+ 'tab' : 1,
+ 'table' : 1,
+ 'tabletools' : 1,
+ 'toolbar' : 1,
+ 'undo' : 1,
+ 'wsc' : 1,
+ 'wysiwygarea' : 1
+ },
+ languages : {
+ 'af' : 1,
+ 'ar' : 1,
+ 'bg' : 1,
+ 'bn' : 1,
+ 'bs' : 1,
+ 'ca' : 1,
+ 'cs' : 1,
+ 'cy' : 1,
+ 'da' : 1,
+ 'de' : 1,
+ 'el' : 1,
+ 'en' : 1,
+ 'en-au' : 1,
+ 'en-ca' : 1,
+ 'en-gb' : 1,
+ 'eo' : 1,
+ 'es' : 1,
+ 'et' : 1,
+ 'eu' : 1,
+ 'fa' : 1,
+ 'fi' : 1,
+ 'fo' : 1,
+ 'fr' : 1,
+ 'fr-ca' : 1,
+ 'gl' : 1,
+ 'gu' : 1,
+ 'he' : 1,
+ 'hi' : 1,
+ 'hr' : 1,
+ 'hu' : 1,
+ 'id' : 1,
+ 'is' : 1,
+ 'it' : 1,
+ 'ja' : 1,
+ 'ka' : 1,
+ 'km' : 1,
+ 'ko' : 1,
+ 'ku' : 1,
+ 'lt' : 1,
+ 'lv' : 1,
+ 'mk' : 1,
+ 'mn' : 1,
+ 'ms' : 1,
+ 'nb' : 1,
+ 'nl' : 1,
+ 'no' : 1,
+ 'pl' : 1,
+ 'pt' : 1,
+ 'pt-br' : 1,
+ 'ro' : 1,
+ 'ru' : 1,
+ 'si' : 1,
+ 'sk' : 1,
+ 'sl' : 1,
+ 'sq' : 1,
+ 'sr' : 1,
+ 'sr-latn' : 1,
+ 'sv' : 1,
+ 'th' : 1,
+ 'tr' : 1,
+ 'tt' : 1,
+ 'ug' : 1,
+ 'uk' : 1,
+ 'vi' : 1,
+ 'zh' : 1,
+ 'zh-cn' : 1
+ }
+}; \ No newline at end of file
diff --git a/js/ckeditor/ckeditor.js b/js/ckeditor/ckeditor.js
new file mode 100644
index 0000000..9ab3617
--- /dev/null
+++ b/js/ckeditor/ckeditor.js
@@ -0,0 +1,946 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+(function(){if(window.CKEDITOR&&window.CKEDITOR.dom)return;window.CKEDITOR||(window.CKEDITOR=function(){var a=/(^|.*[\\\/])ckeditor\.js(?:\?.*|;.*)?$/i,f={timestamp:"F0RD",version:"4.4.7",revision:"3a35b3d",rnd:Math.floor(900*Math.random())+100,_:{pending:[],basePathSrcPattern:a},status:"unloaded",basePath:function(){var e=window.CKEDITOR_BASEPATH||"";if(!e)for(var d=document.getElementsByTagName("script"),c=0;c<d.length;c++){var b=d[c].src.match(a);if(b){e=b[1];break}}-1==e.indexOf(":/")&&"//"!=e.slice(0,2)&&(e=0===e.indexOf("/")?location.href.match(/^.*?:\/\/[^\/]*/)[0]+
+e:location.href.match(/^[^\?]*\/(?:)/)[0]+e);if(!e)throw'The CKEditor installation path could not be automatically detected. Please set the global variable "CKEDITOR_BASEPATH" before creating editor instances.';return e}(),getUrl:function(a){-1==a.indexOf(":/")&&0!==a.indexOf("/")&&(a=this.basePath+a);this.timestamp&&("/"!=a.charAt(a.length-1)&&!/[&?]t=/.test(a))&&(a+=(0<=a.indexOf("?")?"&":"?")+"t="+this.timestamp);return a},domReady:function(){function a(){try{document.addEventListener?(document.removeEventListener("DOMContentLoaded",
+a,!1),d()):document.attachEvent&&"complete"===document.readyState&&(document.detachEvent("onreadystatechange",a),d())}catch(c){}}function d(){for(var a;a=c.shift();)a()}var c=[];return function(d){function b(){try{document.documentElement.doScroll("left")}catch(m){setTimeout(b,1);return}a()}c.push(d);"complete"===document.readyState&&setTimeout(a,1);if(1==c.length)if(document.addEventListener)document.addEventListener("DOMContentLoaded",a,!1),window.addEventListener("load",a,!1);else if(document.attachEvent){document.attachEvent("onreadystatechange",
+a);window.attachEvent("onload",a);d=!1;try{d=!window.frameElement}catch(f){}document.documentElement.doScroll&&d&&b()}}}()},b=window.CKEDITOR_GETURL;if(b){var c=f.getUrl;f.getUrl=function(a){return b.call(f,a)||c.call(f,a)}}return f}());
+CKEDITOR.event||(CKEDITOR.event=function(){},CKEDITOR.event.implementOn=function(a){var f=CKEDITOR.event.prototype,b;for(b in f)a[b]==null&&(a[b]=f[b])},CKEDITOR.event.prototype=function(){function a(a){var e=f(this);return e[a]||(e[a]=new b(a))}var f=function(a){a=a.getPrivate&&a.getPrivate()||a._||(a._={});return a.events||(a.events={})},b=function(a){this.name=a;this.listeners=[]};b.prototype={getListenerIndex:function(a){for(var e=0,d=this.listeners;e<d.length;e++)if(d[e].fn==a)return e;return-1}};
+return{define:function(b,e){var d=a.call(this,b);CKEDITOR.tools.extend(d,e,true)},on:function(b,e,d,f,k){function j(a,m,y,s){a={name:b,sender:this,editor:a,data:m,listenerData:f,stop:y,cancel:s,removeListener:g};return e.call(d,a)===false?false:a.data}function g(){y.removeListener(b,e)}var m=a.call(this,b);if(m.getListenerIndex(e)<0){m=m.listeners;d||(d=this);isNaN(k)&&(k=10);var y=this;j.fn=e;j.priority=k;for(var s=m.length-1;s>=0;s--)if(m[s].priority<=k){m.splice(s+1,0,j);return{removeListener:g}}m.unshift(j)}return{removeListener:g}},
+once:function(){var a=Array.prototype.slice.call(arguments),e=a[1];a[1]=function(a){a.removeListener();return e.apply(this,arguments)};return this.on.apply(this,a)},capture:function(){CKEDITOR.event.useCapture=1;var a=this.on.apply(this,arguments);CKEDITOR.event.useCapture=0;return a},fire:function(){var a=0,e=function(){a=1},d=0,b=function(){d=1};return function(k,j,g){var m=f(this)[k],k=a,y=d;a=d=0;if(m){var s=m.listeners;if(s.length)for(var s=s.slice(0),w,q=0;q<s.length;q++){if(m.errorProof)try{w=
+s[q].call(this,g,j,e,b)}catch(t){}else w=s[q].call(this,g,j,e,b);w===false?d=1:typeof w!="undefined"&&(j=w);if(a||d)break}}j=d?false:typeof j=="undefined"?true:j;a=k;d=y;return j}}(),fireOnce:function(a,e,d){e=this.fire(a,e,d);delete f(this)[a];return e},removeListener:function(a,e){var d=f(this)[a];if(d){var b=d.getListenerIndex(e);b>=0&&d.listeners.splice(b,1)}},removeAllListeners:function(){var a=f(this),e;for(e in a)delete a[e]},hasListeners:function(a){return(a=f(this)[a])&&a.listeners.length>
+0}}}());CKEDITOR.editor||(CKEDITOR.editor=function(){CKEDITOR._.pending.push([this,arguments]);CKEDITOR.event.call(this)},CKEDITOR.editor.prototype.fire=function(a,f){a in{instanceReady:1,loaded:1}&&(this[a]=true);return CKEDITOR.event.prototype.fire.call(this,a,f,this)},CKEDITOR.editor.prototype.fireOnce=function(a,f){a in{instanceReady:1,loaded:1}&&(this[a]=true);return CKEDITOR.event.prototype.fireOnce.call(this,a,f,this)},CKEDITOR.event.implementOn(CKEDITOR.editor.prototype));
+CKEDITOR.env||(CKEDITOR.env=function(){var a=navigator.userAgent.toLowerCase(),f={ie:a.indexOf("trident/")>-1,webkit:a.indexOf(" applewebkit/")>-1,air:a.indexOf(" adobeair/")>-1,mac:a.indexOf("macintosh")>-1,quirks:document.compatMode=="BackCompat"&&(!document.documentMode||document.documentMode<10),mobile:a.indexOf("mobile")>-1,iOS:/(ipad|iphone|ipod)/.test(a),isCustomDomain:function(){if(!this.ie)return false;var a=document.domain,d=window.location.hostname;return a!=d&&a!="["+d+"]"},secure:location.protocol==
+"https:"};f.gecko=navigator.product=="Gecko"&&!f.webkit&&!f.ie;if(f.webkit)a.indexOf("chrome")>-1?f.chrome=true:f.safari=true;var b=0;if(f.ie){b=f.quirks||!document.documentMode?parseFloat(a.match(/msie (\d+)/)[1]):document.documentMode;f.ie9Compat=b==9;f.ie8Compat=b==8;f.ie7Compat=b==7;f.ie6Compat=b<7||f.quirks}if(f.gecko){var c=a.match(/rv:([\d\.]+)/);if(c){c=c[1].split(".");b=c[0]*1E4+(c[1]||0)*100+(c[2]||0)*1}}f.air&&(b=parseFloat(a.match(/ adobeair\/(\d+)/)[1]));f.webkit&&(b=parseFloat(a.match(/ applewebkit\/(\d+)/)[1]));
+f.version=b;f.isCompatible=f.iOS&&b>=534||!f.mobile&&(f.ie&&b>6||f.gecko&&b>=2E4||f.air&&b>=1||f.webkit&&b>=522||false);f.hidpi=window.devicePixelRatio>=2;f.needsBrFiller=f.gecko||f.webkit||f.ie&&b>10;f.needsNbspFiller=f.ie&&b<11;f.cssClass="cke_browser_"+(f.ie?"ie":f.gecko?"gecko":f.webkit?"webkit":"unknown");if(f.quirks)f.cssClass=f.cssClass+" cke_browser_quirks";if(f.ie)f.cssClass=f.cssClass+(" cke_browser_ie"+(f.quirks?"6 cke_browser_iequirks":f.version));if(f.air)f.cssClass=f.cssClass+" cke_browser_air";
+if(f.iOS)f.cssClass=f.cssClass+" cke_browser_ios";if(f.hidpi)f.cssClass=f.cssClass+" cke_hidpi";return f}());
+"unloaded"==CKEDITOR.status&&function(){CKEDITOR.event.implementOn(CKEDITOR);CKEDITOR.loadFullCore=function(){if(CKEDITOR.status!="basic_ready")CKEDITOR.loadFullCore._load=1;else{delete CKEDITOR.loadFullCore;var a=document.createElement("script");a.type="text/javascript";a.src=CKEDITOR.basePath+"ckeditor.js";document.getElementsByTagName("head")[0].appendChild(a)}};CKEDITOR.loadFullCoreTimeout=0;CKEDITOR.add=function(a){(this._.pending||(this._.pending=[])).push(a)};(function(){CKEDITOR.domReady(function(){var a=
+CKEDITOR.loadFullCore,f=CKEDITOR.loadFullCoreTimeout;if(a){CKEDITOR.status="basic_ready";a&&a._load?a():f&&setTimeout(function(){CKEDITOR.loadFullCore&&CKEDITOR.loadFullCore()},f*1E3)}})})();CKEDITOR.status="basic_loaded"}();CKEDITOR.dom={};
+(function(){var a=[],f=CKEDITOR.env.gecko?"-moz-":CKEDITOR.env.webkit?"-webkit-":CKEDITOR.env.ie?"-ms-":"",b=/&/g,c=/>/g,e=/</g,d=/"/g,h=/&amp;/g,k=/&gt;/g,j=/&lt;/g,g=/&quot;/g;CKEDITOR.on("reset",function(){a=[]});CKEDITOR.tools={arrayCompare:function(a,e){if(!a&&!e)return true;if(!a||!e||a.length!=e.length)return false;for(var d=0;d<a.length;d++)if(a[d]!=e[d])return false;return true},clone:function(a){var e;if(a&&a instanceof Array){e=[];for(var d=0;d<a.length;d++)e[d]=CKEDITOR.tools.clone(a[d]);
+return e}if(a===null||typeof a!="object"||a instanceof String||a instanceof Number||a instanceof Boolean||a instanceof Date||a instanceof RegExp||a.nodeType||a.window===a)return a;e=new a.constructor;for(d in a)e[d]=CKEDITOR.tools.clone(a[d]);return e},capitalize:function(a,e){return a.charAt(0).toUpperCase()+(e?a.slice(1):a.slice(1).toLowerCase())},extend:function(a){var e=arguments.length,d,b;if(typeof(d=arguments[e-1])=="boolean")e--;else if(typeof(d=arguments[e-2])=="boolean"){b=arguments[e-1];
+e=e-2}for(var c=1;c<e;c++){var f=arguments[c],i;for(i in f)if(d===true||a[i]==null)if(!b||i in b)a[i]=f[i]}return a},prototypedCopy:function(a){var e=function(){};e.prototype=a;return new e},copy:function(a){var e={},d;for(d in a)e[d]=a[d];return e},isArray:function(a){return Object.prototype.toString.call(a)=="[object Array]"},isEmpty:function(a){for(var e in a)if(a.hasOwnProperty(e))return false;return true},cssVendorPrefix:function(a,e,d){if(d)return f+a+":"+e+";"+a+":"+e;d={};d[a]=e;d[f+a]=e;
+return d},cssStyleToDomStyle:function(){var a=document.createElement("div").style,e=typeof a.cssFloat!="undefined"?"cssFloat":typeof a.styleFloat!="undefined"?"styleFloat":"float";return function(a){return a=="float"?e:a.replace(/-./g,function(a){return a.substr(1).toUpperCase()})}}(),buildStyleHtml:function(a){for(var a=[].concat(a),e,d=[],b=0;b<a.length;b++)if(e=a[b])/@import|[{}]/.test(e)?d.push("<style>"+e+"</style>"):d.push('<link type="text/css" rel=stylesheet href="'+e+'">');return d.join("")},
+htmlEncode:function(a){return(""+a).replace(b,"&amp;").replace(c,"&gt;").replace(e,"&lt;")},htmlDecode:function(a){return a.replace(h,"&").replace(k,">").replace(j,"<")},htmlEncodeAttr:function(a){return a.replace(d,"&quot;").replace(e,"&lt;").replace(c,"&gt;")},htmlDecodeAttr:function(a){return a.replace(g,'"').replace(j,"<").replace(k,">")},getNextNumber:function(){var a=0;return function(){return++a}}(),getNextId:function(){return"cke_"+this.getNextNumber()},override:function(a,e){var d=e(a);d.prototype=
+a.prototype;return d},setTimeout:function(a,e,d,b,c){c||(c=window);d||(d=c);return c.setTimeout(function(){b?a.apply(d,[].concat(b)):a.apply(d)},e||0)},trim:function(){var a=/(?:^[ \t\n\r]+)|(?:[ \t\n\r]+$)/g;return function(e){return e.replace(a,"")}}(),ltrim:function(){var a=/^[ \t\n\r]+/g;return function(e){return e.replace(a,"")}}(),rtrim:function(){var a=/[ \t\n\r]+$/g;return function(e){return e.replace(a,"")}}(),indexOf:function(a,e){if(typeof e=="function")for(var d=0,b=a.length;d<b;d++){if(e(a[d]))return d}else{if(a.indexOf)return a.indexOf(e);
+d=0;for(b=a.length;d<b;d++)if(a[d]===e)return d}return-1},search:function(a,e){var d=CKEDITOR.tools.indexOf(a,e);return d>=0?a[d]:null},bind:function(a,e){return function(){return a.apply(e,arguments)}},createClass:function(a){var e=a.$,d=a.base,b=a.privates||a._,c=a.proto,a=a.statics;!e&&(e=function(){d&&this.base.apply(this,arguments)});if(b)var f=e,e=function(){var a=this._||(this._={}),e;for(e in b){var d=b[e];a[e]=typeof d=="function"?CKEDITOR.tools.bind(d,this):d}f.apply(this,arguments)};if(d){e.prototype=
+this.prototypedCopy(d.prototype);e.prototype.constructor=e;e.base=d;e.baseProto=d.prototype;e.prototype.base=function(){this.base=d.prototype.base;d.apply(this,arguments);this.base=arguments.callee}}c&&this.extend(e.prototype,c,true);a&&this.extend(e,a,true);return e},addFunction:function(e,d){return a.push(function(){return e.apply(d||this,arguments)})-1},removeFunction:function(e){a[e]=null},callFunction:function(e){var d=a[e];return d&&d.apply(window,Array.prototype.slice.call(arguments,1))},cssLength:function(){var a=
+/^-?\d+\.?\d*px$/,e;return function(d){e=CKEDITOR.tools.trim(d+"")+"px";return a.test(e)?e:d||""}}(),convertToPx:function(){var a;return function(e){if(!a){a=CKEDITOR.dom.element.createFromHtml('<div style="position:absolute;left:-9999px;top:-9999px;margin:0px;padding:0px;border:0px;"></div>',CKEDITOR.document);CKEDITOR.document.getBody().append(a)}if(!/%$/.test(e)){a.setStyle("width",e);return a.$.clientWidth}return e}}(),repeat:function(a,e){return Array(e+1).join(a)},tryThese:function(){for(var a,
+e=0,d=arguments.length;e<d;e++){var b=arguments[e];try{a=b();break}catch(c){}}return a},genKey:function(){return Array.prototype.slice.call(arguments).join("-")},defer:function(a){return function(){var e=arguments,d=this;window.setTimeout(function(){a.apply(d,e)},0)}},normalizeCssText:function(a,e){var d=[],b,c=CKEDITOR.tools.parseCssText(a,true,e);for(b in c)d.push(b+":"+c[b]);d.sort();return d.length?d.join(";")+";":""},convertRgbToHex:function(a){return a.replace(/(?:rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\))/gi,
+function(a,e,d,b){a=[e,d,b];for(e=0;e<3;e++)a[e]=("0"+parseInt(a[e],10).toString(16)).slice(-2);return"#"+a.join("")})},parseCssText:function(a,e,d){var b={};if(d){d=new CKEDITOR.dom.element("span");d.setAttribute("style",a);a=CKEDITOR.tools.convertRgbToHex(d.getAttribute("style")||"")}if(!a||a==";")return b;a.replace(/&quot;/g,'"').replace(/\s*([^:;\s]+)\s*:\s*([^;]+)\s*(?=;|$)/g,function(a,d,m){if(e){d=d.toLowerCase();d=="font-family"&&(m=m.toLowerCase().replace(/["']/g,"").replace(/\s*,\s*/g,","));
+m=CKEDITOR.tools.trim(m)}b[d]=m});return b},writeCssText:function(a,e){var d,b=[];for(d in a)b.push(d+":"+a[d]);e&&b.sort();return b.join("; ")},objectCompare:function(a,e,d){var b;if(!a&&!e)return true;if(!a||!e)return false;for(b in a)if(a[b]!=e[b])return false;if(!d)for(b in e)if(a[b]!=e[b])return false;return true},objectKeys:function(a){var e=[],d;for(d in a)e.push(d);return e},convertArrayToObject:function(a,e){var d={};arguments.length==1&&(e=true);for(var b=0,c=a.length;b<c;++b)d[a[b]]=e;
+return d},fixDomain:function(){for(var a;;)try{a=window.parent.document.domain;break}catch(e){a=a?a.replace(/.+?(?:\.|$)/,""):document.domain;if(!a)break;document.domain=a}return!!a},eventsBuffer:function(a,e){function d(){c=(new Date).getTime();b=false;e()}var b,c=0;return{input:function(){if(!b){var e=(new Date).getTime()-c;e<a?b=setTimeout(d,a-e):d()}},reset:function(){b&&clearTimeout(b);b=c=0}}},enableHtml5Elements:function(a,e){for(var d=["abbr","article","aside","audio","bdi","canvas","data",
+"datalist","details","figcaption","figure","footer","header","hgroup","mark","meter","nav","output","progress","section","summary","time","video"],b=d.length,c;b--;){c=a.createElement(d[b]);e&&a.appendChild(c)}},checkIfAnyArrayItemMatches:function(a,e){for(var d=0,b=a.length;d<b;++d)if(a[d].match(e))return true;return false},checkIfAnyObjectPropertyMatches:function(a,e){for(var d in a)if(d.match(e))return true;return false},transparentImageData:"data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="}})();
+CKEDITOR.dtd=function(){var a=CKEDITOR.tools.extend,f=function(a,e){for(var d=CKEDITOR.tools.clone(a),b=1;b<arguments.length;b++){var e=arguments[b],c;for(c in e)delete d[c]}return d},b={},c={},e={address:1,article:1,aside:1,blockquote:1,details:1,div:1,dl:1,fieldset:1,figure:1,footer:1,form:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,header:1,hgroup:1,hr:1,main:1,menu:1,nav:1,ol:1,p:1,pre:1,section:1,table:1,ul:1},d={command:1,link:1,meta:1,noscript:1,script:1,style:1},h={},k={"#":1},j={center:1,dir:1,noframes:1};
+a(b,{a:1,abbr:1,area:1,audio:1,b:1,bdi:1,bdo:1,br:1,button:1,canvas:1,cite:1,code:1,command:1,datalist:1,del:1,dfn:1,em:1,embed:1,i:1,iframe:1,img:1,input:1,ins:1,kbd:1,keygen:1,label:1,map:1,mark:1,meter:1,noscript:1,object:1,output:1,progress:1,q:1,ruby:1,s:1,samp:1,script:1,select:1,small:1,span:1,strong:1,sub:1,sup:1,textarea:1,time:1,u:1,"var":1,video:1,wbr:1},k,{acronym:1,applet:1,basefont:1,big:1,font:1,isindex:1,strike:1,style:1,tt:1});a(c,e,b,j);f={a:f(b,{a:1,button:1}),abbr:b,address:c,
+area:h,article:c,aside:c,audio:a({source:1,track:1},c),b:b,base:h,bdi:b,bdo:b,blockquote:c,body:c,br:h,button:f(b,{a:1,button:1}),canvas:b,caption:c,cite:b,code:b,col:h,colgroup:{col:1},command:h,datalist:a({option:1},b),dd:c,del:b,details:a({summary:1},c),dfn:b,div:c,dl:{dt:1,dd:1},dt:c,em:b,embed:h,fieldset:a({legend:1},c),figcaption:c,figure:a({figcaption:1},c),footer:c,form:c,h1:b,h2:b,h3:b,h4:b,h5:b,h6:b,head:a({title:1,base:1},d),header:c,hgroup:{h1:1,h2:1,h3:1,h4:1,h5:1,h6:1},hr:h,html:a({head:1,
+body:1},c,d),i:b,iframe:k,img:h,input:h,ins:b,kbd:b,keygen:h,label:b,legend:b,li:c,link:h,main:c,map:c,mark:b,menu:a({li:1},c),meta:h,meter:f(b,{meter:1}),nav:c,noscript:a({link:1,meta:1,style:1},b),object:a({param:1},b),ol:{li:1},optgroup:{option:1},option:k,output:b,p:b,param:h,pre:b,progress:f(b,{progress:1}),q:b,rp:b,rt:b,ruby:a({rp:1,rt:1},b),s:b,samp:b,script:k,section:c,select:{optgroup:1,option:1},small:b,source:h,span:b,strong:b,style:k,sub:b,summary:b,sup:b,table:{caption:1,colgroup:1,thead:1,
+tfoot:1,tbody:1,tr:1},tbody:{tr:1},td:c,textarea:k,tfoot:{tr:1},th:c,thead:{tr:1},time:f(b,{time:1}),title:k,tr:{th:1,td:1},track:h,u:b,ul:{li:1},"var":b,video:a({source:1,track:1},c),wbr:h,acronym:b,applet:a({param:1},c),basefont:h,big:b,center:c,dialog:h,dir:{li:1},font:b,isindex:h,noframes:c,strike:b,tt:b};a(f,{$block:a({audio:1,dd:1,dt:1,figcaption:1,li:1,video:1},e,j),$blockLimit:{article:1,aside:1,audio:1,body:1,caption:1,details:1,dir:1,div:1,dl:1,fieldset:1,figcaption:1,figure:1,footer:1,
+form:1,header:1,hgroup:1,main:1,menu:1,nav:1,ol:1,section:1,table:1,td:1,th:1,tr:1,ul:1,video:1},$cdata:{script:1,style:1},$editable:{address:1,article:1,aside:1,blockquote:1,body:1,details:1,div:1,fieldset:1,figcaption:1,footer:1,form:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,header:1,hgroup:1,main:1,nav:1,p:1,pre:1,section:1},$empty:{area:1,base:1,basefont:1,br:1,col:1,command:1,dialog:1,embed:1,hr:1,img:1,input:1,isindex:1,keygen:1,link:1,meta:1,param:1,source:1,track:1,wbr:1},$inline:b,$list:{dl:1,ol:1,
+ul:1},$listItem:{dd:1,dt:1,li:1},$nonBodyContent:a({body:1,head:1,html:1},f.head),$nonEditable:{applet:1,audio:1,button:1,embed:1,iframe:1,map:1,object:1,option:1,param:1,script:1,textarea:1,video:1},$object:{applet:1,audio:1,button:1,hr:1,iframe:1,img:1,input:1,object:1,select:1,table:1,textarea:1,video:1},$removeEmpty:{abbr:1,acronym:1,b:1,bdi:1,bdo:1,big:1,cite:1,code:1,del:1,dfn:1,em:1,font:1,i:1,ins:1,label:1,kbd:1,mark:1,meter:1,output:1,q:1,ruby:1,s:1,samp:1,small:1,span:1,strike:1,strong:1,
+sub:1,sup:1,time:1,tt:1,u:1,"var":1},$tabIndex:{a:1,area:1,button:1,input:1,object:1,select:1,textarea:1},$tableContent:{caption:1,col:1,colgroup:1,tbody:1,td:1,tfoot:1,th:1,thead:1,tr:1},$transparent:{a:1,audio:1,canvas:1,del:1,ins:1,map:1,noscript:1,object:1,video:1},$intermediate:{caption:1,colgroup:1,dd:1,dt:1,figcaption:1,legend:1,li:1,optgroup:1,option:1,rp:1,rt:1,summary:1,tbody:1,td:1,tfoot:1,th:1,thead:1,tr:1}});return f}();CKEDITOR.dom.event=function(a){this.$=a};
+CKEDITOR.dom.event.prototype={getKey:function(){return this.$.keyCode||this.$.which},getKeystroke:function(){var a=this.getKey();if(this.$.ctrlKey||this.$.metaKey)a=a+CKEDITOR.CTRL;this.$.shiftKey&&(a=a+CKEDITOR.SHIFT);this.$.altKey&&(a=a+CKEDITOR.ALT);return a},preventDefault:function(a){var f=this.$;f.preventDefault?f.preventDefault():f.returnValue=false;a&&this.stopPropagation()},stopPropagation:function(){var a=this.$;a.stopPropagation?a.stopPropagation():a.cancelBubble=true},getTarget:function(){var a=
+this.$.target||this.$.srcElement;return a?new CKEDITOR.dom.node(a):null},getPhase:function(){return this.$.eventPhase||2},getPageOffset:function(){var a=this.getTarget().getDocument().$;return{x:this.$.pageX||this.$.clientX+(a.documentElement.scrollLeft||a.body.scrollLeft),y:this.$.pageY||this.$.clientY+(a.documentElement.scrollTop||a.body.scrollTop)}}};CKEDITOR.CTRL=1114112;CKEDITOR.SHIFT=2228224;CKEDITOR.ALT=4456448;CKEDITOR.EVENT_PHASE_CAPTURING=1;CKEDITOR.EVENT_PHASE_AT_TARGET=2;
+CKEDITOR.EVENT_PHASE_BUBBLING=3;CKEDITOR.dom.domObject=function(a){if(a)this.$=a};
+CKEDITOR.dom.domObject.prototype=function(){var a=function(a,b){return function(c){typeof CKEDITOR!="undefined"&&a.fire(b,new CKEDITOR.dom.event(c))}};return{getPrivate:function(){var a;if(!(a=this.getCustomData("_")))this.setCustomData("_",a={});return a},on:function(f){var b=this.getCustomData("_cke_nativeListeners");if(!b){b={};this.setCustomData("_cke_nativeListeners",b)}if(!b[f]){b=b[f]=a(this,f);this.$.addEventListener?this.$.addEventListener(f,b,!!CKEDITOR.event.useCapture):this.$.attachEvent&&
+this.$.attachEvent("on"+f,b)}return CKEDITOR.event.prototype.on.apply(this,arguments)},removeListener:function(a){CKEDITOR.event.prototype.removeListener.apply(this,arguments);if(!this.hasListeners(a)){var b=this.getCustomData("_cke_nativeListeners"),c=b&&b[a];if(c){this.$.removeEventListener?this.$.removeEventListener(a,c,false):this.$.detachEvent&&this.$.detachEvent("on"+a,c);delete b[a]}}},removeAllListeners:function(){var a=this.getCustomData("_cke_nativeListeners"),b;for(b in a){var c=a[b];this.$.detachEvent?
+this.$.detachEvent("on"+b,c):this.$.removeEventListener&&this.$.removeEventListener(b,c,false);delete a[b]}CKEDITOR.event.prototype.removeAllListeners.call(this)}}}();
+(function(a){var f={};CKEDITOR.on("reset",function(){f={}});a.equals=function(a){try{return a&&a.$===this.$}catch(c){return false}};a.setCustomData=function(a,c){var e=this.getUniqueId();(f[e]||(f[e]={}))[a]=c;return this};a.getCustomData=function(a){var c=this.$["data-cke-expando"];return(c=c&&f[c])&&a in c?c[a]:null};a.removeCustomData=function(a){var c=this.$["data-cke-expando"],c=c&&f[c],e,d;if(c){e=c[a];d=a in c;delete c[a]}return d?e:null};a.clearCustomData=function(){this.removeAllListeners();
+var a=this.$["data-cke-expando"];a&&delete f[a]};a.getUniqueId=function(){return this.$["data-cke-expando"]||(this.$["data-cke-expando"]=CKEDITOR.tools.getNextNumber())};CKEDITOR.event.implementOn(a)})(CKEDITOR.dom.domObject.prototype);
+CKEDITOR.dom.node=function(a){return a?new CKEDITOR.dom[a.nodeType==CKEDITOR.NODE_DOCUMENT?"document":a.nodeType==CKEDITOR.NODE_ELEMENT?"element":a.nodeType==CKEDITOR.NODE_TEXT?"text":a.nodeType==CKEDITOR.NODE_COMMENT?"comment":a.nodeType==CKEDITOR.NODE_DOCUMENT_FRAGMENT?"documentFragment":"domObject"](a):this};CKEDITOR.dom.node.prototype=new CKEDITOR.dom.domObject;CKEDITOR.NODE_ELEMENT=1;CKEDITOR.NODE_DOCUMENT=9;CKEDITOR.NODE_TEXT=3;CKEDITOR.NODE_COMMENT=8;CKEDITOR.NODE_DOCUMENT_FRAGMENT=11;
+CKEDITOR.POSITION_IDENTICAL=0;CKEDITOR.POSITION_DISCONNECTED=1;CKEDITOR.POSITION_FOLLOWING=2;CKEDITOR.POSITION_PRECEDING=4;CKEDITOR.POSITION_IS_CONTAINED=8;CKEDITOR.POSITION_CONTAINS=16;
+CKEDITOR.tools.extend(CKEDITOR.dom.node.prototype,{appendTo:function(a,f){a.append(this,f);return a},clone:function(a,f){var b=this.$.cloneNode(a),c=function(e){e["data-cke-expando"]&&(e["data-cke-expando"]=false);if(e.nodeType==CKEDITOR.NODE_ELEMENT){f||e.removeAttribute("id",false);if(a)for(var e=e.childNodes,d=0;d<e.length;d++)c(e[d])}};c(b);return new CKEDITOR.dom.node(b)},hasPrevious:function(){return!!this.$.previousSibling},hasNext:function(){return!!this.$.nextSibling},insertAfter:function(a){a.$.parentNode.insertBefore(this.$,
+a.$.nextSibling);return a},insertBefore:function(a){a.$.parentNode.insertBefore(this.$,a.$);return a},insertBeforeMe:function(a){this.$.parentNode.insertBefore(a.$,this.$);return a},getAddress:function(a){for(var f=[],b=this.getDocument().$.documentElement,c=this.$;c&&c!=b;){var e=c.parentNode;e&&f.unshift(this.getIndex.call({$:c},a));c=e}return f},getDocument:function(){return new CKEDITOR.dom.document(this.$.ownerDocument||this.$.parentNode.ownerDocument)},getIndex:function(a){function f(a,e){var b=
+e?a.nextSibling:a.previousSibling;return!b||b.nodeType!=CKEDITOR.NODE_TEXT?null:b.nodeValue?b:f(b,e)}var b=this.$,c=-1,e;if(!this.$.parentNode||a&&b.nodeType==CKEDITOR.NODE_TEXT&&!b.nodeValue&&!f(b)&&!f(b,true))return-1;do if(!a||!(b!=this.$&&b.nodeType==CKEDITOR.NODE_TEXT&&(e||!b.nodeValue))){c++;e=b.nodeType==CKEDITOR.NODE_TEXT}while(b=b.previousSibling);return c},getNextSourceNode:function(a,f,b){if(b&&!b.call)var c=b,b=function(a){return!a.equals(c)};var a=!a&&this.getFirst&&this.getFirst(),e;
+if(!a){if(this.type==CKEDITOR.NODE_ELEMENT&&b&&b(this,true)===false)return null;a=this.getNext()}for(;!a&&(e=(e||this).getParent());){if(b&&b(e,true)===false)return null;a=e.getNext()}return!a||b&&b(a)===false?null:f&&f!=a.type?a.getNextSourceNode(false,f,b):a},getPreviousSourceNode:function(a,f,b){if(b&&!b.call)var c=b,b=function(a){return!a.equals(c)};var a=!a&&this.getLast&&this.getLast(),e;if(!a){if(this.type==CKEDITOR.NODE_ELEMENT&&b&&b(this,true)===false)return null;a=this.getPrevious()}for(;!a&&
+(e=(e||this).getParent());){if(b&&b(e,true)===false)return null;a=e.getPrevious()}return!a||b&&b(a)===false?null:f&&a.type!=f?a.getPreviousSourceNode(false,f,b):a},getPrevious:function(a){var f=this.$,b;do b=(f=f.previousSibling)&&f.nodeType!=10&&new CKEDITOR.dom.node(f);while(b&&a&&!a(b));return b},getNext:function(a){var f=this.$,b;do b=(f=f.nextSibling)&&new CKEDITOR.dom.node(f);while(b&&a&&!a(b));return b},getParent:function(a){var f=this.$.parentNode;return f&&(f.nodeType==CKEDITOR.NODE_ELEMENT||
+a&&f.nodeType==CKEDITOR.NODE_DOCUMENT_FRAGMENT)?new CKEDITOR.dom.node(f):null},getParents:function(a){var f=this,b=[];do b[a?"push":"unshift"](f);while(f=f.getParent());return b},getCommonAncestor:function(a){if(a.equals(this))return this;if(a.contains&&a.contains(this))return a;var f=this.contains?this:this.getParent();do if(f.contains(a))return f;while(f=f.getParent());return null},getPosition:function(a){var f=this.$,b=a.$;if(f.compareDocumentPosition)return f.compareDocumentPosition(b);if(f==
+b)return CKEDITOR.POSITION_IDENTICAL;if(this.type==CKEDITOR.NODE_ELEMENT&&a.type==CKEDITOR.NODE_ELEMENT){if(f.contains){if(f.contains(b))return CKEDITOR.POSITION_CONTAINS+CKEDITOR.POSITION_PRECEDING;if(b.contains(f))return CKEDITOR.POSITION_IS_CONTAINED+CKEDITOR.POSITION_FOLLOWING}if("sourceIndex"in f)return f.sourceIndex<0||b.sourceIndex<0?CKEDITOR.POSITION_DISCONNECTED:f.sourceIndex<b.sourceIndex?CKEDITOR.POSITION_PRECEDING:CKEDITOR.POSITION_FOLLOWING}for(var f=this.getAddress(),a=a.getAddress(),
+b=Math.min(f.length,a.length),c=0;c<=b-1;c++)if(f[c]!=a[c]){if(c<b)return f[c]<a[c]?CKEDITOR.POSITION_PRECEDING:CKEDITOR.POSITION_FOLLOWING;break}return f.length<a.length?CKEDITOR.POSITION_CONTAINS+CKEDITOR.POSITION_PRECEDING:CKEDITOR.POSITION_IS_CONTAINED+CKEDITOR.POSITION_FOLLOWING},getAscendant:function(a,f){var b=this.$,c,e;if(!f)b=b.parentNode;if(typeof a=="function"){e=true;c=a}else{e=false;c=function(e){e=typeof e.nodeName=="string"?e.nodeName.toLowerCase():"";return typeof a=="string"?e==
+a:e in a}}for(;b;){if(c(e?new CKEDITOR.dom.node(b):b))return new CKEDITOR.dom.node(b);try{b=b.parentNode}catch(d){b=null}}return null},hasAscendant:function(a,f){var b=this.$;if(!f)b=b.parentNode;for(;b;){if(b.nodeName&&b.nodeName.toLowerCase()==a)return true;b=b.parentNode}return false},move:function(a,f){a.append(this.remove(),f)},remove:function(a){var f=this.$,b=f.parentNode;if(b){if(a)for(;a=f.firstChild;)b.insertBefore(f.removeChild(a),f);b.removeChild(f)}return this},replace:function(a){this.insertBefore(a);
+a.remove()},trim:function(){this.ltrim();this.rtrim()},ltrim:function(){for(var a;this.getFirst&&(a=this.getFirst());){if(a.type==CKEDITOR.NODE_TEXT){var f=CKEDITOR.tools.ltrim(a.getText()),b=a.getLength();if(f){if(f.length<b){a.split(b-f.length);this.$.removeChild(this.$.firstChild)}}else{a.remove();continue}}break}},rtrim:function(){for(var a;this.getLast&&(a=this.getLast());){if(a.type==CKEDITOR.NODE_TEXT){var f=CKEDITOR.tools.rtrim(a.getText()),b=a.getLength();if(f){if(f.length<b){a.split(f.length);
+this.$.lastChild.parentNode.removeChild(this.$.lastChild)}}else{a.remove();continue}}break}if(CKEDITOR.env.needsBrFiller)(a=this.$.lastChild)&&(a.type==1&&a.nodeName.toLowerCase()=="br")&&a.parentNode.removeChild(a)},isReadOnly:function(){var a=this;this.type!=CKEDITOR.NODE_ELEMENT&&(a=this.getParent());if(a&&typeof a.$.isContentEditable!="undefined")return!(a.$.isContentEditable||a.data("cke-editable"));for(;a;){if(a.data("cke-editable"))break;if(a.getAttribute("contentEditable")=="false")return true;
+if(a.getAttribute("contentEditable")=="true")break;a=a.getParent()}return!a}});CKEDITOR.dom.window=function(a){CKEDITOR.dom.domObject.call(this,a)};CKEDITOR.dom.window.prototype=new CKEDITOR.dom.domObject;
+CKEDITOR.tools.extend(CKEDITOR.dom.window.prototype,{focus:function(){this.$.focus()},getViewPaneSize:function(){var a=this.$.document,f=a.compatMode=="CSS1Compat";return{width:(f?a.documentElement.clientWidth:a.body.clientWidth)||0,height:(f?a.documentElement.clientHeight:a.body.clientHeight)||0}},getScrollPosition:function(){var a=this.$;if("pageXOffset"in a)return{x:a.pageXOffset||0,y:a.pageYOffset||0};a=a.document;return{x:a.documentElement.scrollLeft||a.body.scrollLeft||0,y:a.documentElement.scrollTop||
+a.body.scrollTop||0}},getFrame:function(){var a=this.$.frameElement;return a?new CKEDITOR.dom.element.get(a):null}});CKEDITOR.dom.document=function(a){CKEDITOR.dom.domObject.call(this,a)};CKEDITOR.dom.document.prototype=new CKEDITOR.dom.domObject;
+CKEDITOR.tools.extend(CKEDITOR.dom.document.prototype,{type:CKEDITOR.NODE_DOCUMENT,appendStyleSheet:function(a){if(this.$.createStyleSheet)this.$.createStyleSheet(a);else{var f=new CKEDITOR.dom.element("link");f.setAttributes({rel:"stylesheet",type:"text/css",href:a});this.getHead().append(f)}},appendStyleText:function(a){if(this.$.createStyleSheet){var f=this.$.createStyleSheet("");f.cssText=a}else{var b=new CKEDITOR.dom.element("style",this);b.append(new CKEDITOR.dom.text(a,this));this.getHead().append(b)}return f||
+b.$.sheet},createElement:function(a,f){var b=new CKEDITOR.dom.element(a,this);if(f){f.attributes&&b.setAttributes(f.attributes);f.styles&&b.setStyles(f.styles)}return b},createText:function(a){return new CKEDITOR.dom.text(a,this)},focus:function(){this.getWindow().focus()},getActive:function(){var a;try{a=this.$.activeElement}catch(f){return null}return new CKEDITOR.dom.element(a)},getById:function(a){return(a=this.$.getElementById(a))?new CKEDITOR.dom.element(a):null},getByAddress:function(a,f){for(var b=
+this.$.documentElement,c=0;b&&c<a.length;c++){var e=a[c];if(f)for(var d=-1,h=0;h<b.childNodes.length;h++){var k=b.childNodes[h];if(!(f===true&&k.nodeType==3&&k.previousSibling&&k.previousSibling.nodeType==3)){d++;if(d==e){b=k;break}}}else b=b.childNodes[e]}return b?new CKEDITOR.dom.node(b):null},getElementsByTag:function(a,f){!(CKEDITOR.env.ie&&document.documentMode<=8)&&f&&(a=f+":"+a);return new CKEDITOR.dom.nodeList(this.$.getElementsByTagName(a))},getHead:function(){var a=this.$.getElementsByTagName("head")[0];
+return a=a?new CKEDITOR.dom.element(a):this.getDocumentElement().append(new CKEDITOR.dom.element("head"),true)},getBody:function(){return new CKEDITOR.dom.element(this.$.body)},getDocumentElement:function(){return new CKEDITOR.dom.element(this.$.documentElement)},getWindow:function(){return new CKEDITOR.dom.window(this.$.parentWindow||this.$.defaultView)},write:function(a){this.$.open("text/html","replace");CKEDITOR.env.ie&&(a=a.replace(/(?:^\s*<!DOCTYPE[^>]*?>)|^/i,'$&\n<script data-cke-temp="1">('+
+CKEDITOR.tools.fixDomain+")();<\/script>"));this.$.write(a);this.$.close()},find:function(a){return new CKEDITOR.dom.nodeList(this.$.querySelectorAll(a))},findOne:function(a){return(a=this.$.querySelector(a))?new CKEDITOR.dom.element(a):null},_getHtml5ShivFrag:function(){var a=this.getCustomData("html5ShivFrag");if(!a){a=this.$.createDocumentFragment();CKEDITOR.tools.enableHtml5Elements(a,true);this.setCustomData("html5ShivFrag",a)}return a}});CKEDITOR.dom.nodeList=function(a){this.$=a};
+CKEDITOR.dom.nodeList.prototype={count:function(){return this.$.length},getItem:function(a){if(a<0||a>=this.$.length)return null;return(a=this.$[a])?new CKEDITOR.dom.node(a):null}};CKEDITOR.dom.element=function(a,f){typeof a=="string"&&(a=(f?f.$:document).createElement(a));CKEDITOR.dom.domObject.call(this,a)};CKEDITOR.dom.element.get=function(a){return(a=typeof a=="string"?document.getElementById(a)||document.getElementsByName(a)[0]:a)&&(a.$?a:new CKEDITOR.dom.element(a))};
+CKEDITOR.dom.element.prototype=new CKEDITOR.dom.node;CKEDITOR.dom.element.createFromHtml=function(a,f){var b=new CKEDITOR.dom.element("div",f);b.setHtml(a);return b.getFirst().remove()};
+CKEDITOR.dom.element.setMarker=function(a,f,b,c){var e=f.getCustomData("list_marker_id")||f.setCustomData("list_marker_id",CKEDITOR.tools.getNextNumber()).getCustomData("list_marker_id"),d=f.getCustomData("list_marker_names")||f.setCustomData("list_marker_names",{}).getCustomData("list_marker_names");a[e]=f;d[b]=1;return f.setCustomData(b,c)};CKEDITOR.dom.element.clearAllMarkers=function(a){for(var f in a)CKEDITOR.dom.element.clearMarkers(a,a[f],1)};
+CKEDITOR.dom.element.clearMarkers=function(a,f,b){var c=f.getCustomData("list_marker_names"),e=f.getCustomData("list_marker_id"),d;for(d in c)f.removeCustomData(d);f.removeCustomData("list_marker_names");if(b){f.removeCustomData("list_marker_id");delete a[e]}};
+(function(){function a(a){var d=true;if(!a.$.id){a.$.id="cke_tmp_"+CKEDITOR.tools.getNextNumber();d=false}return function(){d||a.removeAttribute("id")}}function f(a,d){return"#"+a.$.id+" "+d.split(/,\s*/).join(", #"+a.$.id+" ")}function b(a){for(var d=0,b=0,f=c[a].length;b<f;b++)d=d+(parseInt(this.getComputedStyle(c[a][b])||0,10)||0);return d}CKEDITOR.tools.extend(CKEDITOR.dom.element.prototype,{type:CKEDITOR.NODE_ELEMENT,addClass:function(a){var d=this.$.className;d&&(RegExp("(?:^|\\s)"+a+"(?:\\s|$)",
+"").test(d)||(d=d+(" "+a)));this.$.className=d||a;return this},removeClass:function(a){var d=this.getAttribute("class");if(d){a=RegExp("(?:^|\\s+)"+a+"(?=\\s|$)","i");if(a.test(d))(d=d.replace(a,"").replace(/^\s+/,""))?this.setAttribute("class",d):this.removeAttribute("class")}return this},hasClass:function(a){return RegExp("(?:^|\\s+)"+a+"(?=\\s|$)","").test(this.getAttribute("class"))},append:function(a,d){typeof a=="string"&&(a=this.getDocument().createElement(a));d?this.$.insertBefore(a.$,this.$.firstChild):
+this.$.appendChild(a.$);return a},appendHtml:function(a){if(this.$.childNodes.length){var d=new CKEDITOR.dom.element("div",this.getDocument());d.setHtml(a);d.moveChildren(this)}else this.setHtml(a)},appendText:function(a){this.$.text!=null?this.$.text=this.$.text+a:this.append(new CKEDITOR.dom.text(a))},appendBogus:function(a){if(a||CKEDITOR.env.needsBrFiller){for(a=this.getLast();a&&a.type==CKEDITOR.NODE_TEXT&&!CKEDITOR.tools.rtrim(a.getText());)a=a.getPrevious();if(!a||!a.is||!a.is("br")){a=this.getDocument().createElement("br");
+CKEDITOR.env.gecko&&a.setAttribute("type","_moz");this.append(a)}}},breakParent:function(a){var d=new CKEDITOR.dom.range(this.getDocument());d.setStartAfter(this);d.setEndAfter(a);a=d.extractContents();d.insertNode(this.remove());a.insertAfterNode(this)},contains:CKEDITOR.env.ie||CKEDITOR.env.webkit?function(a){var d=this.$;return a.type!=CKEDITOR.NODE_ELEMENT?d.contains(a.getParent().$):d!=a.$&&d.contains(a.$)}:function(a){return!!(this.$.compareDocumentPosition(a.$)&16)},focus:function(){function a(){try{this.$.focus()}catch(e){}}
+return function(d){d?CKEDITOR.tools.setTimeout(a,100,this):a.call(this)}}(),getHtml:function(){var a=this.$.innerHTML;return CKEDITOR.env.ie?a.replace(/<\?[^>]*>/g,""):a},getOuterHtml:function(){if(this.$.outerHTML)return this.$.outerHTML.replace(/<\?[^>]*>/,"");var a=this.$.ownerDocument.createElement("div");a.appendChild(this.$.cloneNode(true));return a.innerHTML},getClientRect:function(){var a=CKEDITOR.tools.extend({},this.$.getBoundingClientRect());!a.width&&(a.width=a.right-a.left);!a.height&&
+(a.height=a.bottom-a.top);return a},setHtml:CKEDITOR.env.ie&&CKEDITOR.env.version<9?function(a){try{var d=this.$;if(this.getParent())return d.innerHTML=a;var b=this.getDocument()._getHtml5ShivFrag();b.appendChild(d);d.innerHTML=a;b.removeChild(d);return a}catch(c){this.$.innerHTML="";d=new CKEDITOR.dom.element("body",this.getDocument());d.$.innerHTML=a;for(d=d.getChildren();d.count();)this.append(d.getItem(0));return a}}:function(a){return this.$.innerHTML=a},setText:function(){var a=document.createElement("p");
+a.innerHTML="x";a=a.textContent;return function(d){this.$[a?"textContent":"innerText"]=d}}(),getAttribute:function(){var a=function(a){return this.$.getAttribute(a,2)};return CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.quirks)?function(a){switch(a){case "class":a="className";break;case "http-equiv":a="httpEquiv";break;case "name":return this.$.name;case "tabindex":a=this.$.getAttribute(a,2);a!==0&&this.$.tabIndex===0&&(a=null);return a;case "checked":a=this.$.attributes.getNamedItem(a);
+return(a.specified?a.nodeValue:this.$.checked)?"checked":null;case "hspace":case "value":return this.$[a];case "style":return this.$.style.cssText;case "contenteditable":case "contentEditable":return this.$.attributes.getNamedItem("contentEditable").specified?this.$.getAttribute("contentEditable"):null}return this.$.getAttribute(a,2)}:a}(),getChildren:function(){return new CKEDITOR.dom.nodeList(this.$.childNodes)},getComputedStyle:CKEDITOR.env.ie?function(a){return this.$.currentStyle[CKEDITOR.tools.cssStyleToDomStyle(a)]}:
+function(a){var d=this.getWindow().$.getComputedStyle(this.$,null);return d?d.getPropertyValue(a):""},getDtd:function(){var a=CKEDITOR.dtd[this.getName()];this.getDtd=function(){return a};return a},getElementsByTag:CKEDITOR.dom.document.prototype.getElementsByTag,getTabIndex:CKEDITOR.env.ie?function(){var a=this.$.tabIndex;a===0&&(!CKEDITOR.dtd.$tabIndex[this.getName()]&&parseInt(this.getAttribute("tabindex"),10)!==0)&&(a=-1);return a}:CKEDITOR.env.webkit?function(){var a=this.$.tabIndex;if(a===void 0){a=
+parseInt(this.getAttribute("tabindex"),10);isNaN(a)&&(a=-1)}return a}:function(){return this.$.tabIndex},getText:function(){return this.$.textContent||this.$.innerText||""},getWindow:function(){return this.getDocument().getWindow()},getId:function(){return this.$.id||null},getNameAtt:function(){return this.$.name||null},getName:function(){var a=this.$.nodeName.toLowerCase();if(CKEDITOR.env.ie&&document.documentMode<=8){var d=this.$.scopeName;d!="HTML"&&(a=d.toLowerCase()+":"+a)}this.getName=function(){return a};
+return this.getName()},getValue:function(){return this.$.value},getFirst:function(a){var d=this.$.firstChild;(d=d&&new CKEDITOR.dom.node(d))&&(a&&!a(d))&&(d=d.getNext(a));return d},getLast:function(a){var d=this.$.lastChild;(d=d&&new CKEDITOR.dom.node(d))&&(a&&!a(d))&&(d=d.getPrevious(a));return d},getStyle:function(a){return this.$.style[CKEDITOR.tools.cssStyleToDomStyle(a)]},is:function(){var a=this.getName();if(typeof arguments[0]=="object")return!!arguments[0][a];for(var d=0;d<arguments.length;d++)if(arguments[d]==
+a)return true;return false},isEditable:function(a){var d=this.getName();if(this.isReadOnly()||this.getComputedStyle("display")=="none"||this.getComputedStyle("visibility")=="hidden"||CKEDITOR.dtd.$nonEditable[d]||CKEDITOR.dtd.$empty[d]||this.is("a")&&(this.data("cke-saved-name")||this.hasAttribute("name"))&&!this.getChildCount())return false;if(a!==false){a=CKEDITOR.dtd[d]||CKEDITOR.dtd.span;return!(!a||!a["#"])}return true},isIdentical:function(a){var d=this.clone(0,1),a=a.clone(0,1);d.removeAttributes(["_moz_dirty",
+"data-cke-expando","data-cke-saved-href","data-cke-saved-name"]);a.removeAttributes(["_moz_dirty","data-cke-expando","data-cke-saved-href","data-cke-saved-name"]);if(d.$.isEqualNode){d.$.style.cssText=CKEDITOR.tools.normalizeCssText(d.$.style.cssText);a.$.style.cssText=CKEDITOR.tools.normalizeCssText(a.$.style.cssText);return d.$.isEqualNode(a.$)}d=d.getOuterHtml();a=a.getOuterHtml();if(CKEDITOR.env.ie&&CKEDITOR.env.version<9&&this.is("a")){var b=this.getParent();if(b.type==CKEDITOR.NODE_ELEMENT){b=
+b.clone();b.setHtml(d);d=b.getHtml();b.setHtml(a);a=b.getHtml()}}return d==a},isVisible:function(){var a=(this.$.offsetHeight||this.$.offsetWidth)&&this.getComputedStyle("visibility")!="hidden",d,b;if(a&&CKEDITOR.env.webkit){d=this.getWindow();if(!d.equals(CKEDITOR.document.getWindow())&&(b=d.$.frameElement))a=(new CKEDITOR.dom.element(b)).isVisible()}return!!a},isEmptyInlineRemoveable:function(){if(!CKEDITOR.dtd.$removeEmpty[this.getName()])return false;for(var a=this.getChildren(),d=0,b=a.count();d<
+b;d++){var c=a.getItem(d);if(!(c.type==CKEDITOR.NODE_ELEMENT&&c.data("cke-bookmark"))&&(c.type==CKEDITOR.NODE_ELEMENT&&!c.isEmptyInlineRemoveable()||c.type==CKEDITOR.NODE_TEXT&&CKEDITOR.tools.trim(c.getText())))return false}return true},hasAttributes:CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.quirks)?function(){for(var a=this.$.attributes,d=0;d<a.length;d++){var b=a[d];switch(b.nodeName){case "class":if(this.getAttribute("class"))return true;case "data-cke-expando":continue;default:if(b.specified)return true}}return false}:
+function(){var a=this.$.attributes,d=a.length,b={"data-cke-expando":1,_moz_dirty:1};return d>0&&(d>2||!b[a[0].nodeName]||d==2&&!b[a[1].nodeName])},hasAttribute:function(){function a(d){var e=this.$.attributes.getNamedItem(d);if(this.getName()=="input")switch(d){case "class":return this.$.className.length>0;case "checked":return!!this.$.checked;case "value":d=this.getAttribute("type");return d=="checkbox"||d=="radio"?this.$.value!="on":!!this.$.value}return!e?false:e.specified}return CKEDITOR.env.ie?
+CKEDITOR.env.version<8?function(d){return d=="name"?!!this.$.name:a.call(this,d)}:a:function(a){return!!this.$.attributes.getNamedItem(a)}}(),hide:function(){this.setStyle("display","none")},moveChildren:function(a,d){var b=this.$,a=a.$;if(b!=a){var c;if(d)for(;c=b.lastChild;)a.insertBefore(b.removeChild(c),a.firstChild);else for(;c=b.firstChild;)a.appendChild(b.removeChild(c))}},mergeSiblings:function(){function a(d,b,e){if(b&&b.type==CKEDITOR.NODE_ELEMENT){for(var c=[];b.data("cke-bookmark")||b.isEmptyInlineRemoveable();){c.push(b);
+b=e?b.getNext():b.getPrevious();if(!b||b.type!=CKEDITOR.NODE_ELEMENT)return}if(d.isIdentical(b)){for(var f=e?d.getLast():d.getFirst();c.length;)c.shift().move(d,!e);b.moveChildren(d,!e);b.remove();f&&f.type==CKEDITOR.NODE_ELEMENT&&f.mergeSiblings()}}}return function(d){if(d===false||CKEDITOR.dtd.$removeEmpty[this.getName()]||this.is("a")){a(this,this.getNext(),true);a(this,this.getPrevious())}}}(),show:function(){this.setStyles({display:"",visibility:""})},setAttribute:function(){var a=function(a,
+b){this.$.setAttribute(a,b);return this};return CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.quirks)?function(d,b){d=="class"?this.$.className=b:d=="style"?this.$.style.cssText=b:d=="tabindex"?this.$.tabIndex=b:d=="checked"?this.$.checked=b:d=="contenteditable"?a.call(this,"contentEditable",b):a.apply(this,arguments);return this}:CKEDITOR.env.ie8Compat&&CKEDITOR.env.secure?function(d,b){if(d=="src"&&b.match(/^http:\/\//))try{a.apply(this,arguments)}catch(c){}else a.apply(this,arguments);
+return this}:a}(),setAttributes:function(a){for(var d in a)this.setAttribute(d,a[d]);return this},setValue:function(a){this.$.value=a;return this},removeAttribute:function(){var a=function(a){this.$.removeAttribute(a)};return CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.quirks)?function(a){a=="class"?a="className":a=="tabindex"?a="tabIndex":a=="contenteditable"&&(a="contentEditable");this.$.removeAttribute(a)}:a}(),removeAttributes:function(a){if(CKEDITOR.tools.isArray(a))for(var b=0;b<
+a.length;b++)this.removeAttribute(a[b]);else for(b in a)a.hasOwnProperty(b)&&this.removeAttribute(b)},removeStyle:function(a){var b=this.$.style;if(!b.removeProperty&&(a=="border"||a=="margin"||a=="padding")){var c=["top","left","right","bottom"],f;a=="border"&&(f=["color","style","width"]);for(var b=[],j=0;j<c.length;j++)if(f)for(var g=0;g<f.length;g++)b.push([a,c[j],f[g]].join("-"));else b.push([a,c[j]].join("-"));for(a=0;a<b.length;a++)this.removeStyle(b[a])}else{b.removeProperty?b.removeProperty(a):
+b.removeAttribute(CKEDITOR.tools.cssStyleToDomStyle(a));this.$.style.cssText||this.removeAttribute("style")}},setStyle:function(a,b){this.$.style[CKEDITOR.tools.cssStyleToDomStyle(a)]=b;return this},setStyles:function(a){for(var b in a)this.setStyle(b,a[b]);return this},setOpacity:function(a){if(CKEDITOR.env.ie&&CKEDITOR.env.version<9){a=Math.round(a*100);this.setStyle("filter",a>=100?"":"progid:DXImageTransform.Microsoft.Alpha(opacity="+a+")")}else this.setStyle("opacity",a)},unselectable:function(){this.setStyles(CKEDITOR.tools.cssVendorPrefix("user-select",
+"none"));if(CKEDITOR.env.ie){this.setAttribute("unselectable","on");for(var a,b=this.getElementsByTag("*"),c=0,f=b.count();c<f;c++){a=b.getItem(c);a.setAttribute("unselectable","on")}}},getPositionedAncestor:function(){for(var a=this;a.getName()!="html";){if(a.getComputedStyle("position")!="static")return a;a=a.getParent()}return null},getDocumentPosition:function(a){var b=0,c=0,f=this.getDocument(),j=f.getBody(),g=CKEDITOR.env.quirks;if(document.documentElement.getBoundingClientRect){var m=this.$.getBoundingClientRect(),
+y=f.$.documentElement,s=y.clientTop||j.$.clientTop||0,w=y.clientLeft||j.$.clientLeft||0,q=true;if(CKEDITOR.env.ie){q=f.getDocumentElement().contains(this);f=f.getBody().contains(this);q=g&&f||!g&&q}if(q){if(CKEDITOR.env.webkit){b=j.$.scrollLeft||y.scrollLeft;c=j.$.scrollTop||y.scrollTop}else{c=g?j.$:y;b=c.scrollLeft;c=c.scrollTop}b=m.left+b-w;c=m.top+c-s}}else{s=this;for(w=null;s&&!(s.getName()=="body"||s.getName()=="html");){b=b+(s.$.offsetLeft-s.$.scrollLeft);c=c+(s.$.offsetTop-s.$.scrollTop);if(!s.equals(this)){b=
+b+(s.$.clientLeft||0);c=c+(s.$.clientTop||0)}for(;w&&!w.equals(s);){b=b-w.$.scrollLeft;c=c-w.$.scrollTop;w=w.getParent()}w=s;s=(m=s.$.offsetParent)?new CKEDITOR.dom.element(m):null}}if(a){m=this.getWindow();s=a.getWindow();if(!m.equals(s)&&m.$.frameElement){a=(new CKEDITOR.dom.element(m.$.frameElement)).getDocumentPosition(a);b=b+a.x;c=c+a.y}}if(!document.documentElement.getBoundingClientRect&&CKEDITOR.env.gecko&&!g){b=b+(this.$.clientLeft?1:0);c=c+(this.$.clientTop?1:0)}return{x:b,y:c}},scrollIntoView:function(a){var b=
+this.getParent();if(b){do{(b.$.clientWidth&&b.$.clientWidth<b.$.scrollWidth||b.$.clientHeight&&b.$.clientHeight<b.$.scrollHeight)&&!b.is("body")&&this.scrollIntoParent(b,a,1);if(b.is("html")){var c=b.getWindow();try{var f=c.$.frameElement;f&&(b=new CKEDITOR.dom.element(f))}catch(j){}}}while(b=b.getParent())}},scrollIntoParent:function(a,b,c){var f,j,g,m;function y(b,d){if(/body|html/.test(a.getName()))a.getWindow().$.scrollBy(b,d);else{a.$.scrollLeft=a.$.scrollLeft+b;a.$.scrollTop=a.$.scrollTop+d}}
+function s(a,b){var d={x:0,y:0};if(!a.is(q?"body":"html")){var c=a.$.getBoundingClientRect();d.x=c.left;d.y=c.top}c=a.getWindow();if(!c.equals(b)){c=s(CKEDITOR.dom.element.get(c.$.frameElement),b);d.x=d.x+c.x;d.y=d.y+c.y}return d}function w(a,b){return parseInt(a.getComputedStyle("margin-"+b)||0,10)||0}!a&&(a=this.getWindow());g=a.getDocument();var q=g.$.compatMode=="BackCompat";a instanceof CKEDITOR.dom.window&&(a=q?g.getBody():g.getDocumentElement());g=a.getWindow();j=s(this,g);var t=s(a,g),i=this.$.offsetHeight;
+f=this.$.offsetWidth;var A=a.$.clientHeight,u=a.$.clientWidth;g=j.x-w(this,"left")-t.x||0;m=j.y-w(this,"top")-t.y||0;f=j.x+f+w(this,"right")-(t.x+u)||0;j=j.y+i+w(this,"bottom")-(t.y+A)||0;if(m<0||j>0)y(0,b===true?m:b===false?j:m<0?m:j);if(c&&(g<0||f>0))y(g<0?g:f,0)},setState:function(a,b,c){b=b||"cke";switch(a){case CKEDITOR.TRISTATE_ON:this.addClass(b+"_on");this.removeClass(b+"_off");this.removeClass(b+"_disabled");c&&this.setAttribute("aria-pressed",true);c&&this.removeAttribute("aria-disabled");
+break;case CKEDITOR.TRISTATE_DISABLED:this.addClass(b+"_disabled");this.removeClass(b+"_off");this.removeClass(b+"_on");c&&this.setAttribute("aria-disabled",true);c&&this.removeAttribute("aria-pressed");break;default:this.addClass(b+"_off");this.removeClass(b+"_on");this.removeClass(b+"_disabled");c&&this.removeAttribute("aria-pressed");c&&this.removeAttribute("aria-disabled")}},getFrameDocument:function(){var a=this.$;try{a.contentWindow.document}catch(b){a.src=a.src}return a&&new CKEDITOR.dom.document(a.contentWindow.document)},
+copyAttributes:function(a,b){for(var c=this.$.attributes,b=b||{},f=0;f<c.length;f++){var j=c[f],g=j.nodeName.toLowerCase(),m;if(!(g in b))if(g=="checked"&&(m=this.getAttribute(g)))a.setAttribute(g,m);else if(!CKEDITOR.env.ie||this.hasAttribute(g)){m=this.getAttribute(g);if(m===null)m=j.nodeValue;a.setAttribute(g,m)}}if(this.$.style.cssText!=="")a.$.style.cssText=this.$.style.cssText},renameNode:function(a){if(this.getName()!=a){var b=this.getDocument(),a=new CKEDITOR.dom.element(a,b);this.copyAttributes(a);
+this.moveChildren(a);this.getParent()&&this.$.parentNode.replaceChild(a.$,this.$);a.$["data-cke-expando"]=this.$["data-cke-expando"];this.$=a.$;delete this.getName}},getChild:function(){function a(b,c){var e=b.childNodes;if(c>=0&&c<e.length)return e[c]}return function(b){var c=this.$;if(b.slice)for(;b.length>0&&c;)c=a(c,b.shift());else c=a(c,b);return c?new CKEDITOR.dom.node(c):null}}(),getChildCount:function(){return this.$.childNodes.length},disableContextMenu:function(){this.on("contextmenu",function(a){a.data.getTarget().hasClass("cke_enable_context_menu")||
+a.data.preventDefault()})},getDirection:function(a){return a?this.getComputedStyle("direction")||this.getDirection()||this.getParent()&&this.getParent().getDirection(1)||this.getDocument().$.dir||"ltr":this.getStyle("direction")||this.getAttribute("dir")},data:function(a,b){a="data-"+a;if(b===void 0)return this.getAttribute(a);b===false?this.removeAttribute(a):this.setAttribute(a,b);return null},getEditor:function(){var a=CKEDITOR.instances,b,c;for(b in a){c=a[b];if(c.element.equals(this)&&c.elementMode!=
+CKEDITOR.ELEMENT_MODE_APPENDTO)return c}return null},find:function(b){var c=a(this),b=new CKEDITOR.dom.nodeList(this.$.querySelectorAll(f(this,b)));c();return b},findOne:function(b){var c=a(this),b=this.$.querySelector(f(this,b));c();return b?new CKEDITOR.dom.element(b):null},forEach:function(a,b,c){if(!c&&(!b||this.type==b))var f=a(this);if(f!==false)for(var c=this.getChildren(),j=0;j<c.count();j++){f=c.getItem(j);f.type==CKEDITOR.NODE_ELEMENT?f.forEach(a,b):(!b||f.type==b)&&a(f)}}});var c={width:["border-left-width",
+"border-right-width","padding-left","padding-right"],height:["border-top-width","border-bottom-width","padding-top","padding-bottom"]};CKEDITOR.dom.element.prototype.setSize=function(a,c,f){if(typeof c=="number"){if(f&&(!CKEDITOR.env.ie||!CKEDITOR.env.quirks))c=c-b.call(this,a);this.setStyle(a,c+"px")}};CKEDITOR.dom.element.prototype.getSize=function(a,c){var f=Math.max(this.$["offset"+CKEDITOR.tools.capitalize(a)],this.$["client"+CKEDITOR.tools.capitalize(a)])||0;c&&(f=f-b.call(this,a));return f}})();
+CKEDITOR.dom.documentFragment=function(a){a=a||CKEDITOR.document;this.$=a.type==CKEDITOR.NODE_DOCUMENT?a.$.createDocumentFragment():a};
+CKEDITOR.tools.extend(CKEDITOR.dom.documentFragment.prototype,CKEDITOR.dom.element.prototype,{type:CKEDITOR.NODE_DOCUMENT_FRAGMENT,insertAfterNode:function(a){a=a.$;a.parentNode.insertBefore(this.$,a.nextSibling)}},!0,{append:1,appendBogus:1,getFirst:1,getLast:1,getParent:1,getNext:1,getPrevious:1,appendTo:1,moveChildren:1,insertBefore:1,insertAfterNode:1,replace:1,trim:1,type:1,ltrim:1,rtrim:1,getDocument:1,getChildCount:1,getChild:1,getChildren:1});
+(function(){function a(a,b){var c=this.range;if(this._.end)return null;if(!this._.start){this._.start=1;if(c.collapsed){this.end();return null}c.optimize()}var d,e=c.startContainer;d=c.endContainer;var m=c.startOffset,f=c.endOffset,h,o=this.guard,l=this.type,p=a?"getPreviousSourceNode":"getNextSourceNode";if(!a&&!this._.guardLTR){var r=d.type==CKEDITOR.NODE_ELEMENT?d:d.getParent(),n=d.type==CKEDITOR.NODE_ELEMENT?d.getChild(f):d.getNext();this._.guardLTR=function(a,b){return(!b||!r.equals(a))&&(!n||
+!a.equals(n))&&(a.type!=CKEDITOR.NODE_ELEMENT||!b||!a.equals(c.root))}}if(a&&!this._.guardRTL){var g=e.type==CKEDITOR.NODE_ELEMENT?e:e.getParent(),C=e.type==CKEDITOR.NODE_ELEMENT?m?e.getChild(m-1):null:e.getPrevious();this._.guardRTL=function(a,b){return(!b||!g.equals(a))&&(!C||!a.equals(C))&&(a.type!=CKEDITOR.NODE_ELEMENT||!b||!a.equals(c.root))}}var j=a?this._.guardRTL:this._.guardLTR;h=o?function(a,b){return j(a,b)===false?false:o(a,b)}:j;if(this.current)d=this.current[p](false,l,h);else{if(a)d.type==
+CKEDITOR.NODE_ELEMENT&&(d=f>0?d.getChild(f-1):h(d,true)===false?null:d.getPreviousSourceNode(true,l,h));else{d=e;if(d.type==CKEDITOR.NODE_ELEMENT&&!(d=d.getChild(m)))d=h(e,true)===false?null:e.getNextSourceNode(true,l,h)}d&&h(d)===false&&(d=null)}for(;d&&!this._.end;){this.current=d;if(!this.evaluator||this.evaluator(d)!==false){if(!b)return d}else if(b&&this.evaluator)return false;d=d[p](false,l,h)}this.end();return this.current=null}function f(b){for(var c,d=null;c=a.call(this,b);)d=c;return d}
+function b(a){if(g(a))return false;if(a.type==CKEDITOR.NODE_TEXT)return true;if(a.type==CKEDITOR.NODE_ELEMENT){if(a.is(CKEDITOR.dtd.$inline)||a.is("hr")||a.getAttribute("contenteditable")=="false")return true;var b;if(b=!CKEDITOR.env.needsBrFiller)if(b=a.is(m))a:{b=0;for(var c=a.getChildCount();b<c;++b)if(!g(a.getChild(b))){b=false;break a}b=true}if(b)return true}return false}CKEDITOR.dom.walker=CKEDITOR.tools.createClass({$:function(a){this.range=a;this._={}},proto:{end:function(){this._.end=1},
+next:function(){return a.call(this)},previous:function(){return a.call(this,1)},checkForward:function(){return a.call(this,0,1)!==false},checkBackward:function(){return a.call(this,1,1)!==false},lastForward:function(){return f.call(this)},lastBackward:function(){return f.call(this,1)},reset:function(){delete this.current;this._={}}}});var c={block:1,"list-item":1,table:1,"table-row-group":1,"table-header-group":1,"table-footer-group":1,"table-row":1,"table-column-group":1,"table-column":1,"table-cell":1,
+"table-caption":1},e={absolute:1,fixed:1};CKEDITOR.dom.element.prototype.isBlockBoundary=function(a){return this.getComputedStyle("float")=="none"&&!(this.getComputedStyle("position")in e)&&c[this.getComputedStyle("display")]?true:!!(this.is(CKEDITOR.dtd.$block)||a&&this.is(a))};CKEDITOR.dom.walker.blockBoundary=function(a){return function(b){return!(b.type==CKEDITOR.NODE_ELEMENT&&b.isBlockBoundary(a))}};CKEDITOR.dom.walker.listItemBoundary=function(){return this.blockBoundary({br:1})};CKEDITOR.dom.walker.bookmark=
+function(a,b){function c(a){return a&&a.getName&&a.getName()=="span"&&a.data("cke-bookmark")}return function(d){var e,m;e=d&&d.type!=CKEDITOR.NODE_ELEMENT&&(m=d.getParent())&&c(m);e=a?e:e||c(d);return!!(b^e)}};CKEDITOR.dom.walker.whitespaces=function(a){return function(b){var c;b&&b.type==CKEDITOR.NODE_TEXT&&(c=!CKEDITOR.tools.trim(b.getText())||CKEDITOR.env.webkit&&b.getText()=="​");return!!(a^c)}};CKEDITOR.dom.walker.invisible=function(a){var b=CKEDITOR.dom.walker.whitespaces(),c=CKEDITOR.env.webkit?
+1:0;return function(d){if(b(d))d=1;else{d.type==CKEDITOR.NODE_TEXT&&(d=d.getParent());d=d.$.offsetWidth<=c}return!!(a^d)}};CKEDITOR.dom.walker.nodeType=function(a,b){return function(c){return!!(b^c.type==a)}};CKEDITOR.dom.walker.bogus=function(a){function b(a){return!h(a)&&!k(a)}return function(c){var e=CKEDITOR.env.needsBrFiller?c.is&&c.is("br"):c.getText&&d.test(c.getText());if(e){e=c.getParent();c=c.getNext(b);e=e.isBlockBoundary()&&(!c||c.type==CKEDITOR.NODE_ELEMENT&&c.isBlockBoundary())}return!!(a^
+e)}};CKEDITOR.dom.walker.temp=function(a){return function(b){b.type!=CKEDITOR.NODE_ELEMENT&&(b=b.getParent());b=b&&b.hasAttribute("data-cke-temp");return!!(a^b)}};var d=/^[\t\r\n ]*(?:&nbsp;|\xa0)$/,h=CKEDITOR.dom.walker.whitespaces(),k=CKEDITOR.dom.walker.bookmark(),j=CKEDITOR.dom.walker.temp();CKEDITOR.dom.walker.ignored=function(a){return function(b){b=h(b)||k(b)||j(b);return!!(a^b)}};var g=CKEDITOR.dom.walker.ignored(),m=function(a){var b={},c;for(c in a)CKEDITOR.dtd[c]["#"]&&(b[c]=1);return b}(CKEDITOR.dtd.$block);
+CKEDITOR.dom.walker.editable=function(a){return function(c){return!!(a^b(c))}};CKEDITOR.dom.element.prototype.getBogus=function(){var a=this;do a=a.getPreviousSourceNode();while(k(a)||h(a)||a.type==CKEDITOR.NODE_ELEMENT&&a.is(CKEDITOR.dtd.$inline)&&!a.is(CKEDITOR.dtd.$empty));return a&&(CKEDITOR.env.needsBrFiller?a.is&&a.is("br"):a.getText&&d.test(a.getText()))?a:false}})();
+CKEDITOR.dom.range=function(a){this.endOffset=this.endContainer=this.startOffset=this.startContainer=null;this.collapsed=true;var f=a instanceof CKEDITOR.dom.document;this.document=f?a:a.getDocument();this.root=f?a.getBody():a};
+(function(){function a(){var a=false,b=CKEDITOR.dom.walker.whitespaces(),c=CKEDITOR.dom.walker.bookmark(true),e=CKEDITOR.dom.walker.bogus();return function(f){if(c(f)||b(f))return true;if(e(f)&&!a)return a=true;return f.type==CKEDITOR.NODE_TEXT&&(f.hasAscendant("pre")||CKEDITOR.tools.trim(f.getText()).length)||f.type==CKEDITOR.NODE_ELEMENT&&!f.is(d)?false:true}}function f(a){var b=CKEDITOR.dom.walker.whitespaces(),c=CKEDITOR.dom.walker.bookmark(1);return function(d){return c(d)||b(d)?true:!a&&h(d)||
+d.type==CKEDITOR.NODE_ELEMENT&&d.is(CKEDITOR.dtd.$removeEmpty)}}function b(a){return function(){var b;return this[a?"getPreviousNode":"getNextNode"](function(a){!b&&g(a)&&(b=a);return j(a)&&!(h(a)&&a.equals(b))})}}var c=function(a){a.collapsed=a.startContainer&&a.endContainer&&a.startContainer.equals(a.endContainer)&&a.startOffset==a.endOffset},e=function(a,b,c,d){a.optimizeBookmark();var e=a.startContainer,f=a.endContainer,i=a.startOffset,A=a.endOffset,h,o;if(f.type==CKEDITOR.NODE_TEXT)f=f.split(A);
+else if(f.getChildCount()>0)if(A>=f.getChildCount()){f=f.append(a.document.createText(""));o=true}else f=f.getChild(A);if(e.type==CKEDITOR.NODE_TEXT){e.split(i);e.equals(f)&&(f=e.getNext())}else if(i)if(i>=e.getChildCount()){e=e.append(a.document.createText(""));h=true}else e=e.getChild(i).getPrevious();else{e=e.append(a.document.createText(""),1);h=true}var i=e.getParents(),A=f.getParents(),l,p,r;for(l=0;l<i.length;l++){p=i[l];r=A[l];if(!p.equals(r))break}for(var n=c,g,C,j,F=l;F<i.length;F++){g=
+i[F];n&&!g.equals(e)&&(C=n.append(g.clone()));for(g=g.getNext();g;){if(g.equals(A[F])||g.equals(f))break;j=g.getNext();if(b==2)n.append(g.clone(true));else{g.remove();b==1&&n.append(g)}g=j}n&&(n=C)}n=c;for(c=l;c<A.length;c++){g=A[c];b>0&&!g.equals(f)&&(C=n.append(g.clone()));if(!i[c]||g.$.parentNode!=i[c].$.parentNode)for(g=g.getPrevious();g;){if(g.equals(i[c])||g.equals(e))break;j=g.getPrevious();if(b==2)n.$.insertBefore(g.$.cloneNode(true),n.$.firstChild);else{g.remove();b==1&&n.$.insertBefore(g.$,
+n.$.firstChild)}g=j}n&&(n=C)}if(b==2){p=a.startContainer;if(p.type==CKEDITOR.NODE_TEXT){p.$.data=p.$.data+p.$.nextSibling.data;p.$.parentNode.removeChild(p.$.nextSibling)}a=a.endContainer;if(a.type==CKEDITOR.NODE_TEXT&&a.$.nextSibling){a.$.data=a.$.data+a.$.nextSibling.data;a.$.parentNode.removeChild(a.$.nextSibling)}}else{if(p&&r&&(e.$.parentNode!=p.$.parentNode||f.$.parentNode!=r.$.parentNode)){b=r.getIndex();h&&r.$.parentNode==e.$.parentNode&&b--;if(d&&p.type==CKEDITOR.NODE_ELEMENT){d=CKEDITOR.dom.element.createFromHtml('<span data-cke-bookmark="1" style="display:none">&nbsp;</span>',
+a.document);d.insertAfter(p);p.mergeSiblings(false);a.moveToBookmark({startNode:d})}else a.setStart(r.getParent(),b)}a.collapse(true)}h&&e.remove();o&&f.$.parentNode&&f.remove()},d={abbr:1,acronym:1,b:1,bdo:1,big:1,cite:1,code:1,del:1,dfn:1,em:1,font:1,i:1,ins:1,label:1,kbd:1,q:1,samp:1,small:1,span:1,strike:1,strong:1,sub:1,sup:1,tt:1,u:1,"var":1},h=CKEDITOR.dom.walker.bogus(),k=/^[\t\r\n ]*(?:&nbsp;|\xa0)$/,j=CKEDITOR.dom.walker.editable(),g=CKEDITOR.dom.walker.ignored(true);CKEDITOR.dom.range.prototype=
+{clone:function(){var a=new CKEDITOR.dom.range(this.root);a._setStartContainer(this.startContainer);a.startOffset=this.startOffset;a._setEndContainer(this.endContainer);a.endOffset=this.endOffset;a.collapsed=this.collapsed;return a},collapse:function(a){if(a){this._setEndContainer(this.startContainer);this.endOffset=this.startOffset}else{this._setStartContainer(this.endContainer);this.startOffset=this.endOffset}this.collapsed=true},cloneContents:function(){var a=new CKEDITOR.dom.documentFragment(this.document);
+this.collapsed||e(this,2,a);return a},deleteContents:function(a){this.collapsed||e(this,0,null,a)},extractContents:function(a){var b=new CKEDITOR.dom.documentFragment(this.document);this.collapsed||e(this,1,b,a);return b},createBookmark:function(a){var b,c,d,e,f=this.collapsed;b=this.document.createElement("span");b.data("cke-bookmark",1);b.setStyle("display","none");b.setHtml("&nbsp;");if(a){d="cke_bm_"+CKEDITOR.tools.getNextNumber();b.setAttribute("id",d+(f?"C":"S"))}if(!f){c=b.clone();c.setHtml("&nbsp;");
+a&&c.setAttribute("id",d+"E");e=this.clone();e.collapse();e.insertNode(c)}e=this.clone();e.collapse(true);e.insertNode(b);if(c){this.setStartAfter(b);this.setEndBefore(c)}else this.moveToPosition(b,CKEDITOR.POSITION_AFTER_END);return{startNode:a?d+(f?"C":"S"):b,endNode:a?d+"E":c,serializable:a,collapsed:f}},createBookmark2:function(){function a(c){var d=c.container,e=c.offset,f;f=d;var m=e;f=f.type!=CKEDITOR.NODE_ELEMENT||m===0||m==f.getChildCount()?0:f.getChild(m-1).type==CKEDITOR.NODE_TEXT&&f.getChild(m).type==
+CKEDITOR.NODE_TEXT;if(f){d=d.getChild(e-1);e=d.getLength()}d.type==CKEDITOR.NODE_ELEMENT&&e>1&&(e=d.getChild(e-1).getIndex(true)+1);if(d.type==CKEDITOR.NODE_TEXT){f=d;for(m=0;(f=f.getPrevious())&&f.type==CKEDITOR.NODE_TEXT;)m=m+f.getLength();f=m;if(d.getText())e=e+f;else{m=d.getPrevious(b);if(f){e=f;d=m?m.getNext():d.getParent().getFirst()}else{d=d.getParent();e=m?m.getIndex(true)+1:0}}}c.container=d;c.offset=e}var b=CKEDITOR.dom.walker.nodeType(CKEDITOR.NODE_TEXT,true);return function(b){var c=this.collapsed,
+d={container:this.startContainer,offset:this.startOffset},e={container:this.endContainer,offset:this.endOffset};if(b){a(d);c||a(e)}return{start:d.container.getAddress(b),end:c?null:e.container.getAddress(b),startOffset:d.offset,endOffset:e.offset,normalized:b,collapsed:c,is2:true}}}(),moveToBookmark:function(a){if(a.is2){var b=this.document.getByAddress(a.start,a.normalized),c=a.startOffset,d=a.end&&this.document.getByAddress(a.end,a.normalized),a=a.endOffset;this.setStart(b,c);d?this.setEnd(d,a):
+this.collapse(true)}else{b=(c=a.serializable)?this.document.getById(a.startNode):a.startNode;a=c?this.document.getById(a.endNode):a.endNode;this.setStartBefore(b);b.remove();if(a){this.setEndBefore(a);a.remove()}else this.collapse(true)}},getBoundaryNodes:function(){var a=this.startContainer,b=this.endContainer,c=this.startOffset,d=this.endOffset,e;if(a.type==CKEDITOR.NODE_ELEMENT){e=a.getChildCount();if(e>c)a=a.getChild(c);else if(e<1)a=a.getPreviousSourceNode();else{for(a=a.$;a.lastChild;)a=a.lastChild;
+a=new CKEDITOR.dom.node(a);a=a.getNextSourceNode()||a}}if(b.type==CKEDITOR.NODE_ELEMENT){e=b.getChildCount();if(e>d)b=b.getChild(d).getPreviousSourceNode(true);else if(e<1)b=b.getPreviousSourceNode();else{for(b=b.$;b.lastChild;)b=b.lastChild;b=new CKEDITOR.dom.node(b)}}a.getPosition(b)&CKEDITOR.POSITION_FOLLOWING&&(a=b);return{startNode:a,endNode:b}},getCommonAncestor:function(a,b){var c=this.startContainer,d=this.endContainer,c=c.equals(d)?a&&c.type==CKEDITOR.NODE_ELEMENT&&this.startOffset==this.endOffset-
+1?c.getChild(this.startOffset):c:c.getCommonAncestor(d);return b&&!c.is?c.getParent():c},optimize:function(){var a=this.startContainer,b=this.startOffset;a.type!=CKEDITOR.NODE_ELEMENT&&(b?b>=a.getLength()&&this.setStartAfter(a):this.setStartBefore(a));a=this.endContainer;b=this.endOffset;a.type!=CKEDITOR.NODE_ELEMENT&&(b?b>=a.getLength()&&this.setEndAfter(a):this.setEndBefore(a))},optimizeBookmark:function(){var a=this.startContainer,b=this.endContainer;a.is&&(a.is("span")&&a.data("cke-bookmark"))&&
+this.setStartAt(a,CKEDITOR.POSITION_BEFORE_START);b&&(b.is&&b.is("span")&&b.data("cke-bookmark"))&&this.setEndAt(b,CKEDITOR.POSITION_AFTER_END)},trim:function(a,b){var c=this.startContainer,d=this.startOffset,e=this.collapsed;if((!a||e)&&c&&c.type==CKEDITOR.NODE_TEXT){if(d)if(d>=c.getLength()){d=c.getIndex()+1;c=c.getParent()}else{var f=c.split(d),d=c.getIndex()+1,c=c.getParent();if(this.startContainer.equals(this.endContainer))this.setEnd(f,this.endOffset-this.startOffset);else if(c.equals(this.endContainer))this.endOffset=
+this.endOffset+1}else{d=c.getIndex();c=c.getParent()}this.setStart(c,d);if(e){this.collapse(true);return}}c=this.endContainer;d=this.endOffset;if(!b&&!e&&c&&c.type==CKEDITOR.NODE_TEXT){if(d){d>=c.getLength()||c.split(d);d=c.getIndex()+1}else d=c.getIndex();c=c.getParent();this.setEnd(c,d)}},enlarge:function(a,b){function c(a){return a&&a.type==CKEDITOR.NODE_ELEMENT&&a.hasAttribute("contenteditable")?null:a}var d=RegExp(/[^\s\ufeff]/);switch(a){case CKEDITOR.ENLARGE_INLINE:var e=1;case CKEDITOR.ENLARGE_ELEMENT:if(this.collapsed)break;
+var f=this.getCommonAncestor(),i=this.root,h,g,o,l,p,r=false,n,j;n=this.startContainer;var C=this.startOffset;if(n.type==CKEDITOR.NODE_TEXT){if(C){n=!CKEDITOR.tools.trim(n.substring(0,C)).length&&n;r=!!n}if(n&&!(l=n.getPrevious()))o=n.getParent()}else{C&&(l=n.getChild(C-1)||n.getLast());l||(o=n)}for(o=c(o);o||l;){if(o&&!l){!p&&o.equals(f)&&(p=true);if(e?o.isBlockBoundary():!i.contains(o))break;if(!r||o.getComputedStyle("display")!="inline"){r=false;p?h=o:this.setStartBefore(o)}l=o.getPrevious()}for(;l;){n=
+false;if(l.type==CKEDITOR.NODE_COMMENT)l=l.getPrevious();else{if(l.type==CKEDITOR.NODE_TEXT){j=l.getText();d.test(j)&&(l=null);n=/[\s\ufeff]$/.test(j)}else if((l.$.offsetWidth>(CKEDITOR.env.webkit?1:0)||b&&l.is("br"))&&!l.data("cke-bookmark"))if(r&&CKEDITOR.dtd.$removeEmpty[l.getName()]){j=l.getText();if(d.test(j))l=null;else for(var C=l.$.getElementsByTagName("*"),k=0,F;F=C[k++];)if(!CKEDITOR.dtd.$removeEmpty[F.nodeName.toLowerCase()]){l=null;break}l&&(n=!!j.length)}else l=null;n&&(r?p?h=o:o&&this.setStartBefore(o):
+r=true);if(l){n=l.getPrevious();if(!o&&!n){o=l;l=null;break}l=n}else o=null}}o&&(o=c(o.getParent()))}n=this.endContainer;C=this.endOffset;o=l=null;p=r=false;var K=function(a,b){var c=new CKEDITOR.dom.range(i);c.setStart(a,b);c.setEndAt(i,CKEDITOR.POSITION_BEFORE_END);var c=new CKEDITOR.dom.walker(c),e;for(c.guard=function(a){return!(a.type==CKEDITOR.NODE_ELEMENT&&a.isBlockBoundary())};e=c.next();){if(e.type!=CKEDITOR.NODE_TEXT)return false;j=e!=a?e.getText():e.substring(b);if(d.test(j))return false}return true};
+if(n.type==CKEDITOR.NODE_TEXT)if(CKEDITOR.tools.trim(n.substring(C)).length)r=true;else{r=!n.getLength();if(C==n.getLength()){if(!(l=n.getNext()))o=n.getParent()}else K(n,C)&&(o=n.getParent())}else(l=n.getChild(C))||(o=n);for(;o||l;){if(o&&!l){!p&&o.equals(f)&&(p=true);if(e?o.isBlockBoundary():!i.contains(o))break;if(!r||o.getComputedStyle("display")!="inline"){r=false;p?g=o:o&&this.setEndAfter(o)}l=o.getNext()}for(;l;){n=false;if(l.type==CKEDITOR.NODE_TEXT){j=l.getText();K(l,0)||(l=null);n=/^[\s\ufeff]/.test(j)}else if(l.type==
+CKEDITOR.NODE_ELEMENT){if((l.$.offsetWidth>0||b&&l.is("br"))&&!l.data("cke-bookmark"))if(r&&CKEDITOR.dtd.$removeEmpty[l.getName()]){j=l.getText();if(d.test(j))l=null;else{C=l.$.getElementsByTagName("*");for(k=0;F=C[k++];)if(!CKEDITOR.dtd.$removeEmpty[F.nodeName.toLowerCase()]){l=null;break}}l&&(n=!!j.length)}else l=null}else n=1;n&&r&&(p?g=o:this.setEndAfter(o));if(l){n=l.getNext();if(!o&&!n){o=l;l=null;break}l=n}else o=null}o&&(o=c(o.getParent()))}if(h&&g){f=h.contains(g)?g:h;this.setStartBefore(f);
+this.setEndAfter(f)}break;case CKEDITOR.ENLARGE_BLOCK_CONTENTS:case CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS:o=new CKEDITOR.dom.range(this.root);i=this.root;o.setStartAt(i,CKEDITOR.POSITION_AFTER_START);o.setEnd(this.startContainer,this.startOffset);o=new CKEDITOR.dom.walker(o);var I,v,G=CKEDITOR.dom.walker.blockBoundary(a==CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS?{br:1}:null),z=null,B=function(a){if(a.type==CKEDITOR.NODE_ELEMENT&&a.getAttribute("contenteditable")=="false")if(z){if(z.equals(a)){z=null;return}}else z=
+a;else if(z)return;var b=G(a);b||(I=a);return b},e=function(a){var b=B(a);!b&&(a.is&&a.is("br"))&&(v=a);return b};o.guard=B;o=o.lastBackward();I=I||i;this.setStartAt(I,!I.is("br")&&(!o&&this.checkStartOfBlock()||o&&I.contains(o))?CKEDITOR.POSITION_AFTER_START:CKEDITOR.POSITION_AFTER_END);if(a==CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS){o=this.clone();o=new CKEDITOR.dom.walker(o);var x=CKEDITOR.dom.walker.whitespaces(),E=CKEDITOR.dom.walker.bookmark();o.evaluator=function(a){return!x(a)&&!E(a)};if((o=o.previous())&&
+o.type==CKEDITOR.NODE_ELEMENT&&o.is("br"))break}o=this.clone();o.collapse();o.setEndAt(i,CKEDITOR.POSITION_BEFORE_END);o=new CKEDITOR.dom.walker(o);o.guard=a==CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS?e:B;I=z=v=null;o=o.lastForward();I=I||i;this.setEndAt(I,!o&&this.checkEndOfBlock()||o&&I.contains(o)?CKEDITOR.POSITION_BEFORE_END:CKEDITOR.POSITION_BEFORE_START);v&&this.setEndAfter(v)}},shrink:function(a,b,c){if(!this.collapsed){var a=a||CKEDITOR.SHRINK_TEXT,d=this.clone(),e=this.startContainer,f=this.endContainer,
+i=this.startOffset,h=this.endOffset,g=1,o=1;if(e&&e.type==CKEDITOR.NODE_TEXT)if(i)if(i>=e.getLength())d.setStartAfter(e);else{d.setStartBefore(e);g=0}else d.setStartBefore(e);if(f&&f.type==CKEDITOR.NODE_TEXT)if(h)if(h>=f.getLength())d.setEndAfter(f);else{d.setEndAfter(f);o=0}else d.setEndBefore(f);var d=new CKEDITOR.dom.walker(d),l=CKEDITOR.dom.walker.bookmark();d.evaluator=function(b){return b.type==(a==CKEDITOR.SHRINK_ELEMENT?CKEDITOR.NODE_ELEMENT:CKEDITOR.NODE_TEXT)};var p;d.guard=function(b,d){if(l(b))return true;
+if(a==CKEDITOR.SHRINK_ELEMENT&&b.type==CKEDITOR.NODE_TEXT||d&&b.equals(p)||c===false&&b.type==CKEDITOR.NODE_ELEMENT&&b.isBlockBoundary()||b.type==CKEDITOR.NODE_ELEMENT&&b.hasAttribute("contenteditable"))return false;!d&&b.type==CKEDITOR.NODE_ELEMENT&&(p=b);return true};if(g)(e=d[a==CKEDITOR.SHRINK_ELEMENT?"lastForward":"next"]())&&this.setStartAt(e,b?CKEDITOR.POSITION_AFTER_START:CKEDITOR.POSITION_BEFORE_START);if(o){d.reset();(d=d[a==CKEDITOR.SHRINK_ELEMENT?"lastBackward":"previous"]())&&this.setEndAt(d,
+b?CKEDITOR.POSITION_BEFORE_END:CKEDITOR.POSITION_AFTER_END)}return!(!g&&!o)}},insertNode:function(a){this.optimizeBookmark();this.trim(false,true);var b=this.startContainer,c=b.getChild(this.startOffset);c?a.insertBefore(c):b.append(a);a.getParent()&&a.getParent().equals(this.endContainer)&&this.endOffset++;this.setStartBefore(a)},moveToPosition:function(a,b){this.setStartAt(a,b);this.collapse(true)},moveToRange:function(a){this.setStart(a.startContainer,a.startOffset);this.setEnd(a.endContainer,
+a.endOffset)},selectNodeContents:function(a){this.setStart(a,0);this.setEnd(a,a.type==CKEDITOR.NODE_TEXT?a.getLength():a.getChildCount())},setStart:function(a,b){if(a.type==CKEDITOR.NODE_ELEMENT&&CKEDITOR.dtd.$empty[a.getName()]){b=a.getIndex();a=a.getParent()}this._setStartContainer(a);this.startOffset=b;if(!this.endContainer){this._setEndContainer(a);this.endOffset=b}c(this)},setEnd:function(a,b){if(a.type==CKEDITOR.NODE_ELEMENT&&CKEDITOR.dtd.$empty[a.getName()]){b=a.getIndex()+1;a=a.getParent()}this._setEndContainer(a);
+this.endOffset=b;if(!this.startContainer){this._setStartContainer(a);this.startOffset=b}c(this)},setStartAfter:function(a){this.setStart(a.getParent(),a.getIndex()+1)},setStartBefore:function(a){this.setStart(a.getParent(),a.getIndex())},setEndAfter:function(a){this.setEnd(a.getParent(),a.getIndex()+1)},setEndBefore:function(a){this.setEnd(a.getParent(),a.getIndex())},setStartAt:function(a,b){switch(b){case CKEDITOR.POSITION_AFTER_START:this.setStart(a,0);break;case CKEDITOR.POSITION_BEFORE_END:a.type==
+CKEDITOR.NODE_TEXT?this.setStart(a,a.getLength()):this.setStart(a,a.getChildCount());break;case CKEDITOR.POSITION_BEFORE_START:this.setStartBefore(a);break;case CKEDITOR.POSITION_AFTER_END:this.setStartAfter(a)}c(this)},setEndAt:function(a,b){switch(b){case CKEDITOR.POSITION_AFTER_START:this.setEnd(a,0);break;case CKEDITOR.POSITION_BEFORE_END:a.type==CKEDITOR.NODE_TEXT?this.setEnd(a,a.getLength()):this.setEnd(a,a.getChildCount());break;case CKEDITOR.POSITION_BEFORE_START:this.setEndBefore(a);break;
+case CKEDITOR.POSITION_AFTER_END:this.setEndAfter(a)}c(this)},fixBlock:function(a,b){var c=this.createBookmark(),d=this.document.createElement(b);this.collapse(a);this.enlarge(CKEDITOR.ENLARGE_BLOCK_CONTENTS);this.extractContents().appendTo(d);d.trim();d.appendBogus();this.insertNode(d);this.moveToBookmark(c);return d},splitBlock:function(a){var b=new CKEDITOR.dom.elementPath(this.startContainer,this.root),c=new CKEDITOR.dom.elementPath(this.endContainer,this.root),d=b.block,e=c.block,f=null;if(!b.blockLimit.equals(c.blockLimit))return null;
+if(a!="br"){if(!d){d=this.fixBlock(true,a);e=(new CKEDITOR.dom.elementPath(this.endContainer,this.root)).block}e||(e=this.fixBlock(false,a))}a=d&&this.checkStartOfBlock();b=e&&this.checkEndOfBlock();this.deleteContents();if(d&&d.equals(e))if(b){f=new CKEDITOR.dom.elementPath(this.startContainer,this.root);this.moveToPosition(e,CKEDITOR.POSITION_AFTER_END);e=null}else if(a){f=new CKEDITOR.dom.elementPath(this.startContainer,this.root);this.moveToPosition(d,CKEDITOR.POSITION_BEFORE_START);d=null}else{e=
+this.splitElement(d);d.is("ul","ol")||d.appendBogus()}return{previousBlock:d,nextBlock:e,wasStartOfBlock:a,wasEndOfBlock:b,elementPath:f}},splitElement:function(a){if(!this.collapsed)return null;this.setEndAt(a,CKEDITOR.POSITION_BEFORE_END);var b=this.extractContents(),c=a.clone(false);b.appendTo(c);c.insertAfter(a);this.moveToPosition(a,CKEDITOR.POSITION_AFTER_END);return c},removeEmptyBlocksAtEnd:function(){function a(d){return function(a){return b(a)||(c(a)||a.type==CKEDITOR.NODE_ELEMENT&&a.isEmptyInlineRemoveable())||
+d.is("table")&&a.is("caption")?false:true}}var b=CKEDITOR.dom.walker.whitespaces(),c=CKEDITOR.dom.walker.bookmark(false);return function(b){for(var c=this.createBookmark(),d=this[b?"endPath":"startPath"](),e=d.block||d.blockLimit,f;e&&!e.equals(d.root)&&!e.getFirst(a(e));){f=e.getParent();this[b?"setEndAt":"setStartAt"](e,CKEDITOR.POSITION_AFTER_END);e.remove(1);e=f}this.moveToBookmark(c)}}(),startPath:function(){return new CKEDITOR.dom.elementPath(this.startContainer,this.root)},endPath:function(){return new CKEDITOR.dom.elementPath(this.endContainer,
+this.root)},checkBoundaryOfElement:function(a,b){var c=b==CKEDITOR.START,d=this.clone();d.collapse(c);d[c?"setStartAt":"setEndAt"](a,c?CKEDITOR.POSITION_AFTER_START:CKEDITOR.POSITION_BEFORE_END);d=new CKEDITOR.dom.walker(d);d.evaluator=f(c);return d[c?"checkBackward":"checkForward"]()},checkStartOfBlock:function(){var b=this.startContainer,c=this.startOffset;if(CKEDITOR.env.ie&&c&&b.type==CKEDITOR.NODE_TEXT){b=CKEDITOR.tools.ltrim(b.substring(0,c));k.test(b)&&this.trim(0,1)}this.trim();b=new CKEDITOR.dom.elementPath(this.startContainer,
+this.root);c=this.clone();c.collapse(true);c.setStartAt(b.block||b.blockLimit,CKEDITOR.POSITION_AFTER_START);b=new CKEDITOR.dom.walker(c);b.evaluator=a();return b.checkBackward()},checkEndOfBlock:function(){var b=this.endContainer,c=this.endOffset;if(CKEDITOR.env.ie&&b.type==CKEDITOR.NODE_TEXT){b=CKEDITOR.tools.rtrim(b.substring(c));k.test(b)&&this.trim(1,0)}this.trim();b=new CKEDITOR.dom.elementPath(this.endContainer,this.root);c=this.clone();c.collapse(false);c.setEndAt(b.block||b.blockLimit,CKEDITOR.POSITION_BEFORE_END);
+b=new CKEDITOR.dom.walker(c);b.evaluator=a();return b.checkForward()},getPreviousNode:function(a,b,c){var d=this.clone();d.collapse(1);d.setStartAt(c||this.root,CKEDITOR.POSITION_AFTER_START);c=new CKEDITOR.dom.walker(d);c.evaluator=a;c.guard=b;return c.previous()},getNextNode:function(a,b,c){var d=this.clone();d.collapse();d.setEndAt(c||this.root,CKEDITOR.POSITION_BEFORE_END);c=new CKEDITOR.dom.walker(d);c.evaluator=a;c.guard=b;return c.next()},checkReadOnly:function(){function a(b,c){for(;b;){if(b.type==
+CKEDITOR.NODE_ELEMENT){if(b.getAttribute("contentEditable")=="false"&&!b.data("cke-editable"))return 0;if(b.is("html")||b.getAttribute("contentEditable")=="true"&&(b.contains(c)||b.equals(c)))break}b=b.getParent()}return 1}return function(){var b=this.startContainer,c=this.endContainer;return!(a(b,c)&&a(c,b))}}(),moveToElementEditablePosition:function(a,b){if(a.type==CKEDITOR.NODE_ELEMENT&&!a.isEditable(false)){this.moveToPosition(a,b?CKEDITOR.POSITION_AFTER_END:CKEDITOR.POSITION_BEFORE_START);return true}for(var c=
+0;a;){if(a.type==CKEDITOR.NODE_TEXT){b&&this.endContainer&&this.checkEndOfBlock()&&k.test(a.getText())?this.moveToPosition(a,CKEDITOR.POSITION_BEFORE_START):this.moveToPosition(a,b?CKEDITOR.POSITION_AFTER_END:CKEDITOR.POSITION_BEFORE_START);c=1;break}if(a.type==CKEDITOR.NODE_ELEMENT)if(a.isEditable()){this.moveToPosition(a,b?CKEDITOR.POSITION_BEFORE_END:CKEDITOR.POSITION_AFTER_START);c=1}else if(b&&a.is("br")&&this.endContainer&&this.checkEndOfBlock())this.moveToPosition(a,CKEDITOR.POSITION_BEFORE_START);
+else if(a.getAttribute("contenteditable")=="false"&&a.is(CKEDITOR.dtd.$block)){this.setStartBefore(a);this.setEndAfter(a);return true}var d=a,e=c,f=void 0;d.type==CKEDITOR.NODE_ELEMENT&&d.isEditable(false)&&(f=d[b?"getLast":"getFirst"](g));!e&&!f&&(f=d[b?"getPrevious":"getNext"](g));a=f}return!!c},moveToClosestEditablePosition:function(a,b){var c=new CKEDITOR.dom.range(this.root),d=0,e,f=[CKEDITOR.POSITION_AFTER_END,CKEDITOR.POSITION_BEFORE_START];c.moveToPosition(a,f[b?0:1]);if(a.is(CKEDITOR.dtd.$block)){if(e=
+c[b?"getNextEditableNode":"getPreviousEditableNode"]()){d=1;if(e.type==CKEDITOR.NODE_ELEMENT&&e.is(CKEDITOR.dtd.$block)&&e.getAttribute("contenteditable")=="false"){c.setStartAt(e,CKEDITOR.POSITION_BEFORE_START);c.setEndAt(e,CKEDITOR.POSITION_AFTER_END)}else c.moveToPosition(e,f[b?1:0])}}else d=1;d&&this.moveToRange(c);return!!d},moveToElementEditStart:function(a){return this.moveToElementEditablePosition(a)},moveToElementEditEnd:function(a){return this.moveToElementEditablePosition(a,true)},getEnclosedNode:function(){var a=
+this.clone();a.optimize();if(a.startContainer.type!=CKEDITOR.NODE_ELEMENT||a.endContainer.type!=CKEDITOR.NODE_ELEMENT)return null;var a=new CKEDITOR.dom.walker(a),b=CKEDITOR.dom.walker.bookmark(false,true),c=CKEDITOR.dom.walker.whitespaces(true);a.evaluator=function(a){return c(a)&&b(a)};var d=a.next();a.reset();return d&&d.equals(a.previous())?d:null},getTouchedStartNode:function(){var a=this.startContainer;return this.collapsed||a.type!=CKEDITOR.NODE_ELEMENT?a:a.getChild(this.startOffset)||a},getTouchedEndNode:function(){var a=
+this.endContainer;return this.collapsed||a.type!=CKEDITOR.NODE_ELEMENT?a:a.getChild(this.endOffset-1)||a},getNextEditableNode:b(),getPreviousEditableNode:b(1),scrollIntoView:function(){var a=new CKEDITOR.dom.element.createFromHtml("<span>&nbsp;</span>",this.document),b,c,d,e=this.clone();e.optimize();if(d=e.startContainer.type==CKEDITOR.NODE_TEXT){c=e.startContainer.getText();b=e.startContainer.split(e.startOffset);a.insertAfter(e.startContainer)}else e.insertNode(a);a.scrollIntoView();if(d){e.startContainer.setText(c);
+b.remove()}a.remove()},_setStartContainer:function(a){this.startContainer=a},_setEndContainer:function(a){this.endContainer=a}}})();CKEDITOR.POSITION_AFTER_START=1;CKEDITOR.POSITION_BEFORE_END=2;CKEDITOR.POSITION_BEFORE_START=3;CKEDITOR.POSITION_AFTER_END=4;CKEDITOR.ENLARGE_ELEMENT=1;CKEDITOR.ENLARGE_BLOCK_CONTENTS=2;CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS=3;CKEDITOR.ENLARGE_INLINE=4;CKEDITOR.START=1;CKEDITOR.END=2;CKEDITOR.SHRINK_ELEMENT=1;CKEDITOR.SHRINK_TEXT=2;"use strict";
+(function(){function a(a){if(!(arguments.length<1)){this.range=a;this.forceBrBreak=0;this.enlargeBr=1;this.enforceRealBlocks=0;this._||(this._={})}}function f(a){var b=[];a.forEach(function(a){if(a.getAttribute("contenteditable")=="true"){b.push(a);return false}},CKEDITOR.NODE_ELEMENT,true);return b}function b(a,c,d,e){a:{e==null&&(e=f(d));for(var h;h=e.shift();)if(h.getDtd().p){e={element:h,remaining:e};break a}e=null}if(!e)return 0;if((h=CKEDITOR.filter.instances[e.element.data("cke-filter")])&&
+!h.check(c))return b(a,c,d,e.remaining);c=new CKEDITOR.dom.range(e.element);c.selectNodeContents(e.element);c=c.createIterator();c.enlargeBr=a.enlargeBr;c.enforceRealBlocks=a.enforceRealBlocks;c.activeFilter=c.filter=h;a._.nestedEditable={element:e.element,container:d,remaining:e.remaining,iterator:c};return 1}function c(a,b,c){if(!b)return false;a=a.clone();a.collapse(!c);return a.checkBoundaryOfElement(b,c?CKEDITOR.START:CKEDITOR.END)}var e=/^[\r\n\t ]+$/,d=CKEDITOR.dom.walker.bookmark(false,true),
+h=CKEDITOR.dom.walker.whitespaces(true),k=function(a){return d(a)&&h(a)},j={dd:1,dt:1,li:1};a.prototype={getNextParagraph:function(a){var f,h,s,w,q,a=a||"p";if(this._.nestedEditable){if(f=this._.nestedEditable.iterator.getNextParagraph(a)){this.activeFilter=this._.nestedEditable.iterator.activeFilter;return f}this.activeFilter=this.filter;if(b(this,a,this._.nestedEditable.container,this._.nestedEditable.remaining)){this.activeFilter=this._.nestedEditable.iterator.activeFilter;return this._.nestedEditable.iterator.getNextParagraph(a)}this._.nestedEditable=
+null}if(!this.range.root.getDtd()[a])return null;if(!this._.started){var t=this.range.clone();h=t.startPath();var i=t.endPath(),A=!t.collapsed&&c(t,h.block),u=!t.collapsed&&c(t,i.block,1);t.shrink(CKEDITOR.SHRINK_ELEMENT,true);A&&t.setStartAt(h.block,CKEDITOR.POSITION_BEFORE_END);u&&t.setEndAt(i.block,CKEDITOR.POSITION_AFTER_START);h=t.endContainer.hasAscendant("pre",true)||t.startContainer.hasAscendant("pre",true);t.enlarge(this.forceBrBreak&&!h||!this.enlargeBr?CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS:
+CKEDITOR.ENLARGE_BLOCK_CONTENTS);if(!t.collapsed){h=new CKEDITOR.dom.walker(t.clone());i=CKEDITOR.dom.walker.bookmark(true,true);h.evaluator=i;this._.nextNode=h.next();h=new CKEDITOR.dom.walker(t.clone());h.evaluator=i;h=h.previous();this._.lastNode=h.getNextSourceNode(true,null,t.root);if(this._.lastNode&&this._.lastNode.type==CKEDITOR.NODE_TEXT&&!CKEDITOR.tools.trim(this._.lastNode.getText())&&this._.lastNode.getParent().isBlockBoundary()){i=this.range.clone();i.moveToPosition(this._.lastNode,CKEDITOR.POSITION_AFTER_END);
+if(i.checkEndOfBlock()){i=new CKEDITOR.dom.elementPath(i.endContainer,i.root);this._.lastNode=(i.block||i.blockLimit).getNextSourceNode(true)}}if(!this._.lastNode||!t.root.contains(this._.lastNode)){this._.lastNode=this._.docEndMarker=t.document.createText("");this._.lastNode.insertAfter(h)}t=null}this._.started=1;h=t}i=this._.nextNode;t=this._.lastNode;for(this._.nextNode=null;i;){var A=0,u=i.hasAscendant("pre"),o=i.type!=CKEDITOR.NODE_ELEMENT,l=0;if(o)i.type==CKEDITOR.NODE_TEXT&&e.test(i.getText())&&
+(o=0);else{var p=i.getName();if(CKEDITOR.dtd.$block[p]&&i.getAttribute("contenteditable")=="false"){f=i;b(this,a,f);break}else if(i.isBlockBoundary(this.forceBrBreak&&!u&&{br:1})){if(p=="br")o=1;else if(!h&&!i.getChildCount()&&p!="hr"){f=i;s=i.equals(t);break}if(h){h.setEndAt(i,CKEDITOR.POSITION_BEFORE_START);if(p!="br")this._.nextNode=i}A=1}else{if(i.getFirst()){if(!h){h=this.range.clone();h.setStartAt(i,CKEDITOR.POSITION_BEFORE_START)}i=i.getFirst();continue}o=1}}if(o&&!h){h=this.range.clone();
+h.setStartAt(i,CKEDITOR.POSITION_BEFORE_START)}s=(!A||o)&&i.equals(t);if(h&&!A)for(;!i.getNext(k)&&!s;){p=i.getParent();if(p.isBlockBoundary(this.forceBrBreak&&!u&&{br:1})){A=1;o=0;s||p.equals(t);h.setEndAt(p,CKEDITOR.POSITION_BEFORE_END);break}i=p;o=1;s=i.equals(t);l=1}o&&h.setEndAt(i,CKEDITOR.POSITION_AFTER_END);i=this._getNextSourceNode(i,l,t);if((s=!i)||A&&h)break}if(!f){if(!h){this._.docEndMarker&&this._.docEndMarker.remove();return this._.nextNode=null}f=new CKEDITOR.dom.elementPath(h.startContainer,
+h.root);i=f.blockLimit;A={div:1,th:1,td:1};f=f.block;if(!f&&i&&!this.enforceRealBlocks&&A[i.getName()]&&h.checkStartOfBlock()&&h.checkEndOfBlock()&&!i.equals(h.root))f=i;else if(!f||this.enforceRealBlocks&&f.is(j)){f=this.range.document.createElement(a);h.extractContents().appendTo(f);f.trim();h.insertNode(f);w=q=true}else if(f.getName()!="li"){if(!h.checkStartOfBlock()||!h.checkEndOfBlock()){f=f.clone(false);h.extractContents().appendTo(f);f.trim();q=h.splitBlock();w=!q.wasStartOfBlock;q=!q.wasEndOfBlock;
+h.insertNode(f)}}else if(!s)this._.nextNode=f.equals(t)?null:this._getNextSourceNode(h.getBoundaryNodes().endNode,1,t)}if(w)(w=f.getPrevious())&&w.type==CKEDITOR.NODE_ELEMENT&&(w.getName()=="br"?w.remove():w.getLast()&&w.getLast().$.nodeName.toLowerCase()=="br"&&w.getLast().remove());if(q)(w=f.getLast())&&w.type==CKEDITOR.NODE_ELEMENT&&w.getName()=="br"&&(!CKEDITOR.env.needsBrFiller||w.getPrevious(d)||w.getNext(d))&&w.remove();if(!this._.nextNode)this._.nextNode=s||f.equals(t)||!t?null:this._getNextSourceNode(f,
+1,t);return f},_getNextSourceNode:function(a,b,c){function e(a){return!(a.equals(c)||a.equals(f))}for(var f=this.range.root,a=a.getNextSourceNode(b,null,e);!d(a);)a=a.getNextSourceNode(b,null,e);return a}};CKEDITOR.dom.range.prototype.createIterator=function(){return new a(this)}})();
+CKEDITOR.command=function(a,f){this.uiItems=[];this.exec=function(b){if(this.state==CKEDITOR.TRISTATE_DISABLED||!this.checkAllowed())return false;this.editorFocus&&a.focus();return this.fire("exec")===false?true:f.exec.call(this,a,b)!==false};this.refresh=function(a,b){if(!this.readOnly&&a.readOnly)return true;if(this.context&&!b.isContextFor(this.context)){this.disable();return true}if(!this.checkAllowed(true)){this.disable();return true}this.startDisabled||this.enable();this.modes&&!this.modes[a.mode]&&
+this.disable();return this.fire("refresh",{editor:a,path:b})===false?true:f.refresh&&f.refresh.apply(this,arguments)!==false};var b;this.checkAllowed=function(c){return!c&&typeof b=="boolean"?b:b=a.activeFilter.checkFeature(this)};CKEDITOR.tools.extend(this,f,{modes:{wysiwyg:1},editorFocus:1,contextSensitive:!!f.context,state:CKEDITOR.TRISTATE_DISABLED});CKEDITOR.event.call(this)};
+CKEDITOR.command.prototype={enable:function(){this.state==CKEDITOR.TRISTATE_DISABLED&&this.checkAllowed()&&this.setState(!this.preserveState||typeof this.previousState=="undefined"?CKEDITOR.TRISTATE_OFF:this.previousState)},disable:function(){this.setState(CKEDITOR.TRISTATE_DISABLED)},setState:function(a){if(this.state==a||a!=CKEDITOR.TRISTATE_DISABLED&&!this.checkAllowed())return false;this.previousState=this.state;this.state=a;this.fire("state");return true},toggleState:function(){this.state==CKEDITOR.TRISTATE_OFF?
+this.setState(CKEDITOR.TRISTATE_ON):this.state==CKEDITOR.TRISTATE_ON&&this.setState(CKEDITOR.TRISTATE_OFF)}};CKEDITOR.event.implementOn(CKEDITOR.command.prototype);CKEDITOR.ENTER_P=1;CKEDITOR.ENTER_BR=2;CKEDITOR.ENTER_DIV=3;
+CKEDITOR.config={customConfig:"config.js",autoUpdateElement:!0,language:"",defaultLanguage:"en",contentsLangDirection:"",enterMode:CKEDITOR.ENTER_P,forceEnterMode:!1,shiftEnterMode:CKEDITOR.ENTER_BR,docType:"<!DOCTYPE html>",bodyId:"",bodyClass:"",fullPage:!1,height:200,extraPlugins:"",removePlugins:"",protectedSource:[],tabIndex:0,width:"",baseFloatZIndex:1E4,blockedKeystrokes:[CKEDITOR.CTRL+66,CKEDITOR.CTRL+73,CKEDITOR.CTRL+85]};
+(function(){function a(a,b,c,d,e){var f,p,a=[];for(f in b){p=b[f];p=typeof p=="boolean"?{}:typeof p=="function"?{match:p}:K(p);if(f.charAt(0)!="$")p.elements=f;if(c)p.featureName=c.toLowerCase();var i=p;i.elements=h(i.elements,/\s+/)||null;i.propertiesOnly=i.propertiesOnly||i.elements===true;var l=/\s*,\s*/,r=void 0;for(r in z){i[r]=h(i[r],l)||null;var x=i,n=B[r],v=h(i[B[r]],l),q=i[r],E=[],g=true,o=void 0;v?g=false:v={};for(o in q)if(o.charAt(0)=="!"){o=o.slice(1);E.push(o);v[o]=true;g=false}for(;o=
+E.pop();){q[o]=q["!"+o];delete q["!"+o]}x[n]=(g?false:v)||null}i.match=i.match||null;d.push(p);a.push(p)}for(var b=e.elements,e=e.generic,C,c=0,d=a.length;c<d;++c){f=K(a[c]);p=f.classes===true||f.styles===true||f.attributes===true;i=f;r=n=l=void 0;for(l in z)i[l]=A(i[l]);x=true;for(r in B){l=B[r];n=i[l];v=[];q=void 0;for(q in n)q.indexOf("*")>-1?v.push(RegExp("^"+q.replace(/\*/g,".*")+"$")):v.push(q);n=v;if(n.length){i[l]=n;x=false}}i.nothingRequired=x;i.noProperties=!(i.attributes||i.classes||i.styles);
+if(f.elements===true||f.elements===null)e[p?"unshift":"push"](f);else{i=f.elements;delete f.elements;for(C in i)if(b[C])b[C][p?"unshift":"push"](f);else b[C]=[f]}}}function f(a,c,d,e){if(!a.match||a.match(c))if(e||k(a,c)){if(!a.propertiesOnly)d.valid=true;if(!d.allAttributes)d.allAttributes=b(a.attributes,c.attributes,d.validAttributes);if(!d.allStyles)d.allStyles=b(a.styles,c.styles,d.validStyles);if(!d.allClasses){a=a.classes;c=c.classes;e=d.validClasses;if(a)if(a===true)a=true;else{for(var f=0,
+p=c.length,i;f<p;++f){i=c[f];e[i]||(e[i]=a(i))}a=false}else a=false;d.allClasses=a}}}function b(a,b,c){if(!a)return false;if(a===true)return true;for(var d in b)c[d]||(c[d]=a(d));return false}function c(a,b,c){if(!a.match||a.match(b)){if(a.noProperties)return false;c.hadInvalidAttribute=e(a.attributes,b.attributes)||c.hadInvalidAttribute;c.hadInvalidStyle=e(a.styles,b.styles)||c.hadInvalidStyle;a=a.classes;b=b.classes;if(a){for(var d=false,f=a===true,p=b.length;p--;)if(f||a(b[p])){b.splice(p,1);d=
+true}a=d}else a=false;c.hadInvalidClass=a||c.hadInvalidClass}}function e(a,b){if(!a)return false;var c=false,d=a===true,e;for(e in b)if(d||a(e)){delete b[e];c=true}return c}function d(a,b,c){if(a.disabled||a.customConfig&&!c||!b)return false;a._.cachedChecks={};return true}function h(a,b){if(!a)return false;if(a===true)return a;if(typeof a=="string"){a=I(a);return a=="*"?true:CKEDITOR.tools.convertArrayToObject(a.split(b))}if(CKEDITOR.tools.isArray(a))return a.length?CKEDITOR.tools.convertArrayToObject(a):
+false;var c={},d=0,e;for(e in a){c[e]=a[e];d++}return d?c:false}function k(a,b){if(a.nothingRequired)return true;var c,d,e,f;if(e=a.requiredClasses){f=b.classes;for(c=0;c<e.length;++c){d=e[c];if(typeof d=="string"){if(CKEDITOR.tools.indexOf(f,d)==-1)return false}else if(!CKEDITOR.tools.checkIfAnyArrayItemMatches(f,d))return false}}return j(b.styles,a.requiredStyles)&&j(b.attributes,a.requiredAttributes)}function j(a,b){if(!b)return true;for(var c=0,d;c<b.length;++c){d=b[c];if(typeof d=="string"){if(!(d in
+a))return false}else if(!CKEDITOR.tools.checkIfAnyObjectPropertyMatches(a,d))return false}return true}function g(a){if(!a)return{};for(var a=a.split(/\s*,\s*/).sort(),b={};a.length;)b[a.shift()]=v;return b}function m(a){for(var b,c,d,e,f={},p=1,a=I(a);b=a.match(x);){if(c=b[2]){d=y(c,"styles");e=y(c,"attrs");c=y(c,"classes")}else d=e=c=null;f["$"+p++]={elements:b[1],classes:c,styles:d,attributes:e};a=a.slice(b[0].length)}return f}function y(a,b){var c=a.match(E[b]);return c?I(c[1]):null}function s(a){var b=
+a.styleBackup=a.attributes.style,c=a.classBackup=a.attributes["class"];if(!a.styles)a.styles=CKEDITOR.tools.parseCssText(b||"",1);if(!a.classes)a.classes=c?c.split(/\s+/):[]}function w(a,b,d,e){var l=0,r;if(e.toHtml)b.name=b.name.replace($,"$1");if(e.doCallbacks&&a.elementCallbacks){a:for(var x=a.elementCallbacks,h=0,n=x.length,v;h<n;++h)if(v=x[h](b)){r=v;break a}if(r)return r}if(e.doTransform)if(r=a._.transformations[b.name]){s(b);for(x=0;x<r.length;++x)p(a,b,r[x]);t(b)}if(e.doFilter){a:{x=b.name;
+h=a._;a=h.allowedRules.elements[x];r=h.allowedRules.generic;x=h.disallowedRules.elements[x];h=h.disallowedRules.generic;n=e.skipRequired;v={valid:false,validAttributes:{},validClasses:{},validStyles:{},allAttributes:false,allClasses:false,allStyles:false,hadInvalidAttribute:false,hadInvalidClass:false,hadInvalidStyle:false};var q,z;if(!a&&!r)a=null;else{s(b);if(x){q=0;for(z=x.length;q<z;++q)if(c(x[q],b,v)===false){a=null;break a}}if(h){q=0;for(z=h.length;q<z;++q)c(h[q],b,v)}if(a){q=0;for(z=a.length;q<
+z;++q)f(a[q],b,v,n)}if(r){q=0;for(z=r.length;q<z;++q)f(r[q],b,v,n)}a=v}}if(!a){d.push(b);return F}if(!a.valid){d.push(b);return F}z=a.validAttributes;var E=a.validStyles;r=a.validClasses;var x=b.attributes,A=b.styles,h=b.classes,n=b.classBackup,o=b.styleBackup,g,B,C=[];v=[];var j=/^data-cke-/;q=false;delete x.style;delete x["class"];delete b.classBackup;delete b.styleBackup;if(!a.allAttributes)for(g in x)if(!z[g])if(j.test(g)){if(g!=(B=g.replace(/^data-cke-saved-/,""))&&!z[B]){delete x[g];q=true}}else{delete x[g];
+q=true}if(!a.allStyles||a.hadInvalidStyle){for(g in A)a.allStyles||E[g]?C.push(g+":"+A[g]):q=true;if(C.length)x.style=C.sort().join("; ")}else if(o)x.style=o;if(!a.allClasses||a.hadInvalidClass){for(g=0;g<h.length;++g)(a.allClasses||r[h[g]])&&v.push(h[g]);v.length&&(x["class"]=v.sort().join(" "));n&&v.length<n.split(/\s+/).length&&(q=true)}else n&&(x["class"]=n);q&&(l=F);if(!e.skipFinalValidation&&!i(b)){d.push(b);return F}}if(e.toHtml)b.name=b.name.replace(aa,"cke:$1");return l}function q(a){var b=
+[],c;for(c in a)c.indexOf("*")>-1&&b.push(c.replace(/\*/g,".*"));return b.length?RegExp("^(?:"+b.join("|")+")$"):null}function t(a){var b=a.attributes,c;delete b.style;delete b["class"];if(c=CKEDITOR.tools.writeCssText(a.styles,true))b.style=c;a.classes.length&&(b["class"]=a.classes.sort().join(" "))}function i(a){switch(a.name){case "a":if(!a.children.length&&!a.attributes.name)return false;break;case "img":if(!a.attributes.src)return false}return true}function A(a){if(!a)return false;if(a===true)return true;
+var b=q(a);return function(c){return c in a||b&&c.match(b)}}function u(){return new CKEDITOR.htmlParser.element("br")}function o(a){return a.type==CKEDITOR.NODE_ELEMENT&&(a.name=="br"||L.$block[a.name])}function l(a,b,c){var d=a.name;if(L.$empty[d]||!a.children.length)if(d=="hr"&&b=="br")a.replaceWith(u());else{a.parent&&c.push({check:"it",el:a.parent});a.remove()}else if(L.$block[d]||d=="tr")if(b=="br"){if(a.previous&&!o(a.previous)){b=u();b.insertBefore(a)}if(a.next&&!o(a.next)){b=u();b.insertAfter(a)}a.replaceWithChildren()}else{var d=
+a.children,e;b:{e=L[b];for(var f=0,p=d.length,i;f<p;++f){i=d[f];if(i.type==CKEDITOR.NODE_ELEMENT&&!e[i.name]){e=false;break b}}e=true}if(e){a.name=b;a.attributes={};c.push({check:"parent-down",el:a})}else{e=a.parent;for(var f=e.type==CKEDITOR.NODE_DOCUMENT_FRAGMENT||e.name=="body",l,r,p=d.length;p>0;){i=d[--p];if(f&&(i.type==CKEDITOR.NODE_TEXT||i.type==CKEDITOR.NODE_ELEMENT&&L.$inline[i.name])){if(!l){l=new CKEDITOR.htmlParser.element(b);l.insertAfter(a);c.push({check:"parent-down",el:l})}l.add(i,
+0)}else{l=null;r=L[e.name]||L.span;i.insertAfter(a);e.type!=CKEDITOR.NODE_DOCUMENT_FRAGMENT&&(i.type==CKEDITOR.NODE_ELEMENT&&!r[i.name])&&c.push({check:"el-up",el:i})}}a.remove()}}else if(d=="style")a.remove();else{a.parent&&c.push({check:"it",el:a.parent});a.replaceWithChildren()}}function p(a,b,c){var d,e;for(d=0;d<c.length;++d){e=c[d];if((!e.check||a.check(e.check,false))&&(!e.left||e.left(b))){e.right(b,ba);break}}}function r(a,b){var c=b.getDefinition(),d=c.attributes,e=c.styles,f,p,i,l;if(a.name!=
+c.element)return false;for(f in d)if(f=="class"){c=d[f].split(/\s+/);for(i=a.classes.join("|");l=c.pop();)if(i.indexOf(l)==-1)return false}else if(a.attributes[f]!=d[f])return false;for(p in e)if(a.styles[p]!=e[p])return false;return true}function n(a,b){var c,d;if(typeof a=="string")c=a;else if(a instanceof CKEDITOR.style)d=a;else{c=a[0];d=a[1]}return[{element:c,left:d,right:function(a,c){c.transform(a,b)}}]}function P(a){return function(b){return r(b,a)}}function C(a){return function(b,c){c[a](b)}}
+var L=CKEDITOR.dtd,F=1,K=CKEDITOR.tools.copy,I=CKEDITOR.tools.trim,v="cke-test",G=["","p","br","div"];CKEDITOR.FILTER_SKIP_TREE=2;CKEDITOR.filter=function(a){this.allowedContent=[];this.disallowedContent=[];this.elementCallbacks=null;this.disabled=false;this.editor=null;this.id=CKEDITOR.tools.getNextNumber();this._={allowedRules:{elements:{},generic:[]},disallowedRules:{elements:{},generic:[]},transformations:{},cachedTests:{}};CKEDITOR.filter.instances[this.id]=this;if(a instanceof CKEDITOR.editor){a=
+this.editor=a;this.customConfig=true;var b=a.config.allowedContent;if(b===true)this.disabled=true;else{if(!b)this.customConfig=false;this.allow(b,"config",1);this.allow(a.config.extraAllowedContent,"extra",1);this.allow(G[a.enterMode]+" "+G[a.shiftEnterMode],"default",1);this.disallow(a.config.disallowedContent)}}else{this.customConfig=false;this.allow(a,"default",1)}};CKEDITOR.filter.instances={};CKEDITOR.filter.prototype={allow:function(b,c,e){if(!d(this,b,e))return false;var f,p;if(typeof b=="string")b=
+m(b);else if(b instanceof CKEDITOR.style){if(b.toAllowedContentRules)return this.allow(b.toAllowedContentRules(this.editor),c,e);f=b.getDefinition();b={};e=f.attributes;b[f.element]=f={styles:f.styles,requiredStyles:f.styles&&CKEDITOR.tools.objectKeys(f.styles)};if(e){e=K(e);f.classes=e["class"]?e["class"].split(/\s+/):null;f.requiredClasses=f.classes;delete e["class"];f.attributes=e;f.requiredAttributes=e&&CKEDITOR.tools.objectKeys(e)}}else if(CKEDITOR.tools.isArray(b)){for(f=0;f<b.length;++f)p=
+this.allow(b[f],c,e);return p}a(this,b,c,this.allowedContent,this._.allowedRules);return true},applyTo:function(a,b,c,d){if(this.disabled)return false;var e=this,f=[],p=this.editor&&this.editor.config.protectedSource,r,x=false,h={doFilter:!c,doTransform:true,doCallbacks:true,toHtml:b};a.forEach(function(a){if(a.type==CKEDITOR.NODE_ELEMENT){if(a.attributes["data-cke-filter"]=="off")return false;if(!b||!(a.name=="span"&&~CKEDITOR.tools.objectKeys(a.attributes).join("|").indexOf("data-cke-"))){r=w(e,
+a,f,h);if(r&F)x=true;else if(r&2)return false}}else if(a.type==CKEDITOR.NODE_COMMENT&&a.value.match(/^\{cke_protected\}(?!\{C\})/)){var c;a:{var d=decodeURIComponent(a.value.replace(/^\{cke_protected\}/,""));c=[];var i,l,n;if(p)for(l=0;l<p.length;++l)if((n=d.match(p[l]))&&n[0].length==d.length){c=true;break a}d=CKEDITOR.htmlParser.fragment.fromHtml(d);d.children.length==1&&(i=d.children[0]).type==CKEDITOR.NODE_ELEMENT&&w(e,i,c,h);c=!c.length}c||f.push(a)}},null,true);f.length&&(x=true);for(var n,
+a=[],d=G[d||(this.editor?this.editor.enterMode:CKEDITOR.ENTER_P)],q;c=f.pop();)c.type==CKEDITOR.NODE_ELEMENT?l(c,d,a):c.remove();for(;n=a.pop();){c=n.el;if(c.parent){q=L[c.parent.name]||L.span;switch(n.check){case "it":L.$removeEmpty[c.name]&&!c.children.length?l(c,d,a):i(c)||l(c,d,a);break;case "el-up":c.parent.type!=CKEDITOR.NODE_DOCUMENT_FRAGMENT&&!q[c.name]&&l(c,d,a);break;case "parent-down":c.parent.type!=CKEDITOR.NODE_DOCUMENT_FRAGMENT&&!q[c.name]&&l(c.parent,d,a)}}}return x},checkFeature:function(a){if(this.disabled||
+!a)return true;a.toFeature&&(a=a.toFeature(this.editor));return!a.requiredContent||this.check(a.requiredContent)},disable:function(){this.disabled=true},disallow:function(b){if(!d(this,b,true))return false;typeof b=="string"&&(b=m(b));a(this,b,null,this.disallowedContent,this._.disallowedRules);return true},addContentForms:function(a){if(!this.disabled&&a){var b,c,d=[],e;for(b=0;b<a.length&&!e;++b){c=a[b];if((typeof c=="string"||c instanceof CKEDITOR.style)&&this.check(c))e=c}if(e){for(b=0;b<a.length;++b)d.push(n(a[b],
+e));this.addTransformations(d)}}},addElementCallback:function(a){if(!this.elementCallbacks)this.elementCallbacks=[];this.elementCallbacks.push(a)},addFeature:function(a){if(this.disabled||!a)return true;a.toFeature&&(a=a.toFeature(this.editor));this.allow(a.allowedContent,a.name);this.addTransformations(a.contentTransformations);this.addContentForms(a.contentForms);return a.requiredContent&&(this.customConfig||this.disallowedContent.length)?this.check(a.requiredContent):true},addTransformations:function(a){var b,
+c;if(!this.disabled&&a){var d=this._.transformations,e;for(e=0;e<a.length;++e){b=a[e];var f=void 0,p=void 0,i=void 0,l=void 0,r=void 0,x=void 0;c=[];for(p=0;p<b.length;++p){i=b[p];if(typeof i=="string"){i=i.split(/\s*:\s*/);l=i[0];r=null;x=i[1]}else{l=i.check;r=i.left;x=i.right}if(!f){f=i;f=f.element?f.element:l?l.match(/^([a-z0-9]+)/i)[0]:f.left.getDefinition().element}r instanceof CKEDITOR.style&&(r=P(r));c.push({check:l==f?null:l,left:r,right:typeof x=="string"?C(x):x})}b=f;d[b]||(d[b]=[]);d[b].push(c)}}},
+check:function(a,b,c){if(this.disabled)return true;if(CKEDITOR.tools.isArray(a)){for(var d=a.length;d--;)if(this.check(a[d],b,c))return true;return false}var e,f;if(typeof a=="string"){f=a+"<"+(b===false?"0":"1")+(c?"1":"0")+">";if(f in this._.cachedChecks)return this._.cachedChecks[f];d=m(a).$1;e=d.styles;var i=d.classes;d.name=d.elements;d.classes=i=i?i.split(/\s*,\s*/):[];d.styles=g(e);d.attributes=g(d.attributes);d.children=[];i.length&&(d.attributes["class"]=i.join(" "));if(e)d.attributes.style=
+CKEDITOR.tools.writeCssText(d.styles);e=d}else{d=a.getDefinition();e=d.styles;i=d.attributes||{};if(e){e=K(e);i.style=CKEDITOR.tools.writeCssText(e,true)}else e={};e={name:d.element,attributes:i,classes:i["class"]?i["class"].split(/\s+/):[],styles:e,children:[]}}var i=CKEDITOR.tools.clone(e),l=[],r;if(b!==false&&(r=this._.transformations[e.name])){for(d=0;d<r.length;++d)p(this,e,r[d]);t(e)}w(this,i,l,{doFilter:true,doTransform:b!==false,skipRequired:!c,skipFinalValidation:!c});b=l.length>0?false:
+CKEDITOR.tools.objectCompare(e.attributes,i.attributes,true)?true:false;typeof a=="string"&&(this._.cachedChecks[f]=b);return b},getAllowedEnterMode:function(){var a=["p","div","br"],b={p:CKEDITOR.ENTER_P,div:CKEDITOR.ENTER_DIV,br:CKEDITOR.ENTER_BR};return function(c,d){var e=a.slice(),f;if(this.check(G[c]))return c;for(d||(e=e.reverse());f=e.pop();)if(this.check(f))return b[f];return CKEDITOR.ENTER_BR}}(),destroy:function(){delete CKEDITOR.filter.instances[this.id];delete this._;delete this.allowedContent;
+delete this.disallowedContent}};var z={styles:1,attributes:1,classes:1},B={styles:"requiredStyles",attributes:"requiredAttributes",classes:"requiredClasses"},x=/^([a-z0-9\-*\s]+)((?:\s*\{[!\w\-,\s\*]+\}\s*|\s*\[[!\w\-,\s\*]+\]\s*|\s*\([!\w\-,\s\*]+\)\s*){0,3})(?:;\s*|$)/i,E={styles:/{([^}]+)}/,attrs:/\[([^\]]+)\]/,classes:/\(([^\)]+)\)/},$=/^cke:(object|embed|param)$/,aa=/^(object|embed|param)$/,ba=CKEDITOR.filter.transformationsTools={sizeToStyle:function(a){this.lengthToStyle(a,"width");this.lengthToStyle(a,
+"height")},sizeToAttribute:function(a){this.lengthToAttribute(a,"width");this.lengthToAttribute(a,"height")},lengthToStyle:function(a,b,c){c=c||b;if(!(c in a.styles)){var d=a.attributes[b];if(d){/^\d+$/.test(d)&&(d=d+"px");a.styles[c]=d}}delete a.attributes[b]},lengthToAttribute:function(a,b,c){c=c||b;if(!(c in a.attributes)){var d=a.styles[b],e=d&&d.match(/^(\d+)(?:\.\d*)?px$/);e?a.attributes[c]=e[1]:d==v&&(a.attributes[c]=v)}delete a.styles[b]},alignmentToStyle:function(a){if(!("float"in a.styles)){var b=
+a.attributes.align;if(b=="left"||b=="right")a.styles["float"]=b}delete a.attributes.align},alignmentToAttribute:function(a){if(!("align"in a.attributes)){var b=a.styles["float"];if(b=="left"||b=="right")a.attributes.align=b}delete a.styles["float"]},matchesStyle:r,transform:function(a,b){if(typeof b=="string")a.name=b;else{var c=b.getDefinition(),d=c.styles,e=c.attributes,f,i,p,l;a.name=c.element;for(f in e)if(f=="class"){c=a.classes.join("|");for(p=e[f].split(/\s+/);l=p.pop();)c.indexOf(l)==-1&&
+a.classes.push(l)}else a.attributes[f]=e[f];for(i in d)a.styles[i]=d[i]}}}})();
+(function(){CKEDITOR.focusManager=function(a){if(a.focusManager)return a.focusManager;this.hasFocus=false;this.currentActive=null;this._={editor:a};return this};CKEDITOR.focusManager._={blurDelay:200};CKEDITOR.focusManager.prototype={focus:function(a){this._.timer&&clearTimeout(this._.timer);if(a)this.currentActive=a;if(!this.hasFocus&&!this._.locked){(a=CKEDITOR.currentInstance)&&a.focusManager.blur(1);this.hasFocus=true;(a=this._.editor.container)&&a.addClass("cke_focus");this._.editor.fire("focus")}},
+lock:function(){this._.locked=1},unlock:function(){delete this._.locked},blur:function(a){function f(){if(this.hasFocus){this.hasFocus=false;var a=this._.editor.container;a&&a.removeClass("cke_focus");this._.editor.fire("blur")}}if(!this._.locked){this._.timer&&clearTimeout(this._.timer);var b=CKEDITOR.focusManager._.blurDelay;a||!b?f.call(this):this._.timer=CKEDITOR.tools.setTimeout(function(){delete this._.timer;f.call(this)},b,this)}},add:function(a,f){var b=a.getCustomData("focusmanager");if(!b||
+b!=this){b&&b.remove(a);var b="focus",c="blur";if(f)if(CKEDITOR.env.ie){b="focusin";c="focusout"}else CKEDITOR.event.useCapture=1;var e={blur:function(){a.equals(this.currentActive)&&this.blur()},focus:function(){this.focus(a)}};a.on(b,e.focus,this);a.on(c,e.blur,this);if(f)CKEDITOR.event.useCapture=0;a.setCustomData("focusmanager",this);a.setCustomData("focusmanager_handlers",e)}},remove:function(a){a.removeCustomData("focusmanager");var f=a.removeCustomData("focusmanager_handlers");a.removeListener("blur",
+f.blur);a.removeListener("focus",f.focus)}}})();CKEDITOR.keystrokeHandler=function(a){if(a.keystrokeHandler)return a.keystrokeHandler;this.keystrokes={};this.blockedKeystrokes={};this._={editor:a};return this};
+(function(){var a,f=function(b){var b=b.data,e=b.getKeystroke(),d=this.keystrokes[e],f=this._.editor;a=f.fire("key",{keyCode:e,domEvent:b})===false;if(!a){d&&(a=f.execCommand(d,{from:"keystrokeHandler"})!==false);a||(a=!!this.blockedKeystrokes[e])}a&&b.preventDefault(true);return!a},b=function(b){if(a){a=false;b.data.preventDefault(true)}};CKEDITOR.keystrokeHandler.prototype={attach:function(a){a.on("keydown",f,this);if(CKEDITOR.env.gecko&&CKEDITOR.env.mac)a.on("keypress",b,this)}}})();
+(function(){CKEDITOR.lang={languages:{af:1,ar:1,bg:1,bn:1,bs:1,ca:1,cs:1,cy:1,da:1,de:1,el:1,"en-au":1,"en-ca":1,"en-gb":1,en:1,eo:1,es:1,et:1,eu:1,fa:1,fi:1,fo:1,"fr-ca":1,fr:1,gl:1,gu:1,he:1,hi:1,hr:1,hu:1,id:1,is:1,it:1,ja:1,ka:1,km:1,ko:1,ku:1,lt:1,lv:1,mk:1,mn:1,ms:1,nb:1,nl:1,no:1,pl:1,"pt-br":1,pt:1,ro:1,ru:1,si:1,sk:1,sl:1,sq:1,"sr-latn":1,sr:1,sv:1,th:1,tr:1,tt:1,ug:1,uk:1,vi:1,"zh-cn":1,zh:1},rtl:{ar:1,fa:1,he:1,ku:1,ug:1},load:function(a,f,b){if(!a||!CKEDITOR.lang.languages[a])a=this.detect(f,
+a);var c=this,f=function(){c[a].dir=c.rtl[a]?"rtl":"ltr";b(a,c[a])};this[a]?f():CKEDITOR.scriptLoader.load(CKEDITOR.getUrl("lang/"+a+".js"),f,this)},detect:function(a,f){var b=this.languages,f=f||navigator.userLanguage||navigator.language||a,c=f.toLowerCase().match(/([a-z]+)(?:-([a-z]+))?/),e=c[1],c=c[2];b[e+"-"+c]?e=e+"-"+c:b[e]||(e=null);CKEDITOR.lang.detect=e?function(){return e}:function(a){return a};return e||a}}})();
+CKEDITOR.scriptLoader=function(){var a={},f={};return{load:function(b,c,e,d){var h=typeof b=="string";h&&(b=[b]);e||(e=CKEDITOR);var k=b.length,j=[],g=[],m=function(a){c&&(h?c.call(e,a):c.call(e,j,g))};if(k===0)m(true);else{var y=function(a,b){(b?j:g).push(a);if(--k<=0){d&&CKEDITOR.document.getDocumentElement().removeStyle("cursor");m(b)}},s=function(b,c){a[b]=1;var d=f[b];delete f[b];for(var e=0;e<d.length;e++)d[e](b,c)},w=function(b){if(a[b])y(b,true);else{var d=f[b]||(f[b]=[]);d.push(y);if(!(d.length>
+1)){var e=new CKEDITOR.dom.element("script");e.setAttributes({type:"text/javascript",src:b});if(c)if(CKEDITOR.env.ie&&CKEDITOR.env.version<11)e.$.onreadystatechange=function(){if(e.$.readyState=="loaded"||e.$.readyState=="complete"){e.$.onreadystatechange=null;s(b,true)}};else{e.$.onload=function(){setTimeout(function(){s(b,true)},0)};e.$.onerror=function(){s(b,false)}}e.appendTo(CKEDITOR.document.getHead())}}};d&&CKEDITOR.document.getDocumentElement().setStyle("cursor","wait");for(var q=0;q<k;q++)w(b[q])}},
+queue:function(){function a(){var b;(b=c[0])&&this.load(b.scriptUrl,b.callback,CKEDITOR,0)}var c=[];return function(e,d){var f=this;c.push({scriptUrl:e,callback:function(){d&&d.apply(this,arguments);c.shift();a.call(f)}});c.length==1&&a.call(this)}}()}}();CKEDITOR.resourceManager=function(a,f){this.basePath=a;this.fileName=f;this.registered={};this.loaded={};this.externals={};this._={waitingList:{}}};
+CKEDITOR.resourceManager.prototype={add:function(a,f){if(this.registered[a])throw'[CKEDITOR.resourceManager.add] The resource name "'+a+'" is already registered.';var b=this.registered[a]=f||{};b.name=a;b.path=this.getPath(a);CKEDITOR.fire(a+CKEDITOR.tools.capitalize(this.fileName)+"Ready",b);return this.get(a)},get:function(a){return this.registered[a]||null},getPath:function(a){var f=this.externals[a];return CKEDITOR.getUrl(f&&f.dir||this.basePath+a+"/")},getFilePath:function(a){var f=this.externals[a];
+return CKEDITOR.getUrl(this.getPath(a)+(f?f.file:this.fileName+".js"))},addExternal:function(a,f,b){for(var a=a.split(","),c=0;c<a.length;c++){var e=a[c];b||(f=f.replace(/[^\/]+$/,function(a){b=a;return""}));this.externals[e]={dir:f,file:b||this.fileName+".js"}}},load:function(a,f,b){CKEDITOR.tools.isArray(a)||(a=a?[a]:[]);for(var c=this.loaded,e=this.registered,d=[],h={},k={},j=0;j<a.length;j++){var g=a[j];if(g)if(!c[g]&&!e[g]){var m=this.getFilePath(g);d.push(m);m in h||(h[m]=[]);h[m].push(g)}else k[g]=
+this.get(g)}CKEDITOR.scriptLoader.load(d,function(a,d){if(d.length)throw'[CKEDITOR.resourceManager.load] Resource name "'+h[d[0]].join(",")+'" was not found at "'+d[0]+'".';for(var e=0;e<a.length;e++)for(var q=h[a[e]],g=0;g<q.length;g++){var i=q[g];k[i]=this.get(i);c[i]=1}f.call(b,k)},this)}};CKEDITOR.plugins=new CKEDITOR.resourceManager("plugins/","plugin");
+CKEDITOR.plugins.load=CKEDITOR.tools.override(CKEDITOR.plugins.load,function(a){var f={};return function(b,c,e){var d={},h=function(b){a.call(this,b,function(a){CKEDITOR.tools.extend(d,a);var b=[],m;for(m in a){var k=a[m],s=k&&k.requires;if(!f[m]){if(k.icons)for(var w=k.icons.split(","),q=w.length;q--;)CKEDITOR.skin.addIcon(w[q],k.path+"icons/"+(CKEDITOR.env.hidpi&&k.hidpi?"hidpi/":"")+w[q]+".png");f[m]=1}if(s){s.split&&(s=s.split(","));for(k=0;k<s.length;k++)d[s[k]]||b.push(s[k])}}if(b.length)h.call(this,
+b);else{for(m in d){k=d[m];if(k.onLoad&&!k.onLoad._called){k.onLoad()===false&&delete d[m];k.onLoad._called=1}}c&&c.call(e||window,d)}},this)};h.call(this,b)}});CKEDITOR.plugins.setLang=function(a,f,b){var c=this.get(a),a=c.langEntries||(c.langEntries={}),c=c.lang||(c.lang=[]);c.split&&(c=c.split(","));CKEDITOR.tools.indexOf(c,f)==-1&&c.push(f);a[f]=b};CKEDITOR.ui=function(a){if(a.ui)return a.ui;this.items={};this.instances={};this.editor=a;this._={handlers:{}};return this};
+CKEDITOR.ui.prototype={add:function(a,f,b){b.name=a.toLowerCase();var c=this.items[a]={type:f,command:b.command||null,args:Array.prototype.slice.call(arguments,2)};CKEDITOR.tools.extend(c,b)},get:function(a){return this.instances[a]},create:function(a){var f=this.items[a],b=f&&this._.handlers[f.type],c=f&&f.command&&this.editor.getCommand(f.command),b=b&&b.create.apply(this,f.args);this.instances[a]=b;c&&c.uiItems.push(b);if(b&&!b.type)b.type=f.type;return b},addHandler:function(a,f){this._.handlers[a]=
+f},space:function(a){return CKEDITOR.document.getById(this.spaceId(a))},spaceId:function(a){return this.editor.id+"_"+a}};CKEDITOR.event.implementOn(CKEDITOR.ui);
+(function(){function a(a,c,d){CKEDITOR.event.call(this);a=a&&CKEDITOR.tools.clone(a);if(c!==void 0){if(c instanceof CKEDITOR.dom.element){if(!d)throw Error("One of the element modes must be specified.");}else throw Error("Expect element of type CKEDITOR.dom.element.");if(CKEDITOR.env.ie&&CKEDITOR.env.quirks&&d==CKEDITOR.ELEMENT_MODE_INLINE)throw Error("Inline element mode is not supported on IE quirks.");if(!(d==CKEDITOR.ELEMENT_MODE_INLINE?c.is(CKEDITOR.dtd.$editable)||c.is("textarea"):d==CKEDITOR.ELEMENT_MODE_REPLACE?
+!c.is(CKEDITOR.dtd.$nonBodyContent):1))throw Error('The specified element mode is not supported on element: "'+c.getName()+'".');this.element=c;this.elementMode=d;this.name=this.elementMode!=CKEDITOR.ELEMENT_MODE_APPENDTO&&(c.getId()||c.getNameAtt())}else this.elementMode=CKEDITOR.ELEMENT_MODE_NONE;this._={};this.commands={};this.templates={};this.name=this.name||f();this.id=CKEDITOR.tools.getNextId();this.status="unloaded";this.config=CKEDITOR.tools.prototypedCopy(CKEDITOR.config);this.ui=new CKEDITOR.ui(this);
+this.focusManager=new CKEDITOR.focusManager(this);this.keystrokeHandler=new CKEDITOR.keystrokeHandler(this);this.on("readOnly",b);this.on("selectionChange",function(a){e(this,a.data.path)});this.on("activeFilterChange",function(){e(this,this.elementPath(),true)});this.on("mode",b);this.on("instanceReady",function(){this.config.startupFocus&&this.focus()});CKEDITOR.fire("instanceCreated",null,this);CKEDITOR.add(this);CKEDITOR.tools.setTimeout(function(){h(this,a)},0,this)}function f(){do var a="editor"+
+++s;while(CKEDITOR.instances[a]);return a}function b(){var a=this.commands,b;for(b in a)c(this,a[b])}function c(a,b){b[b.startDisabled?"disable":a.readOnly&&!b.readOnly?"disable":b.modes[a.mode]?"enable":"disable"]()}function e(a,b,c){if(b){var d,e,f=a.commands;for(e in f){d=f[e];(c||d.contextSensitive)&&d.refresh(a,b)}}}function d(a){var b=a.config.customConfig;if(!b)return false;var b=CKEDITOR.getUrl(b),c=w[b]||(w[b]={});if(c.fn){c.fn.call(a,a.config);(CKEDITOR.getUrl(a.config.customConfig)==b||
+!d(a))&&a.fireOnce("customConfigLoaded")}else CKEDITOR.scriptLoader.queue(b,function(){c.fn=CKEDITOR.editorConfig?CKEDITOR.editorConfig:function(){};d(a)});return true}function h(a,b){a.on("customConfigLoaded",function(){if(b){if(b.on)for(var c in b.on)a.on(c,b.on[c]);CKEDITOR.tools.extend(a.config,b,true);delete a.config.on}c=a.config;a.readOnly=!(!c.readOnly&&!(a.elementMode==CKEDITOR.ELEMENT_MODE_INLINE?a.element.is("textarea")?a.element.hasAttribute("disabled"):a.element.isReadOnly():a.elementMode==
+CKEDITOR.ELEMENT_MODE_REPLACE&&a.element.hasAttribute("disabled")));a.blockless=a.elementMode==CKEDITOR.ELEMENT_MODE_INLINE?!(a.element.is("textarea")||CKEDITOR.dtd[a.element.getName()].p):false;a.tabIndex=c.tabIndex||a.element&&a.element.getAttribute("tabindex")||0;a.activeEnterMode=a.enterMode=a.blockless?CKEDITOR.ENTER_BR:c.enterMode;a.activeShiftEnterMode=a.shiftEnterMode=a.blockless?CKEDITOR.ENTER_BR:c.shiftEnterMode;if(c.skin)CKEDITOR.skinName=c.skin;a.fireOnce("configLoaded");a.dataProcessor=
+new CKEDITOR.htmlDataProcessor(a);a.filter=a.activeFilter=new CKEDITOR.filter(a);k(a)});if(b&&b.customConfig!=null)a.config.customConfig=b.customConfig;d(a)||a.fireOnce("customConfigLoaded")}function k(a){CKEDITOR.skin.loadPart("editor",function(){j(a)})}function j(a){CKEDITOR.lang.load(a.config.language,a.config.defaultLanguage,function(b,c){var d=a.config.title;a.langCode=b;a.lang=CKEDITOR.tools.prototypedCopy(c);a.title=typeof d=="string"||d===false?d:[a.lang.editor,a.name].join(", ");if(!a.config.contentsLangDirection)a.config.contentsLangDirection=
+a.elementMode==CKEDITOR.ELEMENT_MODE_INLINE?a.element.getDirection(1):a.lang.dir;a.fire("langLoaded");g(a)})}function g(a){a.getStylesSet(function(b){a.once("loaded",function(){a.fire("stylesSet",{styles:b})},null,null,1);m(a)})}function m(a){var b=a.config,c=b.plugins,d=b.extraPlugins,e=b.removePlugins;if(d)var f=RegExp("(?:^|,)(?:"+d.replace(/\s*,\s*/g,"|")+")(?=,|$)","g"),c=c.replace(f,""),c=c+(","+d);if(e)var l=RegExp("(?:^|,)(?:"+e.replace(/\s*,\s*/g,"|")+")(?=,|$)","g"),c=c.replace(l,"");CKEDITOR.env.air&&
+(c=c+",adobeair");CKEDITOR.plugins.load(c.split(","),function(c){var d=[],e=[],f=[];a.plugins=c;for(var i in c){var h=c[i],g=h.lang,o=null,A=h.requires,v;CKEDITOR.tools.isArray(A)&&(A=A.join(","));if(A&&(v=A.match(l)))for(;A=v.pop();)CKEDITOR.tools.setTimeout(function(a,b){throw Error('Plugin "'+a.replace(",","")+'" cannot be removed from the plugins list, because it\'s required by "'+b+'" plugin.');},0,null,[A,i]);if(g&&!a.lang[i]){g.split&&(g=g.split(","));if(CKEDITOR.tools.indexOf(g,a.langCode)>=
+0)o=a.langCode;else{o=a.langCode.replace(/-.*/,"");o=o!=a.langCode&&CKEDITOR.tools.indexOf(g,o)>=0?o:CKEDITOR.tools.indexOf(g,"en")>=0?"en":g[0]}if(!h.langEntries||!h.langEntries[o])f.push(CKEDITOR.getUrl(h.path+"lang/"+o+".js"));else{a.lang[i]=h.langEntries[o];o=null}}e.push(o);d.push(h)}CKEDITOR.scriptLoader.load(f,function(){for(var c=["beforeInit","init","afterInit"],f=0;f<c.length;f++)for(var p=0;p<d.length;p++){var i=d[p];f===0&&(e[p]&&i.lang&&i.langEntries)&&(a.lang[i.name]=i.langEntries[e[p]]);
+if(i[c[f]])i[c[f]](a)}a.fireOnce("pluginsLoaded");b.keystrokes&&a.setKeystroke(a.config.keystrokes);for(p=0;p<a.config.blockedKeystrokes.length;p++)a.keystrokeHandler.blockedKeystrokes[a.config.blockedKeystrokes[p]]=1;a.status="loaded";a.fireOnce("loaded");CKEDITOR.fire("instanceLoaded",null,a)})})}function y(){var a=this.element;if(a&&this.elementMode!=CKEDITOR.ELEMENT_MODE_APPENDTO){var b=this.getData();this.config.htmlEncodeOutput&&(b=CKEDITOR.tools.htmlEncode(b));a.is("textarea")?a.setValue(b):
+a.setHtml(b);return true}return false}a.prototype=CKEDITOR.editor.prototype;CKEDITOR.editor=a;var s=0,w={};CKEDITOR.tools.extend(CKEDITOR.editor.prototype,{addCommand:function(a,b){b.name=a.toLowerCase();var d=new CKEDITOR.command(this,b);this.mode&&c(this,d);return this.commands[a]=d},_attachToForm:function(){function a(d){b.updateElement();b._.required&&(!c.getValue()&&b.fire("required")===false)&&d.data.preventDefault()}var b=this,c=b.element,d=new CKEDITOR.dom.element(c.$.form);if(c.is("textarea")&&
+d){d.on("submit",a);if(d.$.submit&&d.$.submit.call&&d.$.submit.apply)d.$.submit=CKEDITOR.tools.override(d.$.submit,function(b){return function(){a();b.apply?b.apply(this):b()}});b.on("destroy",function(){d.removeListener("submit",a)})}},destroy:function(a){this.fire("beforeDestroy");!a&&y.call(this);this.editable(null);this.filter.destroy();delete this.filter;delete this.activeFilter;this.status="destroyed";this.fire("destroy");this.removeAllListeners();CKEDITOR.remove(this);CKEDITOR.fire("instanceDestroyed",
+null,this)},elementPath:function(a){if(!a){a=this.getSelection();if(!a)return null;a=a.getStartElement()}return a?new CKEDITOR.dom.elementPath(a,this.editable()):null},createRange:function(){var a=this.editable();return a?new CKEDITOR.dom.range(a):null},execCommand:function(a,b){var c=this.getCommand(a),d={name:a,commandData:b,command:c};if(c&&c.state!=CKEDITOR.TRISTATE_DISABLED&&this.fire("beforeCommandExec",d)!==false){d.returnValue=c.exec(d.commandData);if(!c.async&&this.fire("afterCommandExec",
+d)!==false)return d.returnValue}return false},getCommand:function(a){return this.commands[a]},getData:function(a){!a&&this.fire("beforeGetData");var b=this._.data;if(typeof b!="string")b=(b=this.element)&&this.elementMode==CKEDITOR.ELEMENT_MODE_REPLACE?b.is("textarea")?b.getValue():b.getHtml():"";b={dataValue:b};!a&&this.fire("getData",b);return b.dataValue},getSnapshot:function(){var a=this.fire("getSnapshot");if(typeof a!="string"){var b=this.element;b&&this.elementMode==CKEDITOR.ELEMENT_MODE_REPLACE&&
+(a=b.is("textarea")?b.getValue():b.getHtml())}return a},loadSnapshot:function(a){this.fire("loadSnapshot",a)},setData:function(a,b,c){var d=true,e=b;if(b&&typeof b=="object"){c=b.internal;e=b.callback;d=!b.noSnapshot}!c&&d&&this.fire("saveSnapshot");if(e||!c)this.once("dataReady",function(a){!c&&d&&this.fire("saveSnapshot");e&&e.call(a.editor)});a={dataValue:a};!c&&this.fire("setData",a);this._.data=a.dataValue;!c&&this.fire("afterSetData",a)},setReadOnly:function(a){a=a==null||a;if(this.readOnly!=
+a){this.readOnly=a;this.keystrokeHandler.blockedKeystrokes[8]=+a;this.editable().setReadOnly(a);this.fire("readOnly")}},insertHtml:function(a,b){this.fire("insertHtml",{dataValue:a,mode:b})},insertText:function(a){this.fire("insertText",a)},insertElement:function(a){this.fire("insertElement",a)},focus:function(){this.fire("beforeFocus")},checkDirty:function(){return this.status=="ready"&&this._.previousValue!==this.getSnapshot()},resetDirty:function(){this._.previousValue=this.getSnapshot()},updateElement:function(){return y.call(this)},
+setKeystroke:function(){for(var a=this.keystrokeHandler.keystrokes,b=CKEDITOR.tools.isArray(arguments[0])?arguments[0]:[[].slice.call(arguments,0)],c,d,e=b.length;e--;){c=b[e];d=0;if(CKEDITOR.tools.isArray(c)){d=c[1];c=c[0]}d?a[c]=d:delete a[c]}},addFeature:function(a){return this.filter.addFeature(a)},setActiveFilter:function(a){if(!a)a=this.filter;if(this.activeFilter!==a){this.activeFilter=a;this.fire("activeFilterChange");a===this.filter?this.setActiveEnterMode(null,null):this.setActiveEnterMode(a.getAllowedEnterMode(this.enterMode),
+a.getAllowedEnterMode(this.shiftEnterMode,true))}},setActiveEnterMode:function(a,b){a=a?this.blockless?CKEDITOR.ENTER_BR:a:this.enterMode;b=b?this.blockless?CKEDITOR.ENTER_BR:b:this.shiftEnterMode;if(this.activeEnterMode!=a||this.activeShiftEnterMode!=b){this.activeEnterMode=a;this.activeShiftEnterMode=b;this.fire("activeEnterModeChange")}}})})();CKEDITOR.ELEMENT_MODE_NONE=0;CKEDITOR.ELEMENT_MODE_REPLACE=1;CKEDITOR.ELEMENT_MODE_APPENDTO=2;CKEDITOR.ELEMENT_MODE_INLINE=3;
+CKEDITOR.htmlParser=function(){this._={htmlPartsRegex:/<(?:(?:\/([^>]+)>)|(?:!--([\S|\s]*?)--\>)|(?:([^\/\s>]+)((?:\s+[\w\-:.]+(?:\s*=\s*?(?:(?:"[^"]*")|(?:'[^']*')|[^\s"'\/>]+))?)*)[\S\s]*?(\/?)>))/g}};
+(function(){var a=/([\w\-:.]+)(?:(?:\s*=\s*(?:(?:"([^"]*)")|(?:'([^']*)')|([^\s>]+)))|(?=\s|$))/g,f={checked:1,compact:1,declare:1,defer:1,disabled:1,ismap:1,multiple:1,nohref:1,noresize:1,noshade:1,nowrap:1,readonly:1,selected:1};CKEDITOR.htmlParser.prototype={onTagOpen:function(){},onTagClose:function(){},onText:function(){},onCDATA:function(){},onComment:function(){},parse:function(b){for(var c,e,d=0,h;c=this._.htmlPartsRegex.exec(b);){e=c.index;if(e>d){d=b.substring(d,e);if(h)h.push(d);else this.onText(d)}d=
+this._.htmlPartsRegex.lastIndex;if(e=c[1]){e=e.toLowerCase();if(h&&CKEDITOR.dtd.$cdata[e]){this.onCDATA(h.join(""));h=null}if(!h){this.onTagClose(e);continue}}if(h)h.push(c[0]);else if(e=c[3]){e=e.toLowerCase();if(!/="/.test(e)){var k={},j,g=c[4];c=!!c[5];if(g)for(;j=a.exec(g);){var m=j[1].toLowerCase();j=j[2]||j[3]||j[4]||"";k[m]=!j&&f[m]?m:CKEDITOR.tools.htmlDecodeAttr(j)}this.onTagOpen(e,k,c);!h&&CKEDITOR.dtd.$cdata[e]&&(h=[])}}else if(e=c[2])this.onComment(e)}if(b.length>d)this.onText(b.substring(d,
+b.length))}}})();
+CKEDITOR.htmlParser.basicWriter=CKEDITOR.tools.createClass({$:function(){this._={output:[]}},proto:{openTag:function(a){this._.output.push("<",a)},openTagClose:function(a,f){f?this._.output.push(" />"):this._.output.push(">")},attribute:function(a,f){typeof f=="string"&&(f=CKEDITOR.tools.htmlEncodeAttr(f));this._.output.push(" ",a,'="',f,'"')},closeTag:function(a){this._.output.push("</",a,">")},text:function(a){this._.output.push(a)},comment:function(a){this._.output.push("<\!--",a,"--\>")},write:function(a){this._.output.push(a)},
+reset:function(){this._.output=[];this._.indent=false},getHtml:function(a){var f=this._.output.join("");a&&this.reset();return f}}});"use strict";
+(function(){CKEDITOR.htmlParser.node=function(){};CKEDITOR.htmlParser.node.prototype={remove:function(){var a=this.parent.children,f=CKEDITOR.tools.indexOf(a,this),b=this.previous,c=this.next;b&&(b.next=c);c&&(c.previous=b);a.splice(f,1);this.parent=null},replaceWith:function(a){var f=this.parent.children,b=CKEDITOR.tools.indexOf(f,this),c=a.previous=this.previous,e=a.next=this.next;c&&(c.next=a);e&&(e.previous=a);f[b]=a;a.parent=this.parent;this.parent=null},insertAfter:function(a){var f=a.parent.children,
+b=CKEDITOR.tools.indexOf(f,a),c=a.next;f.splice(b+1,0,this);this.next=a.next;this.previous=a;a.next=this;c&&(c.previous=this);this.parent=a.parent},insertBefore:function(a){var f=a.parent.children,b=CKEDITOR.tools.indexOf(f,a);f.splice(b,0,this);this.next=a;(this.previous=a.previous)&&(a.previous.next=this);a.previous=this;this.parent=a.parent},getAscendant:function(a){var f=typeof a=="function"?a:typeof a=="string"?function(b){return b.name==a}:function(b){return b.name in a},b=this.parent;for(;b&&
+b.type==CKEDITOR.NODE_ELEMENT;){if(f(b))return b;b=b.parent}return null},wrapWith:function(a){this.replaceWith(a);a.add(this);return a},getIndex:function(){return CKEDITOR.tools.indexOf(this.parent.children,this)},getFilterContext:function(a){return a||{}}}})();"use strict";CKEDITOR.htmlParser.comment=function(a){this.value=a;this._={isBlockLike:false}};
+CKEDITOR.htmlParser.comment.prototype=CKEDITOR.tools.extend(new CKEDITOR.htmlParser.node,{type:CKEDITOR.NODE_COMMENT,filter:function(a,f){var b=this.value;if(!(b=a.onComment(f,b,this))){this.remove();return false}if(typeof b!="string"){this.replaceWith(b);return false}this.value=b;return true},writeHtml:function(a,f){f&&this.filter(f);a.comment(this.value)}});"use strict";
+(function(){CKEDITOR.htmlParser.text=function(a){this.value=a;this._={isBlockLike:false}};CKEDITOR.htmlParser.text.prototype=CKEDITOR.tools.extend(new CKEDITOR.htmlParser.node,{type:CKEDITOR.NODE_TEXT,filter:function(a,f){if(!(this.value=a.onText(f,this.value,this))){this.remove();return false}},writeHtml:function(a,f){f&&this.filter(f);a.text(this.value)}})})();"use strict";
+(function(){CKEDITOR.htmlParser.cdata=function(a){this.value=a};CKEDITOR.htmlParser.cdata.prototype=CKEDITOR.tools.extend(new CKEDITOR.htmlParser.node,{type:CKEDITOR.NODE_TEXT,filter:function(){},writeHtml:function(a){a.write(this.value)}})})();"use strict";CKEDITOR.htmlParser.fragment=function(){this.children=[];this.parent=null;this._={isBlockLike:true,hasInlineStarted:false}};
+(function(){function a(a){return a.attributes["data-cke-survive"]?false:a.name=="a"&&a.attributes.href||CKEDITOR.dtd.$removeEmpty[a.name]}var f=CKEDITOR.tools.extend({table:1,ul:1,ol:1,dl:1},CKEDITOR.dtd.table,CKEDITOR.dtd.ul,CKEDITOR.dtd.ol,CKEDITOR.dtd.dl),b={ol:1,ul:1},c=CKEDITOR.tools.extend({},{html:1},CKEDITOR.dtd.html,CKEDITOR.dtd.body,CKEDITOR.dtd.head,{style:1,script:1}),e={ul:"li",ol:"li",dl:"dd",table:"tbody",tbody:"tr",thead:"tr",tfoot:"tr",tr:"td"};CKEDITOR.htmlParser.fragment.fromHtml=
+function(d,h,k){function j(a){var b;if(i.length>0)for(var c=0;c<i.length;c++){var d=i[c],e=d.name,f=CKEDITOR.dtd[e],l=u.name&&CKEDITOR.dtd[u.name];if((!l||l[e])&&(!a||!f||f[a]||!CKEDITOR.dtd[a])){if(!b){g();b=1}d=d.clone();d.parent=u;u=d;i.splice(c,1);c--}else if(e==u.name){y(u,u.parent,1);c--}}}function g(){for(;A.length;)y(A.shift(),u)}function m(a){if(a._.isBlockLike&&a.name!="pre"&&a.name!="textarea"){var b=a.children.length,c=a.children[b-1],d;if(c&&c.type==CKEDITOR.NODE_TEXT)(d=CKEDITOR.tools.rtrim(c.value))?
+c.value=d:a.children.length=b-1}}function y(b,c,d){var c=c||u||t,e=u;if(b.previous===void 0){if(s(c,b)){u=c;q.onTagOpen(k,{});b.returnPoint=c=u}m(b);(!a(b)||b.children.length)&&c.add(b);b.name=="pre"&&(l=false);b.name=="textarea"&&(o=false)}if(b.returnPoint){u=b.returnPoint;delete b.returnPoint}else u=d?c:e}function s(a,b){if((a==t||a.name=="body")&&k&&(!a.name||CKEDITOR.dtd[a.name][k])){var c,d;return(c=b.attributes&&(d=b.attributes["data-cke-real-element-type"])?d:b.name)&&c in CKEDITOR.dtd.$inline&&
+!(c in CKEDITOR.dtd.head)&&!b.isOrphan||b.type==CKEDITOR.NODE_TEXT}}function w(a,b){return a in CKEDITOR.dtd.$listItem||a in CKEDITOR.dtd.$tableContent?a==b||a=="dt"&&b=="dd"||a=="dd"&&b=="dt":false}var q=new CKEDITOR.htmlParser,t=h instanceof CKEDITOR.htmlParser.element?h:typeof h=="string"?new CKEDITOR.htmlParser.element(h):new CKEDITOR.htmlParser.fragment,i=[],A=[],u=t,o=t.name=="textarea",l=t.name=="pre";q.onTagOpen=function(d,e,h,m){e=new CKEDITOR.htmlParser.element(d,e);if(e.isUnknown&&h)e.isEmpty=
+true;e.isOptionalClose=m;if(a(e))i.push(e);else{if(d=="pre")l=true;else{if(d=="br"&&l){u.add(new CKEDITOR.htmlParser.text("\n"));return}d=="textarea"&&(o=true)}if(d=="br")A.push(e);else{for(;;){m=(h=u.name)?CKEDITOR.dtd[h]||(u._.isBlockLike?CKEDITOR.dtd.div:CKEDITOR.dtd.span):c;if(!e.isUnknown&&!u.isUnknown&&!m[d])if(u.isOptionalClose)q.onTagClose(h);else if(d in b&&h in b){h=u.children;(h=h[h.length-1])&&h.name=="li"||y(h=new CKEDITOR.htmlParser.element("li"),u);!e.returnPoint&&(e.returnPoint=u);
+u=h}else if(d in CKEDITOR.dtd.$listItem&&!w(d,h))q.onTagOpen(d=="li"?"ul":"dl",{},0,1);else if(h in f&&!w(d,h)){!e.returnPoint&&(e.returnPoint=u);u=u.parent}else{h in CKEDITOR.dtd.$inline&&i.unshift(u);if(u.parent)y(u,u.parent,1);else{e.isOrphan=1;break}}else break}j(d);g();e.parent=u;e.isEmpty?y(e):u=e}}};q.onTagClose=function(a){for(var b=i.length-1;b>=0;b--)if(a==i[b].name){i.splice(b,1);return}for(var c=[],d=[],e=u;e!=t&&e.name!=a;){e._.isBlockLike||d.unshift(e);c.push(e);e=e.returnPoint||e.parent}if(e!=
+t){for(b=0;b<c.length;b++){var f=c[b];y(f,f.parent)}u=e;e._.isBlockLike&&g();y(e,e.parent);if(e==u)u=u.parent;i=i.concat(d)}a=="body"&&(k=false)};q.onText=function(a){if((!u._.hasInlineStarted||A.length)&&!l&&!o){a=CKEDITOR.tools.ltrim(a);if(a.length===0)return}var b=u.name,d=b?CKEDITOR.dtd[b]||(u._.isBlockLike?CKEDITOR.dtd.div:CKEDITOR.dtd.span):c;if(!o&&!d["#"]&&b in f){q.onTagOpen(e[b]||"");q.onText(a)}else{g();j();!l&&!o&&(a=a.replace(/[\t\r\n ]{2,}|[\t\r\n]/g," "));a=new CKEDITOR.htmlParser.text(a);
+if(s(u,a))this.onTagOpen(k,{},0,1);u.add(a)}};q.onCDATA=function(a){u.add(new CKEDITOR.htmlParser.cdata(a))};q.onComment=function(a){g();j();u.add(new CKEDITOR.htmlParser.comment(a))};q.parse(d);for(g();u!=t;)y(u,u.parent,1);m(t);return t};CKEDITOR.htmlParser.fragment.prototype={type:CKEDITOR.NODE_DOCUMENT_FRAGMENT,add:function(a,b){isNaN(b)&&(b=this.children.length);var c=b>0?this.children[b-1]:null;if(c){if(a._.isBlockLike&&c.type==CKEDITOR.NODE_TEXT){c.value=CKEDITOR.tools.rtrim(c.value);if(c.value.length===
+0){this.children.pop();this.add(a);return}}c.next=a}a.previous=c;a.parent=this;this.children.splice(b,0,a);if(!this._.hasInlineStarted)this._.hasInlineStarted=a.type==CKEDITOR.NODE_TEXT||a.type==CKEDITOR.NODE_ELEMENT&&!a._.isBlockLike},filter:function(a,b){b=this.getFilterContext(b);a.onRoot(b,this);this.filterChildren(a,false,b)},filterChildren:function(a,b,c){if(this.childrenFilteredBy!=a.id){c=this.getFilterContext(c);if(b&&!this.parent)a.onRoot(c,this);this.childrenFilteredBy=a.id;for(b=0;b<this.children.length;b++)this.children[b].filter(a,
+c)===false&&b--}},writeHtml:function(a,b){b&&this.filter(b);this.writeChildrenHtml(a)},writeChildrenHtml:function(a,b,c){var e=this.getFilterContext();if(c&&!this.parent&&b)b.onRoot(e,this);b&&this.filterChildren(b,false,e);b=0;c=this.children;for(e=c.length;b<e;b++)c[b].writeHtml(a)},forEach:function(a,b,c){if(!c&&(!b||this.type==b))var e=a(this);if(e!==false)for(var c=this.children,f=0;f<c.length;f++){e=c[f];e.type==CKEDITOR.NODE_ELEMENT?e.forEach(a,b):(!b||e.type==b)&&a(e)}},getFilterContext:function(a){return a||
+{}}}})();"use strict";
+(function(){function a(){this.rules=[]}function f(b,c,e,d){var f,k;for(f in c){(k=b[f])||(k=b[f]=new a);k.add(c[f],e,d)}}CKEDITOR.htmlParser.filter=CKEDITOR.tools.createClass({$:function(b){this.id=CKEDITOR.tools.getNextNumber();this.elementNameRules=new a;this.attributeNameRules=new a;this.elementsRules={};this.attributesRules={};this.textRules=new a;this.commentRules=new a;this.rootRules=new a;b&&this.addRules(b,10)},proto:{addRules:function(a,c){var e;if(typeof c=="number")e=c;else if(c&&"priority"in
+c)e=c.priority;typeof e!="number"&&(e=10);typeof c!="object"&&(c={});a.elementNames&&this.elementNameRules.addMany(a.elementNames,e,c);a.attributeNames&&this.attributeNameRules.addMany(a.attributeNames,e,c);a.elements&&f(this.elementsRules,a.elements,e,c);a.attributes&&f(this.attributesRules,a.attributes,e,c);a.text&&this.textRules.add(a.text,e,c);a.comment&&this.commentRules.add(a.comment,e,c);a.root&&this.rootRules.add(a.root,e,c)},applyTo:function(a){a.filter(this)},onElementName:function(a,c){return this.elementNameRules.execOnName(a,
+c)},onAttributeName:function(a,c){return this.attributeNameRules.execOnName(a,c)},onText:function(a,c,e){return this.textRules.exec(a,c,e)},onComment:function(a,c,e){return this.commentRules.exec(a,c,e)},onRoot:function(a,c){return this.rootRules.exec(a,c)},onElement:function(a,c){for(var e=[this.elementsRules["^"],this.elementsRules[c.name],this.elementsRules.$],d,f=0;f<3;f++)if(d=e[f]){d=d.exec(a,c,this);if(d===false)return null;if(d&&d!=c)return this.onNode(a,d);if(c.parent&&!c.name)break}return c},
+onNode:function(a,c){var e=c.type;return e==CKEDITOR.NODE_ELEMENT?this.onElement(a,c):e==CKEDITOR.NODE_TEXT?new CKEDITOR.htmlParser.text(this.onText(a,c.value)):e==CKEDITOR.NODE_COMMENT?new CKEDITOR.htmlParser.comment(this.onComment(a,c.value)):null},onAttribute:function(a,c,e,d){return(e=this.attributesRules[e])?e.exec(a,d,c,this):d}}});CKEDITOR.htmlParser.filterRulesGroup=a;a.prototype={add:function(a,c,e){this.rules.splice(this.findIndex(c),0,{value:a,priority:c,options:e})},addMany:function(a,
+c,e){for(var d=[this.findIndex(c),0],f=0,k=a.length;f<k;f++)d.push({value:a[f],priority:c,options:e});this.rules.splice.apply(this.rules,d)},findIndex:function(a){for(var c=this.rules,e=c.length-1;e>=0&&a<c[e].priority;)e--;return e+1},exec:function(a,c){var e=c instanceof CKEDITOR.htmlParser.node||c instanceof CKEDITOR.htmlParser.fragment,d=Array.prototype.slice.call(arguments,1),f=this.rules,k=f.length,j,g,m,y;for(y=0;y<k;y++){if(e){j=c.type;g=c.name}m=f[y];if(!(a.nonEditable&&!m.options.applyToAll||
+a.nestedEditable&&m.options.excludeNestedEditable)){m=m.value.apply(null,d);if(m===false||e&&m&&(m.name!=g||m.type!=j))return m;m!=null&&(d[0]=c=m)}}return c},execOnName:function(a,c){for(var e=0,d=this.rules,f=d.length,k;c&&e<f;e++){k=d[e];!(a.nonEditable&&!k.options.applyToAll||a.nestedEditable&&k.options.excludeNestedEditable)&&(c=c.replace(k.value[0],k.value[1]))}return c}}})();
+(function(){function a(a,f){function p(a){return a||CKEDITOR.env.needsNbspFiller?new CKEDITOR.htmlParser.text(" "):new CKEDITOR.htmlParser.element("br",{"data-cke-bogus":1})}function r(a,e){return function(f){if(f.type!=CKEDITOR.NODE_DOCUMENT_FRAGMENT){var i=[],l=b(f),x,r;if(l)for(v(l,1)&&i.push(l);l;){if(d(l)&&(x=c(l))&&v(x))if((r=c(x))&&!d(r))i.push(x);else{p(g).insertAfter(x);x.remove()}l=l.previous}for(l=0;l<i.length;l++)i[l].remove();if(i=!a||(typeof e=="function"?e(f):e)!==false)if(!g&&!CKEDITOR.env.needsBrFiller&&
+f.type==CKEDITOR.NODE_DOCUMENT_FRAGMENT)i=false;else if(!g&&!CKEDITOR.env.needsBrFiller&&(document.documentMode>7||f.name in CKEDITOR.dtd.tr||f.name in CKEDITOR.dtd.$listItem))i=false;else{i=b(f);i=!i||f.name=="form"&&i.name=="input"}i&&f.add(p(a))}}}function v(a,b){if((!g||CKEDITOR.env.needsBrFiller)&&a.type==CKEDITOR.NODE_ELEMENT&&a.name=="br"&&!a.attributes["data-cke-eol"])return true;var c;if(a.type==CKEDITOR.NODE_TEXT&&(c=a.value.match(i))){if(c.index){(new CKEDITOR.htmlParser.text(a.value.substring(0,
+c.index))).insertBefore(a);a.value=c[0]}if(!CKEDITOR.env.needsBrFiller&&g&&(!b||a.parent.name in z))return true;if(!g)if((c=a.previous)&&c.name=="br"||!c||d(c))return true}return false}var n={elements:{}},g=f=="html",z=CKEDITOR.tools.extend({},l),o;for(o in z)"#"in u[o]||delete z[o];for(o in z)n.elements[o]=r(g,a.config.fillEmptyBlocks);n.root=r(g,false);n.elements.br=function(a){return function(b){if(b.parent.type!=CKEDITOR.NODE_DOCUMENT_FRAGMENT){var f=b.attributes;if("data-cke-bogus"in f||"data-cke-eol"in
+f)delete f["data-cke-bogus"];else{for(f=b.next;f&&e(f);)f=f.next;var i=c(b);!f&&d(b.parent)?h(b.parent,p(a)):d(f)&&(i&&!d(i))&&p(a).insertBefore(f)}}}}(g);return n}function f(a,b){return a!=CKEDITOR.ENTER_BR&&b!==false?a==CKEDITOR.ENTER_DIV?"div":"p":false}function b(a){for(a=a.children[a.children.length-1];a&&e(a);)a=a.previous;return a}function c(a){for(a=a.previous;a&&e(a);)a=a.previous;return a}function e(a){return a.type==CKEDITOR.NODE_TEXT&&!CKEDITOR.tools.trim(a.value)||a.type==CKEDITOR.NODE_ELEMENT&&
+a.attributes["data-cke-bookmark"]}function d(a){return a&&(a.type==CKEDITOR.NODE_ELEMENT&&a.name in l||a.type==CKEDITOR.NODE_DOCUMENT_FRAGMENT)}function h(a,b){var c=a.children[a.children.length-1];a.children.push(b);b.parent=a;if(c){c.next=b;b.previous=c}}function k(a){a=a.attributes;a.contenteditable!="false"&&(a["data-cke-editable"]=a.contenteditable?"true":1);a.contenteditable="false"}function j(a){a=a.attributes;switch(a["data-cke-editable"]){case "true":a.contenteditable="true";break;case "1":delete a.contenteditable}}
+function g(a){return a.replace(C,function(a,b,c){return"<"+b+c.replace(L,function(a,b){return F.test(b)&&c.indexOf("data-cke-saved-"+b)==-1?" data-cke-saved-"+a+" data-cke-"+CKEDITOR.rnd+"-"+a:a})+">"})}function m(a,b){return a.replace(b,function(a,b,c){a.indexOf("<textarea")===0&&(a=b+w(c).replace(/</g,"&lt;").replace(/>/g,"&gt;")+"</textarea>");return"<cke:encoded>"+encodeURIComponent(a)+"</cke:encoded>"})}function y(a){return a.replace(v,function(a,b){return decodeURIComponent(b)})}function s(a){return a.replace(/<\!--(?!{cke_protected})[\s\S]+?--\>/g,
+function(a){return"<\!--"+A+"{C}"+encodeURIComponent(a).replace(/--/g,"%2D%2D")+"--\>"})}function w(a){return a.replace(/<\!--\{cke_protected\}\{C\}([\s\S]+?)--\>/g,function(a,b){return decodeURIComponent(b)})}function q(a,b){var c=b._.dataStore;return a.replace(/<\!--\{cke_protected\}([\s\S]+?)--\>/g,function(a,b){return decodeURIComponent(b)}).replace(/\{cke_protected_(\d+)\}/g,function(a,b){return c&&c[b]||""})}function t(a,b){for(var c=[],d=b.config.protectedSource,e=b._.dataStore||(b._.dataStore=
+{id:1}),f=/<\!--\{cke_temp(comment)?\}(\d*?)--\>/g,d=[/<script[\s\S]*?<\/script>/gi,/<noscript[\s\S]*?<\/noscript>/gi,/<meta[\s\S]*?\/?>/gi].concat(d),a=a.replace(/<\!--[\s\S]*?--\>/g,function(a){return"<\!--{cke_tempcomment}"+(c.push(a)-1)+"--\>"}),i=0;i<d.length;i++)a=a.replace(d[i],function(a){a=a.replace(f,function(a,b,d){return c[d]});return/cke_temp(comment)?/.test(a)?a:"<\!--{cke_temp}"+(c.push(a)-1)+"--\>"});a=a.replace(f,function(a,b,d){return"<\!--"+A+(b?"{C}":"")+encodeURIComponent(c[d]).replace(/--/g,
+"%2D%2D")+"--\>"});a=a.replace(/<\w+(?:\s+(?:(?:[^\s=>]+\s*=\s*(?:[^'"\s>]+|'[^']*'|"[^"]*"))|[^\s=>]+))+\s*>/g,function(a){return a.replace(/<\!--\{cke_protected\}([^>]*)--\>/g,function(a,b){e[e.id]=decodeURIComponent(b);return"{cke_protected_"+e.id++ +"}"})});return a=a.replace(/<(title|iframe|textarea)([^>]*)>([\s\S]*?)<\/\1>/g,function(a,c,d,e){return"<"+c+d+">"+q(w(e),b)+"</"+c+">"})}CKEDITOR.htmlDataProcessor=function(b){var c,d,e=this;this.editor=b;this.dataFilter=c=new CKEDITOR.htmlParser.filter;
+this.htmlFilter=d=new CKEDITOR.htmlParser.filter;this.writer=new CKEDITOR.htmlParser.basicWriter;c.addRules(p);c.addRules(r,{applyToAll:true});c.addRules(a(b,"data"),{applyToAll:true});d.addRules(n);d.addRules(P,{applyToAll:true});d.addRules(a(b,"html"),{applyToAll:true});b.on("toHtml",function(a){var a=a.data,c=a.dataValue,d,c=t(c,b),c=m(c,I),c=g(c),c=m(c,K),c=c.replace(G,"$1cke:$2"),c=c.replace(B,"<cke:$1$2></cke:$1>"),c=c.replace(/(<pre\b[^>]*>)(\r\n|\n)/g,"$1$2$2"),c=c.replace(/([^a-z0-9<\-])(on\w{3,})(?!>)/gi,
+"$1data-cke-"+CKEDITOR.rnd+"-$2");d=a.context||b.editable().getName();var e;if(CKEDITOR.env.ie&&CKEDITOR.env.version<9&&d=="pre"){d="div";c="<pre>"+c+"</pre>";e=1}d=b.document.createElement(d);d.setHtml("a"+c);c=d.getHtml().substr(1);c=c.replace(RegExp("data-cke-"+CKEDITOR.rnd+"-","ig"),"");e&&(c=c.replace(/^<pre>|<\/pre>$/gi,""));c=c.replace(z,"$1$2");c=y(c);c=w(c);d=a.fixForBody===false?false:f(a.enterMode,b.config.autoParagraph);c=CKEDITOR.htmlParser.fragment.fromHtml(c,a.context,d);if(d){e=c;
+if(!e.children.length&&CKEDITOR.dtd[e.name][d]){d=new CKEDITOR.htmlParser.element(d);e.add(d)}}a.dataValue=c},null,null,5);b.on("toHtml",function(a){a.data.filter.applyTo(a.data.dataValue,true,a.data.dontFilter,a.data.enterMode)&&b.fire("dataFiltered")},null,null,6);b.on("toHtml",function(a){a.data.dataValue.filterChildren(e.dataFilter,true)},null,null,10);b.on("toHtml",function(a){var a=a.data,b=a.dataValue,c=new CKEDITOR.htmlParser.basicWriter;b.writeChildrenHtml(c);b=c.getHtml(true);a.dataValue=
+s(b)},null,null,15);b.on("toDataFormat",function(a){var c=a.data.dataValue;a.data.enterMode!=CKEDITOR.ENTER_BR&&(c=c.replace(/^<br *\/?>/i,""));a.data.dataValue=CKEDITOR.htmlParser.fragment.fromHtml(c,a.data.context,f(a.data.enterMode,b.config.autoParagraph))},null,null,5);b.on("toDataFormat",function(a){a.data.dataValue.filterChildren(e.htmlFilter,true)},null,null,10);b.on("toDataFormat",function(a){a.data.filter.applyTo(a.data.dataValue,false,true)},null,null,11);b.on("toDataFormat",function(a){var c=
+a.data.dataValue,d=e.writer;d.reset();c.writeChildrenHtml(d);c=d.getHtml(true);c=w(c);c=q(c,b);a.data.dataValue=c},null,null,15)};CKEDITOR.htmlDataProcessor.prototype={toHtml:function(a,b,c,d){var e=this.editor,f,i,l;if(b&&typeof b=="object"){f=b.context;c=b.fixForBody;d=b.dontFilter;i=b.filter;l=b.enterMode}else f=b;!f&&f!==null&&(f=e.editable().getName());return e.fire("toHtml",{dataValue:a,context:f,fixForBody:c,dontFilter:d,filter:i||e.filter,enterMode:l||e.enterMode}).dataValue},toDataFormat:function(a,
+b){var c,d,e;if(b){c=b.context;d=b.filter;e=b.enterMode}!c&&c!==null&&(c=this.editor.editable().getName());return this.editor.fire("toDataFormat",{dataValue:a,filter:d||this.editor.filter,context:c,enterMode:e||this.editor.enterMode}).dataValue}};var i=/(?:&nbsp;|\xa0)$/,A="{cke_protected}",u=CKEDITOR.dtd,o=["caption","colgroup","col","thead","tfoot","tbody"],l=CKEDITOR.tools.extend({},u.$blockLimit,u.$block),p={elements:{input:k,textarea:k}},r={attributeNames:[[/^on/,"data-cke-pa-on"],[/^data-cke-expando$/,
+""]]},n={elements:{embed:function(a){var b=a.parent;if(b&&b.name=="object"){var c=b.attributes.width,b=b.attributes.height;if(c)a.attributes.width=c;if(b)a.attributes.height=b}},a:function(a){if(!a.children.length&&!a.attributes.name&&!a.attributes["data-cke-saved-name"])return false}}},P={elementNames:[[/^cke:/,""],[/^\?xml:namespace$/,""]],attributeNames:[[/^data-cke-(saved|pa)-/,""],[/^data-cke-.*/,""],["hidefocus",""]],elements:{$:function(a){var b=a.attributes;if(b){if(b["data-cke-temp"])return false;
+for(var c=["name","href","src"],d,e=0;e<c.length;e++){d="data-cke-saved-"+c[e];d in b&&delete b[c[e]]}}return a},table:function(a){a.children.slice(0).sort(function(a,b){var c,d;if(a.type==CKEDITOR.NODE_ELEMENT&&b.type==a.type){c=CKEDITOR.tools.indexOf(o,a.name);d=CKEDITOR.tools.indexOf(o,b.name)}if(!(c>-1&&d>-1&&c!=d)){c=a.parent?a.getIndex():-1;d=b.parent?b.getIndex():-1}return c>d?1:-1})},param:function(a){a.children=[];a.isEmpty=true;return a},span:function(a){a.attributes["class"]=="Apple-style-span"&&
+delete a.name},html:function(a){delete a.attributes.contenteditable;delete a.attributes["class"]},body:function(a){delete a.attributes.spellcheck;delete a.attributes.contenteditable},style:function(a){var b=a.children[0];if(b&&b.value)b.value=CKEDITOR.tools.trim(b.value);if(!a.attributes.type)a.attributes.type="text/css"},title:function(a){var b=a.children[0];!b&&h(a,b=new CKEDITOR.htmlParser.text);b.value=a.attributes["data-cke-title"]||""},input:j,textarea:j},attributes:{"class":function(a){return CKEDITOR.tools.ltrim(a.replace(/(?:^|\s+)cke_[^\s]*/g,
+""))||false}}};if(CKEDITOR.env.ie)P.attributes.style=function(a){return a.replace(/(^|;)([^\:]+)/g,function(a){return a.toLowerCase()})};var C=/<(a|area|img|input|source)\b([^>]*)>/gi,L=/([\w-]+)\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|(?:[^ "'>]+))/gi,F=/^(href|src|name)$/i,K=/(?:<style(?=[ >])[^>]*>[\s\S]*?<\/style>)|(?:<(:?link|meta|base)[^>]*>)/gi,I=/(<textarea(?=[ >])[^>]*>)([\s\S]*?)(?:<\/textarea>)/gi,v=/<cke:encoded>([^<]*)<\/cke:encoded>/gi,G=/(<\/?)((?:object|embed|param|html|body|head|title)[^>]*>)/gi,
+z=/(<\/?)cke:((?:html|body|head|title)[^>]*>)/gi,B=/<cke:(param|embed)([^>]*?)\/?>(?!\s*<\/cke:\1)/gi})();"use strict";
+CKEDITOR.htmlParser.element=function(a,f){this.name=a;this.attributes=f||{};this.children=[];var b=a||"",c=b.match(/^cke:(.*)/);c&&(b=c[1]);b=!(!CKEDITOR.dtd.$nonBodyContent[b]&&!CKEDITOR.dtd.$block[b]&&!CKEDITOR.dtd.$listItem[b]&&!CKEDITOR.dtd.$tableContent[b]&&!(CKEDITOR.dtd.$nonEditable[b]||b=="br"));this.isEmpty=!!CKEDITOR.dtd.$empty[a];this.isUnknown=!CKEDITOR.dtd[a];this._={isBlockLike:b,hasInlineStarted:this.isEmpty||!b}};
+CKEDITOR.htmlParser.cssStyle=function(a){var f={};((a instanceof CKEDITOR.htmlParser.element?a.attributes.style:a)||"").replace(/&quot;/g,'"').replace(/\s*([^ :;]+)\s*:\s*([^;]+)\s*(?=;|$)/g,function(a,c,e){c=="font-family"&&(e=e.replace(/["']/g,""));f[c.toLowerCase()]=e});return{rules:f,populate:function(a){var c=this.toString();if(c)a instanceof CKEDITOR.dom.element?a.setAttribute("style",c):a instanceof CKEDITOR.htmlParser.element?a.attributes.style=c:a.style=c},toString:function(){var a=[],c;
+for(c in f)f[c]&&a.push(c,":",f[c],";");return a.join("")}}};
+(function(){function a(a){return function(b){return b.type==CKEDITOR.NODE_ELEMENT&&(typeof a=="string"?b.name==a:b.name in a)}}var f=function(a,b){a=a[0];b=b[0];return a<b?-1:a>b?1:0},b=CKEDITOR.htmlParser.fragment.prototype;CKEDITOR.htmlParser.element.prototype=CKEDITOR.tools.extend(new CKEDITOR.htmlParser.node,{type:CKEDITOR.NODE_ELEMENT,add:b.add,clone:function(){return new CKEDITOR.htmlParser.element(this.name,this.attributes)},filter:function(a,b){var d=this,f,k,b=d.getFilterContext(b);if(b.off)return true;
+if(!d.parent)a.onRoot(b,d);for(;;){f=d.name;if(!(k=a.onElementName(b,f))){this.remove();return false}d.name=k;if(!(d=a.onElement(b,d))){this.remove();return false}if(d!==this){this.replaceWith(d);return false}if(d.name==f)break;if(d.type!=CKEDITOR.NODE_ELEMENT){this.replaceWith(d);return false}if(!d.name){this.replaceWithChildren();return false}}f=d.attributes;var j,g;for(j in f){g=j;for(k=f[j];;)if(g=a.onAttributeName(b,j))if(g!=j){delete f[j];j=g}else break;else{delete f[j];break}g&&((k=a.onAttribute(b,
+d,g,k))===false?delete f[g]:f[g]=k)}d.isEmpty||this.filterChildren(a,false,b);return true},filterChildren:b.filterChildren,writeHtml:function(a,b){b&&this.filter(b);var d=this.name,h=[],k=this.attributes,j,g;a.openTag(d,k);for(j in k)h.push([j,k[j]]);a.sortAttributes&&h.sort(f);j=0;for(g=h.length;j<g;j++){k=h[j];a.attribute(k[0],k[1])}a.openTagClose(d,this.isEmpty);this.writeChildrenHtml(a);this.isEmpty||a.closeTag(d)},writeChildrenHtml:b.writeChildrenHtml,replaceWithChildren:function(){for(var a=
+this.children,b=a.length;b;)a[--b].insertAfter(this);this.remove()},forEach:b.forEach,getFirst:function(b){if(!b)return this.children.length?this.children[0]:null;typeof b!="function"&&(b=a(b));for(var e=0,d=this.children.length;e<d;++e)if(b(this.children[e]))return this.children[e];return null},getHtml:function(){var a=new CKEDITOR.htmlParser.basicWriter;this.writeChildrenHtml(a);return a.getHtml()},setHtml:function(a){for(var a=this.children=CKEDITOR.htmlParser.fragment.fromHtml(a).children,b=0,
+d=a.length;b<d;++b)a[b].parent=this},getOuterHtml:function(){var a=new CKEDITOR.htmlParser.basicWriter;this.writeHtml(a);return a.getHtml()},split:function(a){for(var b=this.children.splice(a,this.children.length-a),d=this.clone(),f=0;f<b.length;++f)b[f].parent=d;d.children=b;if(b[0])b[0].previous=null;if(a>0)this.children[a-1].next=null;this.parent.add(d,this.getIndex()+1);return d},addClass:function(a){if(!this.hasClass(a)){var b=this.attributes["class"]||"";this.attributes["class"]=b+(b?" ":"")+
+a}},removeClass:function(a){var b=this.attributes["class"];if(b)(b=CKEDITOR.tools.trim(b.replace(RegExp("(?:\\s+|^)"+a+"(?:\\s+|$)")," ")))?this.attributes["class"]=b:delete this.attributes["class"]},hasClass:function(a){var b=this.attributes["class"];return!b?false:RegExp("(?:^|\\s)"+a+"(?=\\s|$)").test(b)},getFilterContext:function(a){var b=[];a||(a={off:false,nonEditable:false,nestedEditable:false});!a.off&&this.attributes["data-cke-processor"]=="off"&&b.push("off",true);!a.nonEditable&&this.attributes.contenteditable==
+"false"?b.push("nonEditable",true):a.nonEditable&&(!a.nestedEditable&&this.attributes.contenteditable=="true")&&b.push("nestedEditable",true);if(b.length)for(var a=CKEDITOR.tools.copy(a),d=0;d<b.length;d=d+2)a[b[d]]=b[d+1];return a}},true)})();
+(function(){var a={},f=/{([^}]+)}/g,b=/([\\'])/g,c=/\n/g,e=/\r/g;CKEDITOR.template=function(d){if(a[d])this.output=a[d];else{var h=d.replace(b,"\\$1").replace(c,"\\n").replace(e,"\\r").replace(f,function(a,b){return"',data['"+b+"']==undefined?'{"+b+"}':data['"+b+"'],'"});this.output=a[d]=Function("data","buffer","return buffer?buffer.push('"+h+"'):['"+h+"'].join('');")}}})();delete CKEDITOR.loadFullCore;CKEDITOR.instances={};CKEDITOR.document=new CKEDITOR.dom.document(document);
+CKEDITOR.add=function(a){CKEDITOR.instances[a.name]=a;a.on("focus",function(){if(CKEDITOR.currentInstance!=a){CKEDITOR.currentInstance=a;CKEDITOR.fire("currentInstance")}});a.on("blur",function(){if(CKEDITOR.currentInstance==a){CKEDITOR.currentInstance=null;CKEDITOR.fire("currentInstance")}});CKEDITOR.fire("instance",null,a)};CKEDITOR.remove=function(a){delete CKEDITOR.instances[a.name]};
+(function(){var a={};CKEDITOR.addTemplate=function(f,b){var c=a[f];if(c)return c;c={name:f,source:b};CKEDITOR.fire("template",c);return a[f]=new CKEDITOR.template(c.source)};CKEDITOR.getTemplate=function(f){return a[f]}})();(function(){var a=[];CKEDITOR.addCss=function(f){a.push(f)};CKEDITOR.getCss=function(){return a.join("\n")}})();CKEDITOR.on("instanceDestroyed",function(){CKEDITOR.tools.isEmpty(this.instances)&&CKEDITOR.fire("reset")});CKEDITOR.TRISTATE_ON=1;CKEDITOR.TRISTATE_OFF=2;
+CKEDITOR.TRISTATE_DISABLED=0;
+(function(){CKEDITOR.inline=function(a,f){if(!CKEDITOR.env.isCompatible)return null;a=CKEDITOR.dom.element.get(a);if(a.getEditor())throw'The editor instance "'+a.getEditor().name+'" is already attached to the provided element.';var b=new CKEDITOR.editor(f,a,CKEDITOR.ELEMENT_MODE_INLINE),c=a.is("textarea")?a:null;if(c){b.setData(c.getValue(),null,true);a=CKEDITOR.dom.element.createFromHtml('<div contenteditable="'+!!b.readOnly+'" class="cke_textarea_inline">'+c.getValue()+"</div>",CKEDITOR.document);
+a.insertAfter(c);c.hide();c.$.form&&b._attachToForm()}else b.setData(a.getHtml(),null,true);b.on("loaded",function(){b.fire("uiReady");b.editable(a);b.container=a;b.setData(b.getData(1));b.resetDirty();b.fire("contentDom");b.mode="wysiwyg";b.fire("mode");b.status="ready";b.fireOnce("instanceReady");CKEDITOR.fire("instanceReady",null,b)},null,null,1E4);b.on("destroy",function(){if(c){b.container.clearCustomData();b.container.remove();c.show()}b.element.clearCustomData();delete b.element});return b};
+CKEDITOR.inlineAll=function(){var a,f,b;for(b in CKEDITOR.dtd.$editable)for(var c=CKEDITOR.document.getElementsByTag(b),e=0,d=c.count();e<d;e++){a=c.getItem(e);if(a.getAttribute("contenteditable")=="true"){f={element:a,config:{}};CKEDITOR.fire("inline",f)!==false&&CKEDITOR.inline(a,f.config)}}};CKEDITOR.domReady(function(){!CKEDITOR.disableAutoInline&&CKEDITOR.inlineAll()})})();CKEDITOR.replaceClass="ckeditor";
+(function(){function a(a,e,d,h){if(!CKEDITOR.env.isCompatible)return null;a=CKEDITOR.dom.element.get(a);if(a.getEditor())throw'The editor instance "'+a.getEditor().name+'" is already attached to the provided element.';var k=new CKEDITOR.editor(e,a,h);if(h==CKEDITOR.ELEMENT_MODE_REPLACE){a.setStyle("visibility","hidden");k._.required=a.hasAttribute("required");a.removeAttribute("required")}d&&k.setData(d,null,true);k.on("loaded",function(){b(k);h==CKEDITOR.ELEMENT_MODE_REPLACE&&(k.config.autoUpdateElement&&
+a.$.form)&&k._attachToForm();k.setMode(k.config.startupMode,function(){k.resetDirty();k.status="ready";k.fireOnce("instanceReady");CKEDITOR.fire("instanceReady",null,k)})});k.on("destroy",f);return k}function f(){var a=this.container,b=this.element;if(a){a.clearCustomData();a.remove()}if(b){b.clearCustomData();if(this.elementMode==CKEDITOR.ELEMENT_MODE_REPLACE){b.show();this._.required&&b.setAttribute("required","required")}delete this.element}}function b(a){var b=a.name,d=a.element,f=a.elementMode,
+k=a.fire("uiSpace",{space:"top",html:""}).html,j=a.fire("uiSpace",{space:"bottom",html:""}).html,g=new CKEDITOR.template('<{outerEl} id="cke_{name}" class="{id} cke cke_reset cke_chrome cke_editor_{name} cke_{langDir} '+CKEDITOR.env.cssClass+'" dir="{langDir}" lang="{langCode}" role="application"'+(a.title?' aria-labelledby="cke_{name}_arialbl"':"")+">"+(a.title?'<span id="cke_{name}_arialbl" class="cke_voice_label">{voiceLabel}</span>':"")+'<{outerEl} class="cke_inner cke_reset" role="presentation">{topHtml}<{outerEl} id="{contentId}" class="cke_contents cke_reset" role="presentation"></{outerEl}>{bottomHtml}</{outerEl}></{outerEl}>'),
+b=CKEDITOR.dom.element.createFromHtml(g.output({id:a.id,name:b,langDir:a.lang.dir,langCode:a.langCode,voiceLabel:a.title,topHtml:k?'<span id="'+a.ui.spaceId("top")+'" class="cke_top cke_reset_all" role="presentation" style="height:auto">'+k+"</span>":"",contentId:a.ui.spaceId("contents"),bottomHtml:j?'<span id="'+a.ui.spaceId("bottom")+'" class="cke_bottom cke_reset_all" role="presentation">'+j+"</span>":"",outerEl:CKEDITOR.env.ie?"span":"div"}));if(f==CKEDITOR.ELEMENT_MODE_REPLACE){d.hide();b.insertAfter(d)}else d.append(b);
+a.container=b;k&&a.ui.space("top").unselectable();j&&a.ui.space("bottom").unselectable();d=a.config.width;f=a.config.height;d&&b.setStyle("width",CKEDITOR.tools.cssLength(d));f&&a.ui.space("contents").setStyle("height",CKEDITOR.tools.cssLength(f));b.disableContextMenu();CKEDITOR.env.webkit&&b.on("focus",function(){a.focus()});a.fireOnce("uiReady")}CKEDITOR.replace=function(b,e){return a(b,e,null,CKEDITOR.ELEMENT_MODE_REPLACE)};CKEDITOR.appendTo=function(b,e,d){return a(b,e,d,CKEDITOR.ELEMENT_MODE_APPENDTO)};
+CKEDITOR.replaceAll=function(){for(var a=document.getElementsByTagName("textarea"),b=0;b<a.length;b++){var d=null,f=a[b];if(f.name||f.id){if(typeof arguments[0]=="string"){if(!RegExp("(?:^|\\s)"+arguments[0]+"(?:$|\\s)").test(f.className))continue}else if(typeof arguments[0]=="function"){d={};if(arguments[0](f,d)===false)continue}this.replace(f,d)}}};CKEDITOR.editor.prototype.addMode=function(a,b){(this._.modes||(this._.modes={}))[a]=b};CKEDITOR.editor.prototype.setMode=function(a,b){var d=this,f=
+this._.modes;if(!(a==d.mode||!f||!f[a])){d.fire("beforeSetMode",a);if(d.mode){var k=d.checkDirty(),f=d._.previousModeData,j,g=0;d.fire("beforeModeUnload");d.editable(0);d._.previousMode=d.mode;d._.previousModeData=j=d.getData(1);if(d.mode=="source"&&f==j){d.fire("lockSnapshot",{forceUpdate:true});g=1}d.ui.space("contents").setHtml("");d.mode=""}else d._.previousModeData=d.getData(1);this._.modes[a](function(){d.mode=a;k!==void 0&&!k&&d.resetDirty();g?d.fire("unlockSnapshot"):a=="wysiwyg"&&d.fire("saveSnapshot");
+setTimeout(function(){d.fire("mode");b&&b.call(d)},0)})}};CKEDITOR.editor.prototype.resize=function(a,b,d,f){var k=this.container,j=this.ui.space("contents"),g=CKEDITOR.env.webkit&&this.document&&this.document.getWindow().$.frameElement,f=f?this.container.getFirst(function(a){return a.type==CKEDITOR.NODE_ELEMENT&&a.hasClass("cke_inner")}):k;f.setSize("width",a,true);g&&(g.style.width="1%");j.setStyle("height",Math.max(b-(d?0:(f.$.offsetHeight||0)-(j.$.clientHeight||0)),0)+"px");g&&(g.style.width=
+"100%");this.fire("resize")};CKEDITOR.editor.prototype.getResizable=function(a){return a?this.ui.space("contents"):this.container};CKEDITOR.domReady(function(){CKEDITOR.replaceClass&&CKEDITOR.replaceAll(CKEDITOR.replaceClass)})})();CKEDITOR.config.startupMode="wysiwyg";
+(function(){function a(a){var b=a.editor,d=a.data.path,e=d.blockLimit,l=a.data.selection,p=l.getRanges()[0],r;if(CKEDITOR.env.gecko||CKEDITOR.env.ie&&CKEDITOR.env.needsBrFiller)if(l=f(l,d)){l.appendBogus();r=CKEDITOR.env.ie}if(h(b,d.block,e)&&p.collapsed&&!p.getCommonAncestor().isReadOnly()){d=p.clone();d.enlarge(CKEDITOR.ENLARGE_BLOCK_CONTENTS);e=new CKEDITOR.dom.walker(d);e.guard=function(a){return!c(a)||a.type==CKEDITOR.NODE_COMMENT||a.isReadOnly()};if(!e.checkForward()||d.checkStartOfBlock()&&
+d.checkEndOfBlock()){b=p.fixBlock(true,b.activeEnterMode==CKEDITOR.ENTER_DIV?"div":"p");if(!CKEDITOR.env.needsBrFiller)(b=b.getFirst(c))&&(b.type==CKEDITOR.NODE_TEXT&&CKEDITOR.tools.trim(b.getText()).match(/^(?:&nbsp;|\xa0)$/))&&b.remove();r=1;a.cancel()}}r&&p.select()}function f(a,b){if(a.isFake)return 0;var d=b.block||b.blockLimit,e=d&&d.getLast(c);if(d&&d.isBlockBoundary()&&(!e||!(e.type==CKEDITOR.NODE_ELEMENT&&e.isBlockBoundary()))&&!d.is("pre")&&!d.getBogus())return d}function b(a){var b=a.data.getTarget();
+if(b.is("input")){b=b.getAttribute("type");(b=="submit"||b=="reset")&&a.data.preventDefault()}}function c(a){return s(a)&&w(a)}function e(a,b){return function(c){var d=CKEDITOR.dom.element.get(c.data.$.toElement||c.data.$.fromElement||c.data.$.relatedTarget);(!d||!b.equals(d)&&!b.contains(d))&&a.call(this,c)}}function d(a){function b(a){return function(b,e){e&&(b.type==CKEDITOR.NODE_ELEMENT&&b.is(f))&&(d=b);if(!e&&c(b)&&(!a||!m(b)))return false}}var d,e=a.getRanges()[0],a=a.root,f={table:1,ul:1,ol:1,
+dl:1};if(e.startPath().contains(f)){var p=e.clone();p.collapse(1);p.setStartAt(a,CKEDITOR.POSITION_AFTER_START);a=new CKEDITOR.dom.walker(p);a.guard=b();a.checkBackward();if(d){p=e.clone();p.collapse();p.setEndAt(d,CKEDITOR.POSITION_AFTER_END);a=new CKEDITOR.dom.walker(p);a.guard=b(true);d=false;a.checkForward();return d}}return null}function h(a,b,c){return a.config.autoParagraph!==false&&a.activeEnterMode!=CKEDITOR.ENTER_BR&&a.editable().equals(c)&&!b||b&&b.getAttribute("contenteditable")=="true"}
+function k(a){a.editor.focus();a.editor.fire("saveSnapshot")}function j(a){var b=a.editor;b.getSelection().scrollIntoView();setTimeout(function(){b.fire("saveSnapshot")},0)}function g(a,b,c){for(var d=a.getCommonAncestor(b),b=a=c?b:a;(a=a.getParent())&&!d.equals(a)&&a.getChildCount()==1;)b=a;b.remove()}CKEDITOR.editable=CKEDITOR.tools.createClass({base:CKEDITOR.dom.element,$:function(a,b){this.base(b.$||b);this.editor=a;this.status="unloaded";this.hasFocus=false;this.setup()},proto:{focus:function(){var a;
+if(CKEDITOR.env.webkit&&!this.hasFocus){a=this.editor._.previousActive||this.getDocument().getActive();if(this.contains(a)){a.focus();return}}try{this.$[CKEDITOR.env.ie&&this.getDocument().equals(CKEDITOR.document)?"setActive":"focus"]()}catch(b){if(!CKEDITOR.env.ie)throw b;}if(CKEDITOR.env.safari&&!this.isInline()){a=CKEDITOR.document.getActive();a.equals(this.getWindow().getFrame())||this.getWindow().focus()}},on:function(a,b){var c=Array.prototype.slice.call(arguments,0);if(CKEDITOR.env.ie&&/^focus|blur$/.exec(a)){a=
+a=="focus"?"focusin":"focusout";b=e(b,this);c[0]=a;c[1]=b}return CKEDITOR.dom.element.prototype.on.apply(this,c)},attachListener:function(a){!this._.listeners&&(this._.listeners=[]);var b=Array.prototype.slice.call(arguments,1),b=a.on.apply(a,b);this._.listeners.push(b);return b},clearListeners:function(){var a=this._.listeners;try{for(;a.length;)a.pop().removeListener()}catch(b){}},restoreAttrs:function(){var a=this._.attrChanges,b,c;for(c in a)if(a.hasOwnProperty(c)){b=a[c];b!==null?this.setAttribute(c,
+b):this.removeAttribute(c)}},attachClass:function(a){var b=this.getCustomData("classes");if(!this.hasClass(a)){!b&&(b=[]);b.push(a);this.setCustomData("classes",b);this.addClass(a)}},changeAttr:function(a,b){var c=this.getAttribute(a);if(b!==c){!this._.attrChanges&&(this._.attrChanges={});a in this._.attrChanges||(this._.attrChanges[a]=c);this.setAttribute(a,b)}},insertHtml:function(a,b){k(this);q(this,b||"html",a)},insertText:function(a){k(this);var b=this.editor,c=b.getSelection().getStartElement().hasAscendant("pre",
+true)?CKEDITOR.ENTER_BR:b.activeEnterMode,b=c==CKEDITOR.ENTER_BR,d=CKEDITOR.tools,a=d.htmlEncode(a.replace(/\r\n/g,"\n")),a=a.replace(/\t/g,"&nbsp;&nbsp; &nbsp;"),c=c==CKEDITOR.ENTER_P?"p":"div";if(!b){var e=/\n{2}/g;if(e.test(a))var f="<"+c+">",r="</"+c+">",a=f+a.replace(e,function(){return r+f})+r}a=a.replace(/\n/g,"<br>");b||(a=a.replace(RegExp("<br>(?=</"+c+">)"),function(a){return d.repeat(a,2)}));a=a.replace(/^ | $/g,"&nbsp;");a=a.replace(/(>|\s) /g,function(a,b){return b+"&nbsp;"}).replace(/ (?=<)/g,
+"&nbsp;");q(this,"text",a)},insertElement:function(a,b){b?this.insertElementIntoRange(a,b):this.insertElementIntoSelection(a)},insertElementIntoRange:function(a,b){var c=this.editor,d=c.config.enterMode,e=a.getName(),f=CKEDITOR.dtd.$block[e];if(b.checkReadOnly())return false;b.deleteContents(1);b.startContainer.type==CKEDITOR.NODE_ELEMENT&&b.startContainer.is({tr:1,table:1,tbody:1,thead:1,tfoot:1})&&t(b);var r,n;if(f)for(;(r=b.getCommonAncestor(0,1))&&(n=CKEDITOR.dtd[r.getName()])&&(!n||!n[e]);)if(r.getName()in
+CKEDITOR.dtd.span)b.splitElement(r);else if(b.checkStartOfBlock()&&b.checkEndOfBlock()){b.setStartBefore(r);b.collapse(true);r.remove()}else b.splitBlock(d==CKEDITOR.ENTER_DIV?"div":"p",c.editable());b.insertNode(a);return true},insertElementIntoSelection:function(a){k(this);var b=this.editor,d=b.activeEnterMode,b=b.getSelection(),e=b.getRanges()[0],f=a.getName(),f=CKEDITOR.dtd.$block[f];if(this.insertElementIntoRange(a,e)){e.moveToPosition(a,CKEDITOR.POSITION_AFTER_END);if(f)if((f=a.getNext(function(a){return c(a)&&
+!m(a)}))&&f.type==CKEDITOR.NODE_ELEMENT&&f.is(CKEDITOR.dtd.$block))f.getDtd()["#"]?e.moveToElementEditStart(f):e.moveToElementEditEnd(a);else if(!f&&d!=CKEDITOR.ENTER_BR){f=e.fixBlock(true,d==CKEDITOR.ENTER_DIV?"div":"p");e.moveToElementEditStart(f)}}b.selectRanges([e]);j(this)},setData:function(a,b){b||(a=this.editor.dataProcessor.toHtml(a));this.setHtml(a);this.fixInitialSelection();if(this.status=="unloaded")this.status="ready";this.editor.fire("dataReady")},getData:function(a){var b=this.getHtml();
+a||(b=this.editor.dataProcessor.toDataFormat(b));return b},setReadOnly:function(a){this.setAttribute("contenteditable",!a)},detach:function(){this.removeClass("cke_editable");this.status="detached";var a=this.editor;this._.detach();delete a.document;delete a.window},isInline:function(){return this.getDocument().equals(CKEDITOR.document)},fixInitialSelection:function(){function a(){var b=c.getDocument().$,d=b.getSelection(),e;if(d.anchorNode&&d.anchorNode==c.$)e=true;else if(CKEDITOR.env.webkit){var f=
+c.getDocument().getActive();f&&(f.equals(c)&&!d.anchorNode)&&(e=true)}if(e){e=new CKEDITOR.dom.range(c);e.moveToElementEditStart(c);b=b.createRange();b.setStart(e.startContainer.$,e.startOffset);b.collapse(true);d.removeAllRanges();d.addRange(b)}}function b(){var a=c.getDocument().$,d=a.selection,e=c.getDocument().getActive();if(d.type=="None"&&e.equals(c)){d=new CKEDITOR.dom.range(c);a=a.body.createTextRange();d.moveToElementEditStart(c);d=d.startContainer;d.type!=CKEDITOR.NODE_ELEMENT&&(d=d.getParent());
+a.moveToElementText(d.$);a.collapse(true);a.select()}}var c=this;if(CKEDITOR.env.ie&&(CKEDITOR.env.version<9||CKEDITOR.env.quirks)){if(this.hasFocus){this.focus();b()}}else if(this.hasFocus){this.focus();a()}else this.once("focus",function(){a()},null,null,-999)},setup:function(){var a=this.editor;this.attachListener(a,"beforeGetData",function(){var b=this.getData();this.is("textarea")||a.config.ignoreEmptyParagraph!==false&&(b=b.replace(y,function(a,b){return b}));a.setData(b,null,1)},this);this.attachListener(a,
+"getSnapshot",function(a){a.data=this.getData(1)},this);this.attachListener(a,"afterSetData",function(){this.setData(a.getData(1))},this);this.attachListener(a,"loadSnapshot",function(a){this.setData(a.data,1)},this);this.attachListener(a,"beforeFocus",function(){var b=a.getSelection();(b=b&&b.getNative())&&b.type=="Control"||this.focus()},this);this.attachListener(a,"insertHtml",function(a){this.insertHtml(a.data.dataValue,a.data.mode)},this);this.attachListener(a,"insertElement",function(a){this.insertElement(a.data)},
+this);this.attachListener(a,"insertText",function(a){this.insertText(a.data)},this);this.setReadOnly(a.readOnly);this.attachClass("cke_editable");this.attachClass(a.elementMode==CKEDITOR.ELEMENT_MODE_INLINE?"cke_editable_inline":a.elementMode==CKEDITOR.ELEMENT_MODE_REPLACE||a.elementMode==CKEDITOR.ELEMENT_MODE_APPENDTO?"cke_editable_themed":"");this.attachClass("cke_contents_"+a.config.contentsLangDirection);a.keystrokeHandler.blockedKeystrokes[8]=+a.readOnly;a.keystrokeHandler.attach(this);this.on("blur",
+function(){this.hasFocus=false},null,null,-1);this.on("focus",function(){this.hasFocus=true},null,null,-1);a.focusManager.add(this);if(this.equals(CKEDITOR.document.getActive())){this.hasFocus=true;a.once("contentDom",function(){a.focusManager.focus(this)},this)}this.isInline()&&this.changeAttr("tabindex",a.tabIndex);if(!this.is("textarea")){a.document=this.getDocument();a.window=this.getWindow();var e=a.document;this.changeAttr("spellcheck",!a.config.disableNativeSpellChecker);var f=a.config.contentsLangDirection;
+this.getDirection(1)!=f&&this.changeAttr("dir",f);var h=CKEDITOR.getCss();if(h){f=e.getHead();if(!f.getCustomData("stylesheet")){h=e.appendStyleText(h);h=new CKEDITOR.dom.element(h.ownerNode||h.owningElement);f.setCustomData("stylesheet",h);h.data("cke-temp",1)}}f=e.getCustomData("stylesheet_ref")||0;e.setCustomData("stylesheet_ref",f+1);this.setCustomData("cke_includeReadonly",!a.config.disableReadonlyStyling);this.attachListener(this,"click",function(a){var a=a.data,b=(new CKEDITOR.dom.elementPath(a.getTarget(),
+this)).contains("a");b&&(a.$.button!=2&&b.isReadOnly())&&a.preventDefault()});var l={8:1,46:1};this.attachListener(a,"key",function(b){if(a.readOnly)return true;var c=b.data.domEvent.getKey(),e;if(c in l){var b=a.getSelection(),f,h=b.getRanges()[0],g=h.startPath(),o,m,j,c=c==8;if(CKEDITOR.env.ie&&CKEDITOR.env.version<11&&(f=b.getSelectedElement())||(f=d(b))){a.fire("saveSnapshot");h.moveToPosition(f,CKEDITOR.POSITION_BEFORE_START);f.remove();h.select();a.fire("saveSnapshot");e=1}else if(h.collapsed)if((o=
+g.block)&&(j=o[c?"getPrevious":"getNext"](s))&&j.type==CKEDITOR.NODE_ELEMENT&&j.is("table")&&h[c?"checkStartOfBlock":"checkEndOfBlock"]()){a.fire("saveSnapshot");h[c?"checkEndOfBlock":"checkStartOfBlock"]()&&o.remove();h["moveToElementEdit"+(c?"End":"Start")](j);h.select();a.fire("saveSnapshot");e=1}else if(g.blockLimit&&g.blockLimit.is("td")&&(m=g.blockLimit.getAscendant("table"))&&h.checkBoundaryOfElement(m,c?CKEDITOR.START:CKEDITOR.END)&&(j=m[c?"getPrevious":"getNext"](s))){a.fire("saveSnapshot");
+h["moveToElementEdit"+(c?"End":"Start")](j);h.checkStartOfBlock()&&h.checkEndOfBlock()?j.remove():h.select();a.fire("saveSnapshot");e=1}else if((m=g.contains(["td","th","caption"]))&&h.checkBoundaryOfElement(m,c?CKEDITOR.START:CKEDITOR.END))e=1}return!e});a.blockless&&(CKEDITOR.env.ie&&CKEDITOR.env.needsBrFiller)&&this.attachListener(this,"keyup",function(b){if(b.data.getKeystroke()in l&&!this.getFirst(c)){this.appendBogus();b=a.createRange();b.moveToPosition(this,CKEDITOR.POSITION_AFTER_START);b.select()}});
+this.attachListener(this,"dblclick",function(b){if(a.readOnly)return false;b={element:b.data.getTarget()};a.fire("doubleclick",b)});CKEDITOR.env.ie&&this.attachListener(this,"click",b);CKEDITOR.env.ie||this.attachListener(this,"mousedown",function(b){var c=b.data.getTarget();if(c.is("img","hr","input","textarea","select")&&!c.isReadOnly()){a.getSelection().selectElement(c);c.is("input","textarea","select")&&b.data.preventDefault()}});CKEDITOR.env.gecko&&this.attachListener(this,"mouseup",function(b){if(b.data.$.button==
+2){b=b.data.getTarget();if(!b.getOuterHtml().replace(y,"")){var c=a.createRange();c.moveToElementEditStart(b);c.select(true)}}});if(CKEDITOR.env.webkit){this.attachListener(this,"click",function(a){a.data.getTarget().is("input","select")&&a.data.preventDefault()});this.attachListener(this,"mouseup",function(a){a.data.getTarget().is("input","textarea")&&a.data.preventDefault()})}CKEDITOR.env.webkit&&this.attachListener(a,"key",function(b){b=b.data.domEvent.getKey();if(b in l){var c=b==8,d=a.getSelection().getRanges()[0],
+b=d.startPath();if(d.collapsed){var e;a:{var f=b.block;if(f)if(d[c?"checkStartOfBlock":"checkEndOfBlock"]())if(!d.moveToClosestEditablePosition(f,!c)||!d.collapsed)e=false;else{if(d.startContainer.type==CKEDITOR.NODE_ELEMENT){var h=d.startContainer.getChild(d.startOffset-(c?1:0));if(h&&h.type==CKEDITOR.NODE_ELEMENT&&h.is("hr")){a.fire("saveSnapshot");h.remove();e=true;break a}}if((d=d.startPath().block)&&(!d||!d.contains(f))){a.fire("saveSnapshot");var j;(j=(c?d:f).getBogus())&&j.remove();e=a.getSelection();
+j=e.createBookmarks();(c?f:d).moveChildren(c?d:f,false);b.lastElement.mergeSiblings();g(f,d,!c);e.selectBookmarks(j);e=true}}else e=false;else e=false}if(!e)return}else{c=d;e=b.block;j=c.endPath().block;if(!e||!j||e.equals(j))b=false;else{a.fire("saveSnapshot");(f=e.getBogus())&&f.remove();c.deleteContents();if(j.getParent()){j.moveChildren(e,false);b.lastElement.mergeSiblings();g(e,j,true)}c=a.getSelection().getRanges()[0];c.collapse(1);c.select();b=true}if(!b)return}a.getSelection().scrollIntoView();
+a.fire("saveSnapshot");return false}},this,null,100)}}},_:{detach:function(){this.editor.setData(this.editor.getData(),0,1);this.clearListeners();this.restoreAttrs();var a;if(a=this.removeCustomData("classes"))for(;a.length;)this.removeClass(a.pop());if(!this.is("textarea")){a=this.getDocument();var b=a.getHead();if(b.getCustomData("stylesheet")){var c=a.getCustomData("stylesheet_ref");if(--c)a.setCustomData("stylesheet_ref",c);else{a.removeCustomData("stylesheet_ref");b.removeCustomData("stylesheet").remove()}}}this.editor.fire("contentDomUnload");
+delete this.editor}}});CKEDITOR.editor.prototype.editable=function(a){var b=this._.editable;if(b&&a)return 0;if(arguments.length)b=this._.editable=a?a instanceof CKEDITOR.editable?a:new CKEDITOR.editable(this,a):(b&&b.detach(),null);return b};var m=CKEDITOR.dom.walker.bogus(),y=/(^|<body\b[^>]*>)\s*<(p|div|address|h\d|center|pre)[^>]*>\s*(?:<br[^>]*>|&nbsp;|\u00A0|&#160;)?\s*(:?<\/\2>)?\s*(?=$|<\/body>)/gi,s=CKEDITOR.dom.walker.whitespaces(true),w=CKEDITOR.dom.walker.bookmark(false,true);CKEDITOR.on("instanceLoaded",
+function(b){var c=b.editor;c.on("insertElement",function(a){a=a.data;if(a.type==CKEDITOR.NODE_ELEMENT&&(a.is("input")||a.is("textarea"))){a.getAttribute("contentEditable")!="false"&&a.data("cke-editable",a.hasAttribute("contenteditable")?"true":"1");a.setAttribute("contentEditable",false)}});c.on("selectionChange",function(b){if(!c.readOnly){var d=c.getSelection();if(d&&!d.isLocked){d=c.checkDirty();c.fire("lockSnapshot");a(b);c.fire("unlockSnapshot");!d&&c.resetDirty()}}})});CKEDITOR.on("instanceCreated",
+function(a){var b=a.editor;b.on("mode",function(){var a=b.editable();if(a&&a.isInline()){var c=b.title;a.changeAttr("role","textbox");a.changeAttr("aria-label",c);c&&a.changeAttr("title",c);var d=b.fire("ariaEditorHelpLabel",{}).label;if(d)if(c=this.ui.space(this.elementMode==CKEDITOR.ELEMENT_MODE_INLINE?"top":"contents")){var e=CKEDITOR.tools.getNextId(),d=CKEDITOR.dom.element.createFromHtml('<span id="'+e+'" class="cke_voice_label">'+d+"</span>");c.append(d);a.changeAttr("aria-describedby",e)}}})});
+CKEDITOR.addCss(".cke_editable{cursor:text}.cke_editable img,.cke_editable input,.cke_editable textarea{cursor:default}");var q=function(){function a(b){return b.type==CKEDITOR.NODE_ELEMENT}function b(c,d){var e,f,l,p,h=[],g=d.range.startContainer;e=d.range.startPath();for(var g=r[g.getName()],n=0,j=c.getChildren(),m=j.count(),o=-1,C=-1,k=0,q=e.contains(r.$list);n<m;++n){e=j.getItem(n);if(a(e)){l=e.getName();if(q&&l in CKEDITOR.dtd.$list)h=h.concat(b(e,d));else{p=!!g[l];if(l=="br"&&e.data("cke-eol")&&
+(!n||n==m-1)){k=(f=n?h[n-1].node:j.getItem(n+1))&&(!a(f)||!f.is("br"));f=f&&a(f)&&r.$block[f.getName()]}o==-1&&!p&&(o=n);p||(C=n);h.push({isElement:1,isLineBreak:k,isBlock:e.isBlockBoundary(),hasBlockSibling:f,node:e,name:l,allowed:p});f=k=0}}else h.push({isElement:0,node:e,allowed:1})}if(o>-1)h[o].firstNotAllowed=1;if(C>-1)h[C].lastNotAllowed=1;return h}function d(b,c){var e=[],f=b.getChildren(),l=f.count(),p,h=0,g=r[c],n=!b.is(r.$inline)||b.is("br");for(n&&e.push(" ");h<l;h++){p=f.getItem(h);a(p)&&
+!p.is(g)?e=e.concat(d(p,c)):e.push(p)}n&&e.push(" ");return e}function e(b){return b&&a(b)&&(b.is(r.$removeEmpty)||b.is("a")&&!b.isBlockBoundary())}function f(b,c,d,e){var p=b.clone(),h,r;p.setEndAt(c,CKEDITOR.POSITION_BEFORE_END);if((h=(new CKEDITOR.dom.walker(p)).next())&&a(h)&&g[h.getName()]&&(r=h.getPrevious())&&a(r)&&!r.getParent().equals(b.startContainer)&&d.contains(r)&&e.contains(h)&&h.isIdentical(r)){h.moveChildren(r);h.remove();f(b,c,d,e)}}function p(b,c){function d(b,c){if(c.isBlock&&c.isElement&&
+!c.node.is("br")&&a(b)&&b.is("br")){b.remove();return 1}}var e=c.endContainer.getChild(c.endOffset),f=c.endContainer.getChild(c.endOffset-1);e&&d(e,b[b.length-1]);if(f&&d(f,b[0])){c.setEnd(c.endContainer,c.endOffset-1);c.collapse()}}var r=CKEDITOR.dtd,g={p:1,div:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,ul:1,ol:1,li:1,pre:1,dl:1,blockquote:1},m={p:1,div:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1},C=CKEDITOR.tools.extend({},r.$inline);delete C.br;return function(g,n,k){var q=g.editor,v=q.getSelection().getRanges()[0],
+G=false;if(n=="unfiltered_html"){n="html";G=true}if(!v.checkReadOnly()){var z=(new CKEDITOR.dom.elementPath(v.startContainer,v.root)).blockLimit||v.root,n={type:n,dontFilter:G,editable:g,editor:q,range:v,blockLimit:z,mergeCandidates:[],zombies:[]},q=n.range,G=n.mergeCandidates,B,x,E,s;if(n.type=="text"&&q.shrink(CKEDITOR.SHRINK_ELEMENT,true,false)){B=CKEDITOR.dom.element.createFromHtml("<span>&nbsp;</span>",q.document);q.insertNode(B);q.setStartAfter(B)}x=new CKEDITOR.dom.elementPath(q.startContainer);
+n.endPath=E=new CKEDITOR.dom.elementPath(q.endContainer);if(!q.collapsed){var z=E.block||E.blockLimit,w=q.getCommonAncestor();z&&(!z.equals(w)&&!z.contains(w)&&q.checkEndOfBlock())&&n.zombies.push(z);q.deleteContents()}for(;(s=a(q.startContainer)&&q.startContainer.getChild(q.startOffset-1))&&a(s)&&s.isBlockBoundary()&&x.contains(s);)q.moveToPosition(s,CKEDITOR.POSITION_BEFORE_END);f(q,n.blockLimit,x,E);if(B){q.setEndBefore(B);q.collapse();B.remove()}B=q.startPath();if(z=B.contains(e,false,1)){q.splitElement(z);
+n.inlineStylesRoot=z;n.inlineStylesPeak=B.lastElement}B=q.createBookmark();(z=B.startNode.getPrevious(c))&&a(z)&&e(z)&&G.push(z);(z=B.startNode.getNext(c))&&a(z)&&e(z)&&G.push(z);for(z=B.startNode;(z=z.getParent())&&e(z);)G.push(z);q.moveToBookmark(B);if(B=k){B=n.range;if(n.type=="text"&&n.inlineStylesRoot){s=n.inlineStylesPeak;q=s.getDocument().createText("{cke-peak}");for(G=n.inlineStylesRoot.getParent();!s.equals(G);){q=q.appendTo(s.clone());s=s.getParent()}k=q.getOuterHtml().split("{cke-peak}").join(k)}s=
+n.blockLimit.getName();if(/^\s+|\s+$/.test(k)&&"span"in CKEDITOR.dtd[s])var y='<span data-cke-marker="1">&nbsp;</span>',k=y+k+y;k=n.editor.dataProcessor.toHtml(k,{context:null,fixForBody:false,dontFilter:n.dontFilter,filter:n.editor.activeFilter,enterMode:n.editor.activeEnterMode});s=B.document.createElement("body");s.setHtml(k);if(y){s.getFirst().remove();s.getLast().remove()}if((y=B.startPath().block)&&!(y.getChildCount()==1&&y.getBogus()))a:{var t;if(s.getChildCount()==1&&a(t=s.getFirst())&&t.is(m)){y=
+t.getElementsByTag("*");B=0;for(G=y.count();B<G;B++){q=y.getItem(B);if(!q.is(C))break a}t.moveChildren(t.getParent(1));t.remove()}}n.dataWrapper=s;B=k}if(B){t=n.range;var y=t.document,D,k=n.blockLimit;B=0;var J;s=[];var H,Q,G=q=0,M,S;x=t.startContainer;var z=n.endPath.elements[0],T;E=z.getPosition(x);w=!!z.getCommonAncestor(x)&&E!=CKEDITOR.POSITION_IDENTICAL&&!(E&CKEDITOR.POSITION_CONTAINS+CKEDITOR.POSITION_IS_CONTAINED);x=b(n.dataWrapper,n);for(p(x,t);B<x.length;B++){E=x[B];if(D=E.isLineBreak){D=
+t;M=k;var O=void 0,V=void 0;if(E.hasBlockSibling)D=1;else{O=D.startContainer.getAscendant(r.$block,1);if(!O||!O.is({div:1,p:1}))D=0;else{V=O.getPosition(M);if(V==CKEDITOR.POSITION_IDENTICAL||V==CKEDITOR.POSITION_CONTAINS)D=0;else{M=D.splitElement(O);D.moveToPosition(M,CKEDITOR.POSITION_AFTER_START);D=1}}}}if(D)G=B>0;else{D=t.startPath();if(!E.isBlock&&h(n.editor,D.block,D.blockLimit)&&(Q=n.editor.activeEnterMode!=CKEDITOR.ENTER_BR&&n.editor.config.autoParagraph!==false?n.editor.activeEnterMode==CKEDITOR.ENTER_DIV?
+"div":"p":false)){Q=y.createElement(Q);Q.appendBogus();t.insertNode(Q);CKEDITOR.env.needsBrFiller&&(J=Q.getBogus())&&J.remove();t.moveToPosition(Q,CKEDITOR.POSITION_BEFORE_END)}if((D=t.startPath().block)&&!D.equals(H)){if(J=D.getBogus()){J.remove();s.push(D)}H=D}E.firstNotAllowed&&(q=1);if(q&&E.isElement){D=t.startContainer;for(M=null;D&&!r[D.getName()][E.name];){if(D.equals(k)){D=null;break}M=D;D=D.getParent()}if(D){if(M){S=t.splitElement(M);n.zombies.push(S);n.zombies.push(M)}}else{M=k.getName();
+T=!B;D=B==x.length-1;M=d(E.node,M);for(var O=[],V=M.length,W=0,Y=void 0,Z=0,U=-1;W<V;W++){Y=M[W];if(Y==" "){if(!Z&&(!T||W)){O.push(new CKEDITOR.dom.text(" "));U=O.length}Z=1}else{O.push(Y);Z=0}}D&&U==O.length&&O.pop();T=O}}if(T){for(;D=T.pop();)t.insertNode(D);T=0}else t.insertNode(E.node);if(E.lastNotAllowed&&B<x.length-1){(S=w?z:S)&&t.setEndAt(S,CKEDITOR.POSITION_AFTER_START);q=0}t.collapse()}}n.dontMoveCaret=G;n.bogusNeededBlocks=s}J=n.range;var N;S=n.bogusNeededBlocks;for(T=J.createBookmark();H=
+n.zombies.pop();)if(H.getParent()){Q=J.clone();Q.moveToElementEditStart(H);Q.removeEmptyBlocksAtEnd()}if(S)for(;H=S.pop();)CKEDITOR.env.needsBrFiller?H.appendBogus():H.append(J.document.createText(" "));for(;H=n.mergeCandidates.pop();)H.mergeSiblings();J.moveToBookmark(T);if(!n.dontMoveCaret){for(H=a(J.startContainer)&&J.startContainer.getChild(J.startOffset-1);H&&a(H)&&!H.is(r.$empty);){if(H.isBlockBoundary())J.moveToPosition(H,CKEDITOR.POSITION_BEFORE_END);else{if(e(H)&&H.getHtml().match(/(\s|&nbsp;)$/g)){N=
+null;break}N=J.clone();N.moveToPosition(H,CKEDITOR.POSITION_BEFORE_END)}H=H.getLast(c)}N&&J.moveToRange(N)}v.select();j(g)}}}(),t=function(){function a(b){b=new CKEDITOR.dom.walker(b);b.guard=function(a,b){if(b)return false;if(a.type==CKEDITOR.NODE_ELEMENT)return a.is(CKEDITOR.dtd.$tableContent)};b.evaluator=function(a){return a.type==CKEDITOR.NODE_ELEMENT};return b}function b(a,c,d){c=a.getDocument().createElement(c);a.append(c,d);return c}function c(a){var b=a.count(),d;for(b;b-- >0;){d=a.getItem(b);
+if(!CKEDITOR.tools.trim(d.getHtml())){d.appendBogus();CKEDITOR.env.ie&&(CKEDITOR.env.version<9&&d.getChildCount())&&d.getFirst().remove()}}}return function(d){var e=d.startContainer,f=e.getAscendant("table",1),h=false;c(f.getElementsByTag("td"));c(f.getElementsByTag("th"));f=d.clone();f.setStart(e,0);f=a(f).lastBackward();if(!f){f=d.clone();f.setEndAt(e,CKEDITOR.POSITION_BEFORE_END);f=a(f).lastForward();h=true}f||(f=e);if(f.is("table")){d.setStartAt(f,CKEDITOR.POSITION_BEFORE_START);d.collapse(true);
+f.remove()}else{f.is({tbody:1,thead:1,tfoot:1})&&(f=b(f,"tr",h));f.is("tr")&&(f=b(f,f.getParent().is("thead")?"th":"td",h));(e=f.getBogus())&&e.remove();d.moveToPosition(f,h?CKEDITOR.POSITION_AFTER_START:CKEDITOR.POSITION_BEFORE_END)}}}()})();
+(function(){function a(){var a=this._.fakeSelection,b;if(a){b=this.getSelection(1);if(!b||!b.isHidden()){a.reset();a=0}}if(!a){a=b||this.getSelection(1);if(!a||a.getType()==CKEDITOR.SELECTION_NONE)return}this.fire("selectionCheck",a);b=this.elementPath();if(!b.compare(this._.selectionPreviousPath)){if(CKEDITOR.env.webkit)this._.previousActive=this.document.getActive();this._.selectionPreviousPath=b;this.fire("selectionChange",{selection:a,path:b})}}function f(){q=true;if(!w){b.call(this);w=CKEDITOR.tools.setTimeout(b,
+200,this)}}function b(){w=null;if(q){CKEDITOR.tools.setTimeout(a,0,this);q=false}}function c(a){return t(a)||a.type==CKEDITOR.NODE_ELEMENT&&!a.is(CKEDITOR.dtd.$empty)?true:false}function e(a){function b(c,d){return!c||c.type==CKEDITOR.NODE_TEXT?false:a.clone()["moveToElementEdit"+(d?"End":"Start")](c)}if(!(a.root instanceof CKEDITOR.editable))return false;var d=a.startContainer,e=a.getPreviousNode(c,null,d),f=a.getNextNode(c,null,d);return b(e)||b(f,1)||!e&&!f&&!(d.type==CKEDITOR.NODE_ELEMENT&&d.isBlockBoundary()&&
+d.getBogus())?true:false}function d(a){return a.getCustomData("cke-fillingChar")}function h(a,b){var c=a&&a.removeCustomData("cke-fillingChar");if(c){if(b!==false){var d,e=a.getDocument().getSelection().getNative(),f=e&&e.type!="None"&&e.getRangeAt(0);if(c.getLength()>1&&f&&f.intersectsNode(c.$)){d=j(e);f=e.focusNode==c.$&&e.focusOffset>0;e.anchorNode==c.$&&e.anchorOffset>0&&d[0].offset--;f&&d[1].offset--}}c.setText(k(c.getText()));d&&g(a.getDocument().$,d)}}function k(a){return a.replace(/\u200B( )?/g,
+function(a){return a[1]?" ":""})}function j(a){return[{node:a.anchorNode,offset:a.anchorOffset},{node:a.focusNode,offset:a.focusOffset}]}function g(a,b){var c=a.getSelection(),d=a.createRange();d.setStart(b[0].node,b[0].offset);d.collapse(true);c.removeAllRanges();c.addRange(d);c.extend(b[1].node,b[1].offset)}function m(a){var b=CKEDITOR.dom.element.createFromHtml('<div data-cke-hidden-sel="1" data-cke-temp="1" style="'+(CKEDITOR.env.ie?"display:none":"position:fixed;top:0;left:-1000px")+'">&nbsp;</div>',
+a.document);a.fire("lockSnapshot");a.editable().append(b);var c=a.getSelection(1),d=a.createRange(),e=c.root.on("selectionchange",function(a){a.cancel()},null,null,0);d.setStartAt(b,CKEDITOR.POSITION_AFTER_START);d.setEndAt(b,CKEDITOR.POSITION_BEFORE_END);c.selectRanges([d]);e.removeListener();a.fire("unlockSnapshot");a._.hiddenSelectionContainer=b}function y(a){var b={37:1,39:1,8:1,46:1};return function(c){var d=c.data.getKeystroke();if(b[d]){var e=a.getSelection().getRanges(),f=e[0];if(e.length==
+1&&f.collapsed)if((d=f[d<38?"getPreviousEditableNode":"getNextEditableNode"]())&&d.type==CKEDITOR.NODE_ELEMENT&&d.getAttribute("contenteditable")=="false"){a.getSelection().fake(d);c.data.preventDefault();c.cancel()}}}}function s(a){for(var b=0;b<a.length;b++){var c=a[b];c.getCommonAncestor().isReadOnly()&&a.splice(b,1);if(!c.collapsed){if(c.startContainer.isReadOnly())for(var d=c.startContainer,e;d;){if((e=d.type==CKEDITOR.NODE_ELEMENT)&&d.is("body")||!d.isReadOnly())break;e&&d.getAttribute("contentEditable")==
+"false"&&c.setStartAfter(d);d=d.getParent()}d=c.startContainer;e=c.endContainer;var f=c.startOffset,h=c.endOffset,g=c.clone();d&&d.type==CKEDITOR.NODE_TEXT&&(f>=d.getLength()?g.setStartAfter(d):g.setStartBefore(d));e&&e.type==CKEDITOR.NODE_TEXT&&(h?g.setEndAfter(e):g.setEndBefore(e));d=new CKEDITOR.dom.walker(g);d.evaluator=function(d){if(d.type==CKEDITOR.NODE_ELEMENT&&d.isReadOnly()){var e=c.clone();c.setEndBefore(d);c.collapsed&&a.splice(b--,1);if(!(d.getPosition(g.endContainer)&CKEDITOR.POSITION_CONTAINS)){e.setStartAfter(d);
+e.collapsed||a.splice(b+1,0,e)}return true}return false};d.next()}}return a}var w,q,t=CKEDITOR.dom.walker.invisible(1),i=function(){function a(b){return function(a){var c=a.editor.createRange();c.moveToClosestEditablePosition(a.selected,b)&&a.editor.getSelection().selectRanges([c]);return false}}function b(a){return function(b){var c=b.editor,d=c.createRange(),e;if(!(e=d.moveToClosestEditablePosition(b.selected,a)))e=d.moveToClosestEditablePosition(b.selected,!a);e&&c.getSelection().selectRanges([d]);
+c.fire("saveSnapshot");b.selected.remove();if(!e){d.moveToElementEditablePosition(c.editable());c.getSelection().selectRanges([d])}c.fire("saveSnapshot");return false}}var c=a(),d=a(1);return{37:c,38:c,39:d,40:d,8:b(),46:b(1)}}();CKEDITOR.on("instanceCreated",function(b){function c(){var a=d.getSelection();a&&a.removeAllRanges()}var d=b.editor;d.on("contentDom",function(){function b(){z=new CKEDITOR.dom.selection(d.getSelection());z.lock()}function c(){l.removeListener("mouseup",c);i.removeListener("mouseup",
+c);var a=CKEDITOR.document.$.selection,b=a.createRange();a.type!="None"&&b.parentElement().ownerDocument==e.$&&b.select()}var e=d.document,l=CKEDITOR.document,g=d.editable(),p=e.getBody(),i=e.getDocumentElement(),v=g.isInline(),j,z;CKEDITOR.env.gecko&&g.attachListener(g,"focus",function(a){a.removeListener();if(j!==0)if((a=d.getSelection().getNative())&&a.isCollapsed&&a.anchorNode==g.$){a=d.createRange();a.moveToElementEditStart(g);a.select()}},null,null,-2);g.attachListener(g,CKEDITOR.env.webkit?
+"DOMFocusIn":"focus",function(){j&&CKEDITOR.env.webkit&&(j=d._.previousActive&&d._.previousActive.equals(e.getActive()));d.unlockSelection(j);j=0},null,null,-1);g.attachListener(g,"mousedown",function(){j=0});if(CKEDITOR.env.ie||v){A?g.attachListener(g,"beforedeactivate",b,null,null,-1):g.attachListener(d,"selectionCheck",b,null,null,-1);g.attachListener(g,CKEDITOR.env.webkit?"DOMFocusOut":"blur",function(){d.lockSelection(z);j=1},null,null,-1);g.attachListener(g,"mousedown",function(){j=0})}if(CKEDITOR.env.ie&&
+!v){var B;g.attachListener(g,"mousedown",function(a){if(a.data.$.button==2){a=d.document.getSelection();if(!a||a.getType()==CKEDITOR.SELECTION_NONE)B=d.window.getScrollPosition()}});g.attachListener(g,"mouseup",function(a){if(a.data.$.button==2&&B){d.document.$.documentElement.scrollLeft=B.x;d.document.$.documentElement.scrollTop=B.y}B=null});if(e.$.compatMode!="BackCompat"){if(CKEDITOR.env.ie7Compat||CKEDITOR.env.ie6Compat)i.on("mousedown",function(a){function b(a){a=a.data.$;if(d){var c=p.$.createTextRange();
+try{c.moveToPoint(a.clientX,a.clientY)}catch(e){}d.setEndPoint(f.compareEndPoints("StartToStart",c)<0?"EndToEnd":"StartToStart",c);d.select()}}function c(){i.removeListener("mousemove",b);l.removeListener("mouseup",c);i.removeListener("mouseup",c);d.select()}a=a.data;if(a.getTarget().is("html")&&a.$.y<i.$.clientHeight&&a.$.x<i.$.clientWidth){var d=p.$.createTextRange();try{d.moveToPoint(a.$.clientX,a.$.clientY)}catch(e){}var f=d.duplicate();i.on("mousemove",b);l.on("mouseup",c);i.on("mouseup",c)}});
+if(CKEDITOR.env.version>7&&CKEDITOR.env.version<11)i.on("mousedown",function(a){if(a.data.getTarget().is("html")){l.on("mouseup",c);i.on("mouseup",c)}})}}g.attachListener(g,"selectionchange",a,d);g.attachListener(g,"keyup",f,d);g.attachListener(g,CKEDITOR.env.webkit?"DOMFocusIn":"focus",function(){d.forceNextSelectionCheck();d.selectionChange(1)});if(v&&(CKEDITOR.env.webkit||CKEDITOR.env.gecko)){var x;g.attachListener(g,"mousedown",function(){x=1});g.attachListener(e.getDocumentElement(),"mouseup",
+function(){x&&f.call(d);x=0})}else g.attachListener(CKEDITOR.env.ie?g:e.getDocumentElement(),"mouseup",f,d);CKEDITOR.env.webkit&&g.attachListener(e,"keydown",function(a){switch(a.data.getKey()){case 13:case 33:case 34:case 35:case 36:case 37:case 39:case 8:case 45:case 46:h(g)}},null,null,-1);g.attachListener(g,"keydown",y(d),null,null,-1)});d.on("setData",function(){d.unlockSelection();CKEDITOR.env.webkit&&c()});d.on("contentDomUnload",function(){d.unlockSelection()});if(CKEDITOR.env.ie9Compat)d.on("beforeDestroy",
+c,null,null,9);d.on("dataReady",function(){delete d._.fakeSelection;delete d._.hiddenSelectionContainer;d.selectionChange(1)});d.on("loadSnapshot",function(){var a=CKEDITOR.dom.walker.nodeType(CKEDITOR.NODE_ELEMENT),b=d.editable().getLast(a);if(b&&b.hasAttribute("data-cke-hidden-sel")){b.remove();if(CKEDITOR.env.gecko)(a=d.editable().getFirst(a))&&(a.is("br")&&a.getAttribute("_moz_editor_bogus_node"))&&a.remove()}},null,null,100);d.on("key",function(a){if(d.mode=="wysiwyg"){var b=d.getSelection();
+if(b.isFake){var c=i[a.data.keyCode];if(c)return c({editor:d,selected:b.getSelectedElement(),selection:b,keyEvent:a})}}})});CKEDITOR.on("instanceReady",function(a){function b(){var a=e.editable();if(a)if(a=d(a)){var c=e.document.$.getSelection();if(c.type!="None"&&(c.anchorNode==a.$||c.focusNode==a.$))i=j(c);f=a.getText();a.setText(k(f))}}function c(){var a=e.editable();if(a)if(a=d(a)){a.setText(f);if(i){g(e.document.$,i);i=null}}}var e=a.editor,f,i;if(CKEDITOR.env.webkit){e.on("selectionChange",
+function(){var a=e.editable(),b=d(a);b&&(b.getCustomData("ready")?h(a):b.setCustomData("ready",1))},null,null,-1);e.on("beforeSetMode",function(){h(e.editable())},null,null,-1);e.on("beforeUndoImage",b);e.on("afterUndoImage",c);e.on("beforeGetData",b,null,null,0);e.on("getData",c)}});CKEDITOR.editor.prototype.selectionChange=function(b){(b?a:f).call(this)};CKEDITOR.editor.prototype.getSelection=function(a){if((this._.savedSelection||this._.fakeSelection)&&!a)return this._.savedSelection||this._.fakeSelection;
+return(a=this.editable())&&this.mode=="wysiwyg"?new CKEDITOR.dom.selection(a):null};CKEDITOR.editor.prototype.lockSelection=function(a){a=a||this.getSelection(1);if(a.getType()!=CKEDITOR.SELECTION_NONE){!a.isLocked&&a.lock();this._.savedSelection=a;return true}return false};CKEDITOR.editor.prototype.unlockSelection=function(a){var b=this._.savedSelection;if(b){b.unlock(a);delete this._.savedSelection;return true}return false};CKEDITOR.editor.prototype.forceNextSelectionCheck=function(){delete this._.selectionPreviousPath};
+CKEDITOR.dom.document.prototype.getSelection=function(){return new CKEDITOR.dom.selection(this)};CKEDITOR.dom.range.prototype.select=function(){var a=this.root instanceof CKEDITOR.editable?this.root.editor.getSelection():new CKEDITOR.dom.selection(this.root);a.selectRanges([this]);return a};CKEDITOR.SELECTION_NONE=1;CKEDITOR.SELECTION_TEXT=2;CKEDITOR.SELECTION_ELEMENT=3;var A=typeof window.getSelection!="function",u=1;CKEDITOR.dom.selection=function(a){if(a instanceof CKEDITOR.dom.selection)var b=
+a,a=a.root;var c=a instanceof CKEDITOR.dom.element;this.rev=b?b.rev:u++;this.document=a instanceof CKEDITOR.dom.document?a:a.getDocument();this.root=c?a:this.document.getBody();this.isLocked=0;this._={cache:{}};if(b){CKEDITOR.tools.extend(this._.cache,b._.cache);this.isFake=b.isFake;this.isLocked=b.isLocked;return this}var a=this.getNative(),d,e;if(a)if(a.getRangeAt)d=(e=a.rangeCount&&a.getRangeAt(0))&&new CKEDITOR.dom.node(e.commonAncestorContainer);else{try{e=a.createRange()}catch(f){}d=e&&CKEDITOR.dom.element.get(e.item&&
+e.item(0)||e.parentElement())}if(!d||!(d.type==CKEDITOR.NODE_ELEMENT||d.type==CKEDITOR.NODE_TEXT)||!this.root.equals(d)&&!this.root.contains(d)){this._.cache.type=CKEDITOR.SELECTION_NONE;this._.cache.startElement=null;this._.cache.selectedElement=null;this._.cache.selectedText="";this._.cache.ranges=new CKEDITOR.dom.rangeList}return this};var o={img:1,hr:1,li:1,table:1,tr:1,td:1,th:1,embed:1,object:1,ol:1,ul:1,a:1,input:1,form:1,select:1,textarea:1,button:1,fieldset:1,thead:1,tfoot:1};CKEDITOR.dom.selection.prototype=
+{getNative:function(){return this._.cache.nativeSel!==void 0?this._.cache.nativeSel:this._.cache.nativeSel=A?this.document.$.selection:this.document.getWindow().$.getSelection()},getType:A?function(){var a=this._.cache;if(a.type)return a.type;var b=CKEDITOR.SELECTION_NONE;try{var c=this.getNative(),d=c.type;if(d=="Text")b=CKEDITOR.SELECTION_TEXT;if(d=="Control")b=CKEDITOR.SELECTION_ELEMENT;if(c.createRange().parentElement())b=CKEDITOR.SELECTION_TEXT}catch(e){}return a.type=b}:function(){var a=this._.cache;
+if(a.type)return a.type;var b=CKEDITOR.SELECTION_TEXT,c=this.getNative();if(!c||!c.rangeCount)b=CKEDITOR.SELECTION_NONE;else if(c.rangeCount==1){var c=c.getRangeAt(0),d=c.startContainer;if(d==c.endContainer&&d.nodeType==1&&c.endOffset-c.startOffset==1&&o[d.childNodes[c.startOffset].nodeName.toLowerCase()])b=CKEDITOR.SELECTION_ELEMENT}return a.type=b},getRanges:function(){var a=A?function(){function a(b){return(new CKEDITOR.dom.node(b)).getIndex()}var b=function(b,c){b=b.duplicate();b.collapse(c);
+var d=b.parentElement();if(!d.hasChildNodes())return{container:d,offset:0};for(var e=d.children,f,g,h=b.duplicate(),v=0,l=e.length-1,i=-1,j,x;v<=l;){i=Math.floor((v+l)/2);f=e[i];h.moveToElementText(f);j=h.compareEndPoints("StartToStart",b);if(j>0)l=i-1;else if(j<0)v=i+1;else return{container:d,offset:a(f)}}if(i==-1||i==e.length-1&&j<0){h.moveToElementText(d);h.setEndPoint("StartToStart",b);h=h.text.replace(/(\r\n|\r)/g,"\n").length;e=d.childNodes;if(!h){f=e[e.length-1];return f.nodeType!=CKEDITOR.NODE_TEXT?
+{container:d,offset:e.length}:{container:f,offset:f.nodeValue.length}}for(d=e.length;h>0&&d>0;){g=e[--d];if(g.nodeType==CKEDITOR.NODE_TEXT){x=g;h=h-g.nodeValue.length}}return{container:x,offset:-h}}h.collapse(j>0?true:false);h.setEndPoint(j>0?"StartToStart":"EndToStart",b);h=h.text.replace(/(\r\n|\r)/g,"\n").length;if(!h)return{container:d,offset:a(f)+(j>0?0:1)};for(;h>0;)try{g=f[j>0?"previousSibling":"nextSibling"];if(g.nodeType==CKEDITOR.NODE_TEXT){h=h-g.nodeValue.length;x=g}f=g}catch(m){return{container:d,
+offset:a(f)}}return{container:x,offset:j>0?-h:x.nodeValue.length+h}};return function(){var a=this.getNative(),c=a&&a.createRange(),d=this.getType();if(!a)return[];if(d==CKEDITOR.SELECTION_TEXT){a=new CKEDITOR.dom.range(this.root);d=b(c,true);a.setStart(new CKEDITOR.dom.node(d.container),d.offset);d=b(c);a.setEnd(new CKEDITOR.dom.node(d.container),d.offset);a.endContainer.getPosition(a.startContainer)&CKEDITOR.POSITION_PRECEDING&&a.endOffset<=a.startContainer.getIndex()&&a.collapse();return[a]}if(d==
+CKEDITOR.SELECTION_ELEMENT){for(var d=[],e=0;e<c.length;e++){for(var f=c.item(e),h=f.parentNode,g=0,a=new CKEDITOR.dom.range(this.root);g<h.childNodes.length&&h.childNodes[g]!=f;g++);a.setStart(new CKEDITOR.dom.node(h),g);a.setEnd(new CKEDITOR.dom.node(h),g+1);d.push(a)}return d}return[]}}():function(){var a=[],b,c=this.getNative();if(!c)return a;for(var d=0;d<c.rangeCount;d++){var e=c.getRangeAt(d);b=new CKEDITOR.dom.range(this.root);b.setStart(new CKEDITOR.dom.node(e.startContainer),e.startOffset);
+b.setEnd(new CKEDITOR.dom.node(e.endContainer),e.endOffset);a.push(b)}return a};return function(b){var c=this._.cache,d=c.ranges;if(!d)c.ranges=d=new CKEDITOR.dom.rangeList(a.call(this));return!b?d:s(new CKEDITOR.dom.rangeList(d.slice()))}}(),getStartElement:function(){var a=this._.cache;if(a.startElement!==void 0)return a.startElement;var b;switch(this.getType()){case CKEDITOR.SELECTION_ELEMENT:return this.getSelectedElement();case CKEDITOR.SELECTION_TEXT:var c=this.getRanges()[0];if(c){if(c.collapsed){b=
+c.startContainer;b.type!=CKEDITOR.NODE_ELEMENT&&(b=b.getParent())}else{for(c.optimize();;){b=c.startContainer;if(c.startOffset==(b.getChildCount?b.getChildCount():b.getLength())&&!b.isBlockBoundary())c.setStartAfter(b);else break}b=c.startContainer;if(b.type!=CKEDITOR.NODE_ELEMENT)return b.getParent();b=b.getChild(c.startOffset);if(!b||b.type!=CKEDITOR.NODE_ELEMENT)b=c.startContainer;else for(c=b.getFirst();c&&c.type==CKEDITOR.NODE_ELEMENT;){b=c;c=c.getFirst()}}b=b.$}}return a.startElement=b?new CKEDITOR.dom.element(b):
+null},getSelectedElement:function(){var a=this._.cache;if(a.selectedElement!==void 0)return a.selectedElement;var b=this,c=CKEDITOR.tools.tryThese(function(){return b.getNative().createRange().item(0)},function(){for(var a=b.getRanges()[0].clone(),c,d,e=2;e&&(!(c=a.getEnclosedNode())||!(c.type==CKEDITOR.NODE_ELEMENT&&o[c.getName()]&&(d=c)));e--)a.shrink(CKEDITOR.SHRINK_ELEMENT);return d&&d.$});return a.selectedElement=c?new CKEDITOR.dom.element(c):null},getSelectedText:function(){var a=this._.cache;
+if(a.selectedText!==void 0)return a.selectedText;var b=this.getNative(),b=A?b.type=="Control"?"":b.createRange().text:b.toString();return a.selectedText=b},lock:function(){this.getRanges();this.getStartElement();this.getSelectedElement();this.getSelectedText();this._.cache.nativeSel=null;this.isLocked=1},unlock:function(a){if(this.isLocked){if(a)var b=this.getSelectedElement(),c=!b&&this.getRanges(),d=this.isFake;this.isLocked=0;this.reset();if(a)(a=b||c[0]&&c[0].getCommonAncestor())&&a.getAscendant("body",
+1)&&(d?this.fake(b):b?this.selectElement(b):this.selectRanges(c))}},reset:function(){this._.cache={};this.isFake=0;var a=this.root.editor;if(a&&a._.fakeSelection&&this.rev==a._.fakeSelection.rev){delete a._.fakeSelection;var b=a._.hiddenSelectionContainer;if(b){var c=a.checkDirty();a.fire("lockSnapshot");b.remove();a.fire("unlockSnapshot");!c&&a.resetDirty()}delete a._.hiddenSelectionContainer}this.rev=u++},selectElement:function(a){var b=new CKEDITOR.dom.range(this.root);b.setStartBefore(a);b.setEndAfter(a);
+this.selectRanges([b])},selectRanges:function(a){var b=this.root.editor,b=b&&b._.hiddenSelectionContainer;this.reset();if(b)for(var b=this.root,c,d=0;d<a.length;++d){c=a[d];if(c.endContainer.equals(b))c.endOffset=Math.min(c.endOffset,b.getChildCount())}if(a.length)if(this.isLocked){var f=CKEDITOR.document.getActive();this.unlock();this.selectRanges(a);this.lock();f&&!f.equals(this.root)&&f.focus()}else{var g;a:{var i,j;if(a.length==1&&!(j=a[0]).collapsed&&(g=j.getEnclosedNode())&&g.type==CKEDITOR.NODE_ELEMENT){j=
+j.clone();j.shrink(CKEDITOR.SHRINK_ELEMENT,true);if((i=j.getEnclosedNode())&&i.type==CKEDITOR.NODE_ELEMENT)g=i;if(g.getAttribute("contenteditable")=="false")break a}g=void 0}if(g)this.fake(g);else{if(A){j=CKEDITOR.dom.walker.whitespaces(true);i=/\ufeff|\u00a0/;b={table:1,tbody:1,tr:1};if(a.length>1){g=a[a.length-1];a[0].setEnd(g.endContainer,g.endOffset)}g=a[0];var a=g.collapsed,m,k,v;if((c=g.getEnclosedNode())&&c.type==CKEDITOR.NODE_ELEMENT&&c.getName()in o&&(!c.is("a")||!c.getText()))try{v=c.$.createControlRange();
+v.addElement(c.$);v.select();return}catch(q){}if(g.startContainer.type==CKEDITOR.NODE_ELEMENT&&g.startContainer.getName()in b||g.endContainer.type==CKEDITOR.NODE_ELEMENT&&g.endContainer.getName()in b){g.shrink(CKEDITOR.NODE_ELEMENT,true);a=g.collapsed}v=g.createBookmark();b=v.startNode;if(!a)f=v.endNode;v=g.document.$.body.createTextRange();v.moveToElementText(b.$);v.moveStart("character",1);if(f){i=g.document.$.body.createTextRange();i.moveToElementText(f.$);v.setEndPoint("EndToEnd",i);v.moveEnd("character",
+-1)}else{m=b.getNext(j);k=b.hasAscendant("pre");m=!(m&&m.getText&&m.getText().match(i))&&(k||!b.hasPrevious()||b.getPrevious().is&&b.getPrevious().is("br"));k=g.document.createElement("span");k.setHtml("&#65279;");k.insertBefore(b);m&&g.document.createText("").insertBefore(b)}g.setStartBefore(b);b.remove();if(a){if(m){v.moveStart("character",-1);v.select();g.document.$.selection.clear()}else v.select();g.moveToPosition(k,CKEDITOR.POSITION_BEFORE_START);k.remove()}else{g.setEndBefore(f);f.remove();
+v.select()}}else{f=this.getNative();if(!f)return;this.removeAllRanges();for(v=0;v<a.length;v++){if(v<a.length-1){m=a[v];k=a[v+1];i=m.clone();i.setStart(m.endContainer,m.endOffset);i.setEnd(k.startContainer,k.startOffset);if(!i.collapsed){i.shrink(CKEDITOR.NODE_ELEMENT,true);g=i.getCommonAncestor();i=i.getEnclosedNode();if(g.isReadOnly()||i&&i.isReadOnly()){k.setStart(m.startContainer,m.startOffset);a.splice(v--,1);continue}}}g=a[v];k=this.document.$.createRange();if(g.collapsed&&CKEDITOR.env.webkit&&
+e(g)){m=this.root;h(m,false);i=m.getDocument().createText("​");m.setCustomData("cke-fillingChar",i);g.insertNode(i);if((m=i.getNext())&&!i.getPrevious()&&m.type==CKEDITOR.NODE_ELEMENT&&m.getName()=="br"){h(this.root);g.moveToPosition(m,CKEDITOR.POSITION_BEFORE_START)}else g.moveToPosition(i,CKEDITOR.POSITION_AFTER_END)}k.setStart(g.startContainer.$,g.startOffset);try{k.setEnd(g.endContainer.$,g.endOffset)}catch(z){if(z.toString().indexOf("NS_ERROR_ILLEGAL_VALUE")>=0){g.collapse(1);k.setEnd(g.endContainer.$,
+g.endOffset)}else throw z;}f.addRange(k)}}this.reset();this.root.fire("selectionchange")}}},fake:function(a){var b=this.root.editor;this.reset();m(b);var c=this._.cache,d=new CKEDITOR.dom.range(this.root);d.setStartBefore(a);d.setEndAfter(a);c.ranges=new CKEDITOR.dom.rangeList(d);c.selectedElement=c.startElement=a;c.type=CKEDITOR.SELECTION_ELEMENT;c.selectedText=c.nativeSel=null;this.isFake=1;this.rev=u++;b._.fakeSelection=this;this.root.fire("selectionchange")},isHidden:function(){var a=this.getCommonAncestor();
+a&&a.type==CKEDITOR.NODE_TEXT&&(a=a.getParent());return!(!a||!a.data("cke-hidden-sel"))},createBookmarks:function(a){a=this.getRanges().createBookmarks(a);this.isFake&&(a.isFake=1);return a},createBookmarks2:function(a){a=this.getRanges().createBookmarks2(a);this.isFake&&(a.isFake=1);return a},selectBookmarks:function(a){for(var b=[],c=0;c<a.length;c++){var d=new CKEDITOR.dom.range(this.root);d.moveToBookmark(a[c]);b.push(d)}a.isFake?this.fake(b[0].getEnclosedNode()):this.selectRanges(b);return this},
+getCommonAncestor:function(){var a=this.getRanges();return!a.length?null:a[0].startContainer.getCommonAncestor(a[a.length-1].endContainer)},scrollIntoView:function(){this.type!=CKEDITOR.SELECTION_NONE&&this.getRanges()[0].scrollIntoView()},removeAllRanges:function(){if(this.getType()!=CKEDITOR.SELECTION_NONE){var a=this.getNative();try{a&&a[A?"empty":"removeAllRanges"]()}catch(b){}this.reset()}}}})();"use strict";CKEDITOR.STYLE_BLOCK=1;CKEDITOR.STYLE_INLINE=2;CKEDITOR.STYLE_OBJECT=3;
+(function(){function a(a,b){for(var c,d;a=a.getParent();){if(a.equals(b))break;if(a.getAttribute("data-nostyle"))c=a;else if(!d){var e=a.getAttribute("contentEditable");e=="false"?c=a:e=="true"&&(d=1)}}return c}function f(b){var d=b.document;if(b.collapsed){d=i(this,d);b.insertNode(d);b.moveToPosition(d,CKEDITOR.POSITION_BEFORE_END)}else{var e=this.element,g=this._.definition,h,j=g.ignoreReadonly,m=j||g.includeReadonly;m==null&&(m=b.root.getCustomData("cke_includeReadonly"));var k=CKEDITOR.dtd[e];
+if(!k){h=true;k=CKEDITOR.dtd.span}b.enlarge(CKEDITOR.ENLARGE_INLINE,1);b.trim();var l=b.createBookmark(),q=l.startNode,o=l.endNode,n=q,p;if(!j){var s=b.getCommonAncestor(),j=a(q,s),s=a(o,s);j&&(n=j.getNextSourceNode(true));s&&(o=s)}for(n.getPosition(o)==CKEDITOR.POSITION_FOLLOWING&&(n=0);n;){j=false;if(n.equals(o)){n=null;j=true}else{var r=n.type==CKEDITOR.NODE_ELEMENT?n.getName():null,s=r&&n.getAttribute("contentEditable")=="false",t=r&&n.getAttribute("data-nostyle");if(r&&n.data("cke-bookmark")){n=
+n.getNextSourceNode(true);continue}if(s&&m&&CKEDITOR.dtd.$block[r])for(var y=n,u=c(y),A=void 0,C=u.length,F=0,y=C&&new CKEDITOR.dom.range(y.getDocument());F<C;++F){var A=u[F],P=CKEDITOR.filter.instances[A.data("cke-filter")];if(P?P.check(this):1){y.selectNodeContents(A);f.call(this,y)}}u=r?!k[r]||t?0:s&&!m?0:(n.getPosition(o)|K)==K&&(!g.childRule||g.childRule(n)):1;if(u)if((u=n.getParent())&&((u.getDtd()||CKEDITOR.dtd.span)[e]||h)&&(!g.parentRule||g.parentRule(u))){if(!p&&(!r||!CKEDITOR.dtd.$removeEmpty[r]||
+(n.getPosition(o)|K)==K)){p=b.clone();p.setStartBefore(n)}r=n.type;if(r==CKEDITOR.NODE_TEXT||s||r==CKEDITOR.NODE_ELEMENT&&!n.getChildCount()){for(var r=n,U;(j=!r.getNext(L))&&(U=r.getParent(),k[U.getName()])&&(U.getPosition(q)|I)==I&&(!g.childRule||g.childRule(U));)r=U;p.setEndAfter(r)}}else j=true;else j=true;n=n.getNextSourceNode(t||s)}if(j&&p&&!p.collapsed){for(var j=i(this,d),s=j.hasAttributes(),t=p.getCommonAncestor(),r={},u={},A={},C={},N,R,X;j&&t;){if(t.getName()==e){for(N in g.attributes)if(!C[N]&&
+(X=t.getAttribute(R)))j.getAttribute(N)==X?u[N]=1:C[N]=1;for(R in g.styles)if(!A[R]&&(X=t.getStyle(R)))j.getStyle(R)==X?r[R]=1:A[R]=1}t=t.getParent()}for(N in u)j.removeAttribute(N);for(R in r)j.removeStyle(R);s&&!j.hasAttributes()&&(j=null);if(j){p.extractContents().appendTo(j);p.insertNode(j);w.call(this,j);j.mergeSiblings();CKEDITOR.env.ie||j.$.normalize()}else{j=new CKEDITOR.dom.element("span");p.extractContents().appendTo(j);p.insertNode(j);w.call(this,j);j.remove(true)}p=null}}b.moveToBookmark(l);
+b.shrink(CKEDITOR.SHRINK_TEXT);b.shrink(CKEDITOR.NODE_ELEMENT,true)}}function b(a){function b(){for(var a=new CKEDITOR.dom.elementPath(d.getParent()),c=new CKEDITOR.dom.elementPath(j.getParent()),e=null,f=null,g=0;g<a.elements.length;g++){var h=a.elements[g];if(h==a.block||h==a.blockLimit)break;m.checkElementRemovable(h,true)&&(e=h)}for(g=0;g<c.elements.length;g++){h=c.elements[g];if(h==c.block||h==c.blockLimit)break;m.checkElementRemovable(h,true)&&(f=h)}f&&j.breakParent(f);e&&d.breakParent(e)}a.enlarge(CKEDITOR.ENLARGE_INLINE,
+1);var c=a.createBookmark(),d=c.startNode;if(a.collapsed){for(var e=new CKEDITOR.dom.elementPath(d.getParent(),a.root),f,g=0,h;g<e.elements.length&&(h=e.elements[g]);g++){if(h==e.block||h==e.blockLimit)break;if(this.checkElementRemovable(h)){var i;if(a.collapsed&&(a.checkBoundaryOfElement(h,CKEDITOR.END)||(i=a.checkBoundaryOfElement(h,CKEDITOR.START)))){f=h;f.match=i?"start":"end"}else{h.mergeSiblings();h.is(this.element)?s.call(this,h):q(h,o(this)[h.getName()])}}}if(f){h=d;for(g=0;;g++){i=e.elements[g];
+if(i.equals(f))break;else if(i.match)continue;else i=i.clone();i.append(h);h=i}h[f.match=="start"?"insertBefore":"insertAfter"](f)}}else{var j=c.endNode,m=this;b();for(e=d;!e.equals(j);){f=e.getNextSourceNode();if(e.type==CKEDITOR.NODE_ELEMENT&&this.checkElementRemovable(e)){e.getName()==this.element?s.call(this,e):q(e,o(this)[e.getName()]);if(f.type==CKEDITOR.NODE_ELEMENT&&f.contains(d)){b();f=d.getNext()}}e=f}}a.moveToBookmark(c);a.shrink(CKEDITOR.NODE_ELEMENT,true)}function c(a){var b=[];a.forEach(function(a){if(a.getAttribute("contenteditable")==
+"true"){b.push(a);return false}},CKEDITOR.NODE_ELEMENT,true);return b}function e(a){var b=a.getEnclosedNode()||a.getCommonAncestor(false,true);(a=(new CKEDITOR.dom.elementPath(b,a.root)).contains(this.element,1))&&!a.isReadOnly()&&A(a,this)}function d(a){var b=a.getCommonAncestor(true,true);if(a=(new CKEDITOR.dom.elementPath(b,a.root)).contains(this.element,1)){var b=this._.definition,c=b.attributes;if(c)for(var d in c)a.removeAttribute(d,c[d]);if(b.styles)for(var e in b.styles)b.styles.hasOwnProperty(e)&&
+a.removeStyle(e)}}function h(a){var b=a.createBookmark(true),c=a.createIterator();c.enforceRealBlocks=true;if(this._.enterMode)c.enlargeBr=this._.enterMode!=CKEDITOR.ENTER_BR;for(var d,e=a.document,f;d=c.getNextParagraph();)if(!d.isReadOnly()&&(c.activeFilter?c.activeFilter.check(this):1)){f=i(this,e,d);j(d,f)}a.moveToBookmark(b)}function k(a){var b=a.createBookmark(1),c=a.createIterator();c.enforceRealBlocks=true;c.enlargeBr=this._.enterMode!=CKEDITOR.ENTER_BR;for(var d,e;d=c.getNextParagraph();)if(this.checkElementRemovable(d))if(d.is("pre")){(e=
+this._.enterMode==CKEDITOR.ENTER_BR?null:a.document.createElement(this._.enterMode==CKEDITOR.ENTER_P?"p":"div"))&&d.copyAttributes(e);j(d,e)}else s.call(this,d);a.moveToBookmark(b)}function j(a,b){var c=!b;if(c){b=a.getDocument().createElement("div");a.copyAttributes(b)}var d=b&&b.is("pre"),e=a.is("pre"),f=!d&&e;if(d&&!e){e=b;(f=a.getBogus())&&f.remove();f=a.getHtml();f=m(f,/(?:^[ \t\n\r]+)|(?:[ \t\n\r]+$)/g,"");f=f.replace(/[ \t\r\n]*(<br[^>]*>)[ \t\r\n]*/gi,"$1");f=f.replace(/([ \t\n\r]+|&nbsp;)/g,
+" ");f=f.replace(/<br\b[^>]*>/gi,"\n");if(CKEDITOR.env.ie){var h=a.getDocument().createElement("div");h.append(e);e.$.outerHTML="<pre>"+f+"</pre>";e.copyAttributes(h.getFirst());e=h.getFirst().remove()}else e.setHtml(f);b=e}else f?b=y(c?[a.getHtml()]:g(a),b):a.moveChildren(b);b.replace(a);if(d){var c=b,i;if((i=c.getPrevious(F))&&i.type==CKEDITOR.NODE_ELEMENT&&i.is("pre")){d=m(i.getHtml(),/\n$/,"")+"\n\n"+m(c.getHtml(),/^\n/,"");CKEDITOR.env.ie?c.$.outerHTML="<pre>"+d+"</pre>":c.setHtml(d);i.remove()}}else c&&
+t(b)}function g(a){var b=[];m(a.getOuterHtml(),/(\S\s*)\n(?:\s|(<span[^>]+data-cke-bookmark.*?\/span>))*\n(?!$)/gi,function(a,b,c){return b+"</pre>"+c+"<pre>"}).replace(/<pre\b.*?>([\s\S]*?)<\/pre>/gi,function(a,c){b.push(c)});return b}function m(a,b,c){var d="",e="",a=a.replace(/(^<span[^>]+data-cke-bookmark.*?\/span>)|(<span[^>]+data-cke-bookmark.*?\/span>$)/gi,function(a,b,c){b&&(d=b);c&&(e=c);return""});return d+a.replace(b,c)+e}function y(a,b){var c;a.length>1&&(c=new CKEDITOR.dom.documentFragment(b.getDocument()));
+for(var d=0;d<a.length;d++){var e=a[d],e=e.replace(/(\r\n|\r)/g,"\n"),e=m(e,/^[ \t]*\n/,""),e=m(e,/\n$/,""),e=m(e,/^[ \t]+|[ \t]+$/g,function(a,b){return a.length==1?"&nbsp;":b?" "+CKEDITOR.tools.repeat("&nbsp;",a.length-1):CKEDITOR.tools.repeat("&nbsp;",a.length-1)+" "}),e=e.replace(/\n/g,"<br>"),e=e.replace(/[ \t]{2,}/g,function(a){return CKEDITOR.tools.repeat("&nbsp;",a.length-1)+" "});if(c){var f=b.clone();f.setHtml(e);c.append(f)}else b.setHtml(e)}return c||b}function s(a,b){var c=this._.definition,
+d=c.attributes,c=c.styles,e=o(this)[a.getName()],f=CKEDITOR.tools.isEmpty(d)&&CKEDITOR.tools.isEmpty(c),g;for(g in d)if(!((g=="class"||this._.definition.fullMatch)&&a.getAttribute(g)!=l(g,d[g]))&&!(b&&g.slice(0,5)=="data-")){f=a.hasAttribute(g);a.removeAttribute(g)}for(var h in c)if(!(this._.definition.fullMatch&&a.getStyle(h)!=l(h,c[h],true))){f=f||!!a.getStyle(h);a.removeStyle(h)}q(a,e,r[a.getName()]);f&&(this._.definition.alwaysRemoveElement?t(a,1):!CKEDITOR.dtd.$block[a.getName()]||this._.enterMode==
+CKEDITOR.ENTER_BR&&!a.hasAttributes()?t(a):a.renameNode(this._.enterMode==CKEDITOR.ENTER_P?"p":"div"))}function w(a){for(var b=o(this),c=a.getElementsByTag(this.element),d,e=c.count();--e>=0;){d=c.getItem(e);d.isReadOnly()||s.call(this,d,true)}for(var f in b)if(f!=this.element){c=a.getElementsByTag(f);for(e=c.count()-1;e>=0;e--){d=c.getItem(e);d.isReadOnly()||q(d,b[f])}}}function q(a,b,c){if(b=b&&b.attributes)for(var d=0;d<b.length;d++){var e=b[d][0],f;if(f=a.getAttribute(e)){var g=b[d][1];(g===null||
+g.test&&g.test(f)||typeof g=="string"&&f==g)&&a.removeAttribute(e)}}c||t(a)}function t(a,b){if(!a.hasAttributes()||b)if(CKEDITOR.dtd.$block[a.getName()]){var c=a.getPrevious(F),d=a.getNext(F);c&&(c.type==CKEDITOR.NODE_TEXT||!c.isBlockBoundary({br:1}))&&a.append("br",1);d&&(d.type==CKEDITOR.NODE_TEXT||!d.isBlockBoundary({br:1}))&&a.append("br");a.remove(true)}else{c=a.getFirst();d=a.getLast();a.remove(true);if(c){c.type==CKEDITOR.NODE_ELEMENT&&c.mergeSiblings();d&&(!c.equals(d)&&d.type==CKEDITOR.NODE_ELEMENT)&&
+d.mergeSiblings()}}}function i(a,b,c){var d;d=a.element;d=="*"&&(d="span");d=new CKEDITOR.dom.element(d,b);c&&c.copyAttributes(d);d=A(d,a);b.getCustomData("doc_processing_style")&&d.hasAttribute("id")?d.removeAttribute("id"):b.setCustomData("doc_processing_style",1);return d}function A(a,b){var c=b._.definition,d=c.attributes,c=CKEDITOR.style.getStyleText(c);if(d)for(var e in d)a.setAttribute(e,d[e]);c&&a.setAttribute("style",c);return a}function u(a,b){for(var c in a)a[c]=a[c].replace(C,function(a,
+c){return b[c]})}function o(a){if(a._.overrides)return a._.overrides;var b=a._.overrides={},c=a._.definition.overrides;if(c){CKEDITOR.tools.isArray(c)||(c=[c]);for(var d=0;d<c.length;d++){var e=c[d],f,g;if(typeof e=="string")f=e.toLowerCase();else{f=e.element?e.element.toLowerCase():a.element;g=e.attributes}e=b[f]||(b[f]={});if(g){var e=e.attributes=e.attributes||[],h;for(h in g)e.push([h.toLowerCase(),g[h]])}}}return b}function l(a,b,c){var d=new CKEDITOR.dom.element("span");d[c?"setStyle":"setAttribute"](a,
+b);return d[c?"getStyle":"getAttribute"](a)}function p(a,b,c){for(var d=a.document,e=a.getRanges(),b=b?this.removeFromRange:this.applyToRange,f,g=e.createIterator();f=g.getNextRange();)b.call(this,f,c);a.selectRanges(e);d.removeCustomData("doc_processing_style")}var r={address:1,div:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,p:1,pre:1,section:1,header:1,footer:1,nav:1,article:1,aside:1,figure:1,dialog:1,hgroup:1,time:1,meter:1,menu:1,command:1,keygen:1,output:1,progress:1,details:1,datagrid:1,datalist:1},n=
+{a:1,blockquote:1,embed:1,hr:1,img:1,li:1,object:1,ol:1,table:1,td:1,tr:1,th:1,ul:1,dl:1,dt:1,dd:1,form:1,audio:1,video:1},P=/\s*(?:;\s*|$)/,C=/#\((.+?)\)/g,L=CKEDITOR.dom.walker.bookmark(0,1),F=CKEDITOR.dom.walker.whitespaces(1);CKEDITOR.style=function(a,b){if(typeof a.type=="string")return new CKEDITOR.style.customHandlers[a.type](a);var c=a.attributes;if(c&&c.style){a.styles=CKEDITOR.tools.extend({},a.styles,CKEDITOR.tools.parseCssText(c.style));delete c.style}if(b){a=CKEDITOR.tools.clone(a);u(a.attributes,
+b);u(a.styles,b)}c=this.element=a.element?typeof a.element=="string"?a.element.toLowerCase():a.element:"*";this.type=a.type||(r[c]?CKEDITOR.STYLE_BLOCK:n[c]?CKEDITOR.STYLE_OBJECT:CKEDITOR.STYLE_INLINE);if(typeof this.element=="object")this.type=CKEDITOR.STYLE_OBJECT;this._={definition:a}};CKEDITOR.style.prototype={apply:function(a){if(a instanceof CKEDITOR.dom.document)return p.call(this,a.getSelection());if(this.checkApplicable(a.elementPath(),a)){var b=this._.enterMode;if(!b)this._.enterMode=a.activeEnterMode;
+p.call(this,a.getSelection(),0,a);this._.enterMode=b}},remove:function(a){if(a instanceof CKEDITOR.dom.document)return p.call(this,a.getSelection(),1);if(this.checkApplicable(a.elementPath(),a)){var b=this._.enterMode;if(!b)this._.enterMode=a.activeEnterMode;p.call(this,a.getSelection(),1,a);this._.enterMode=b}},applyToRange:function(a){this.applyToRange=this.type==CKEDITOR.STYLE_INLINE?f:this.type==CKEDITOR.STYLE_BLOCK?h:this.type==CKEDITOR.STYLE_OBJECT?e:null;return this.applyToRange(a)},removeFromRange:function(a){this.removeFromRange=
+this.type==CKEDITOR.STYLE_INLINE?b:this.type==CKEDITOR.STYLE_BLOCK?k:this.type==CKEDITOR.STYLE_OBJECT?d:null;return this.removeFromRange(a)},applyToObject:function(a){A(a,this)},checkActive:function(a,b){switch(this.type){case CKEDITOR.STYLE_BLOCK:return this.checkElementRemovable(a.block||a.blockLimit,true,b);case CKEDITOR.STYLE_OBJECT:case CKEDITOR.STYLE_INLINE:for(var c=a.elements,d=0,e;d<c.length;d++){e=c[d];if(!(this.type==CKEDITOR.STYLE_INLINE&&(e==a.block||e==a.blockLimit))){if(this.type==
+CKEDITOR.STYLE_OBJECT){var f=e.getName();if(!(typeof this.element=="string"?f==this.element:f in this.element))continue}if(this.checkElementRemovable(e,true,b))return true}}}return false},checkApplicable:function(a,b,c){b&&b instanceof CKEDITOR.filter&&(c=b);if(c&&!c.check(this))return false;switch(this.type){case CKEDITOR.STYLE_OBJECT:return!!a.contains(this.element);case CKEDITOR.STYLE_BLOCK:return!!a.blockLimit.getDtd()[this.element]}return true},checkElementMatch:function(a,b){var c=this._.definition;
+if(!a||!c.ignoreReadonly&&a.isReadOnly())return false;var d=a.getName();if(typeof this.element=="string"?d==this.element:d in this.element){if(!b&&!a.hasAttributes())return true;if(d=c._AC)c=d;else{var d={},e=0,f=c.attributes;if(f)for(var g in f){e++;d[g]=f[g]}if(g=CKEDITOR.style.getStyleText(c)){d.style||e++;d.style=g}d._length=e;c=c._AC=d}if(c._length){for(var h in c)if(h!="_length"){e=a.getAttribute(h)||"";if(h=="style")a:{d=c[h];typeof d=="string"&&(d=CKEDITOR.tools.parseCssText(d));typeof e==
+"string"&&(e=CKEDITOR.tools.parseCssText(e,true));g=void 0;for(g in d)if(!(g in e&&(e[g]==d[g]||d[g]=="inherit"||e[g]=="inherit"))){d=false;break a}d=true}else d=c[h]==e;if(d){if(!b)return true}else if(b)return false}if(b)return true}else return true}return false},checkElementRemovable:function(a,b,c){if(this.checkElementMatch(a,b,c))return true;if(b=o(this)[a.getName()]){var d;if(!(b=b.attributes))return true;for(c=0;c<b.length;c++){d=b[c][0];if(d=a.getAttribute(d)){var e=b[c][1];if(e===null)return true;
+if(typeof e=="string"){if(d==e)return true}else if(e.test(d))return true}}}return false},buildPreview:function(a){var b=this._.definition,c=[],d=b.element;d=="bdo"&&(d="span");var c=["<",d],e=b.attributes;if(e)for(var f in e)c.push(" ",f,'="',e[f],'"');(e=CKEDITOR.style.getStyleText(b))&&c.push(' style="',e,'"');c.push(">",a||b.name,"</",d,">");return c.join("")},getDefinition:function(){return this._.definition}};CKEDITOR.style.getStyleText=function(a){var b=a._ST;if(b)return b;var b=a.styles,c=
+a.attributes&&a.attributes.style||"",d="";c.length&&(c=c.replace(P,";"));for(var e in b){var f=b[e],g=(e+":"+f).replace(P,";");f=="inherit"?d=d+g:c=c+g}c.length&&(c=CKEDITOR.tools.normalizeCssText(c,true));return a._ST=c+d};CKEDITOR.style.customHandlers={};CKEDITOR.style.addCustomHandler=function(a){var b=function(a){this._={definition:a};this.setup&&this.setup(a)};b.prototype=CKEDITOR.tools.extend(CKEDITOR.tools.prototypedCopy(CKEDITOR.style.prototype),{assignedTo:CKEDITOR.STYLE_OBJECT},a,true);
+return this.customHandlers[a.type]=b};var K=CKEDITOR.POSITION_PRECEDING|CKEDITOR.POSITION_IDENTICAL|CKEDITOR.POSITION_IS_CONTAINED,I=CKEDITOR.POSITION_FOLLOWING|CKEDITOR.POSITION_IDENTICAL|CKEDITOR.POSITION_IS_CONTAINED})();CKEDITOR.styleCommand=function(a,f){this.requiredContent=this.allowedContent=this.style=a;CKEDITOR.tools.extend(this,f,true)};
+CKEDITOR.styleCommand.prototype.exec=function(a){a.focus();this.state==CKEDITOR.TRISTATE_OFF?a.applyStyle(this.style):this.state==CKEDITOR.TRISTATE_ON&&a.removeStyle(this.style)};CKEDITOR.stylesSet=new CKEDITOR.resourceManager("","stylesSet");CKEDITOR.addStylesSet=CKEDITOR.tools.bind(CKEDITOR.stylesSet.add,CKEDITOR.stylesSet);CKEDITOR.loadStylesSet=function(a,f,b){CKEDITOR.stylesSet.addExternal(a,f,"");CKEDITOR.stylesSet.load(a,b)};
+CKEDITOR.tools.extend(CKEDITOR.editor.prototype,{attachStyleStateChange:function(a,f){var b=this._.styleStateChangeCallbacks;if(!b){b=this._.styleStateChangeCallbacks=[];this.on("selectionChange",function(a){for(var e=0;e<b.length;e++){var d=b[e],f=d.style.checkActive(a.data.path,this)?CKEDITOR.TRISTATE_ON:CKEDITOR.TRISTATE_OFF;d.fn.call(this,f)}})}b.push({style:a,fn:f})},applyStyle:function(a){a.apply(this)},removeStyle:function(a){a.remove(this)},getStylesSet:function(a){if(this._.stylesDefinitions)a(this._.stylesDefinitions);
+else{var f=this,b=f.config.stylesCombo_stylesSet||f.config.stylesSet;if(b===false)a(null);else if(b instanceof Array){f._.stylesDefinitions=b;a(b)}else{b||(b="default");var b=b.split(":"),c=b[0];CKEDITOR.stylesSet.addExternal(c,b[1]?b.slice(1).join(":"):CKEDITOR.getUrl("styles.js"),"");CKEDITOR.stylesSet.load(c,function(b){f._.stylesDefinitions=b[c];a(f._.stylesDefinitions)})}}}});
+CKEDITOR.dom.comment=function(a,f){typeof a=="string"&&(a=(f?f.$:document).createComment(a));CKEDITOR.dom.domObject.call(this,a)};CKEDITOR.dom.comment.prototype=new CKEDITOR.dom.node;CKEDITOR.tools.extend(CKEDITOR.dom.comment.prototype,{type:CKEDITOR.NODE_COMMENT,getOuterHtml:function(){return"<\!--"+this.$.nodeValue+"--\>"}});"use strict";
+(function(){var a={},f={},b;for(b in CKEDITOR.dtd.$blockLimit)b in CKEDITOR.dtd.$list||(a[b]=1);for(b in CKEDITOR.dtd.$block)b in CKEDITOR.dtd.$blockLimit||b in CKEDITOR.dtd.$empty||(f[b]=1);CKEDITOR.dom.elementPath=function(b,e){var d=null,h=null,k=[],j=b,g,e=e||b.getDocument().getBody();do if(j.type==CKEDITOR.NODE_ELEMENT){k.push(j);if(!this.lastElement){this.lastElement=j;if(j.is(CKEDITOR.dtd.$object)||j.getAttribute("contenteditable")=="false")continue}if(j.equals(e))break;if(!h){g=j.getName();
+j.getAttribute("contenteditable")=="true"?h=j:!d&&f[g]&&(d=j);if(a[g]){var m;if(m=!d){if(g=g=="div"){a:{g=j.getChildren();m=0;for(var y=g.count();m<y;m++){var s=g.getItem(m);if(s.type==CKEDITOR.NODE_ELEMENT&&CKEDITOR.dtd.$block[s.getName()]){g=true;break a}}g=false}g=!g}m=g}m?d=j:h=j}}}while(j=j.getParent());h||(h=e);this.block=d;this.blockLimit=h;this.root=e;this.elements=k}})();
+CKEDITOR.dom.elementPath.prototype={compare:function(a){var f=this.elements,a=a&&a.elements;if(!a||f.length!=a.length)return false;for(var b=0;b<f.length;b++)if(!f[b].equals(a[b]))return false;return true},contains:function(a,f,b){var c;typeof a=="string"&&(c=function(b){return b.getName()==a});a instanceof CKEDITOR.dom.element?c=function(b){return b.equals(a)}:CKEDITOR.tools.isArray(a)?c=function(b){return CKEDITOR.tools.indexOf(a,b.getName())>-1}:typeof a=="function"?c=a:typeof a=="object"&&(c=
+function(b){return b.getName()in a});var e=this.elements,d=e.length;f&&d--;if(b){e=Array.prototype.slice.call(e,0);e.reverse()}for(f=0;f<d;f++)if(c(e[f]))return e[f];return null},isContextFor:function(a){var f;if(a in CKEDITOR.dtd.$block){f=this.contains(CKEDITOR.dtd.$intermediate)||this.root.equals(this.block)&&this.block||this.blockLimit;return!!f.getDtd()[a]}return true},direction:function(){return(this.block||this.blockLimit||this.root).getDirection(1)}};
+CKEDITOR.dom.text=function(a,f){typeof a=="string"&&(a=(f?f.$:document).createTextNode(a));this.$=a};CKEDITOR.dom.text.prototype=new CKEDITOR.dom.node;
+CKEDITOR.tools.extend(CKEDITOR.dom.text.prototype,{type:CKEDITOR.NODE_TEXT,getLength:function(){return this.$.nodeValue.length},getText:function(){return this.$.nodeValue},setText:function(a){this.$.nodeValue=a},split:function(a){var f=this.$.parentNode,b=f.childNodes.length,c=this.getLength(),e=this.getDocument(),d=new CKEDITOR.dom.text(this.$.splitText(a),e);if(f.childNodes.length==b)if(a>=c){d=e.createText("");d.insertAfter(this)}else{a=e.createText("");a.insertAfter(d);a.remove()}return d},substring:function(a,
+f){return typeof f!="number"?this.$.nodeValue.substr(a):this.$.nodeValue.substring(a,f)}});
+(function(){function a(a,c,e){var d=a.serializable,f=c[e?"endContainer":"startContainer"],k=e?"endOffset":"startOffset",j=d?c.document.getById(a.startNode):a.startNode,a=d?c.document.getById(a.endNode):a.endNode;if(f.equals(j.getPrevious())){c.startOffset=c.startOffset-f.getLength()-a.getPrevious().getLength();f=a.getNext()}else if(f.equals(a.getPrevious())){c.startOffset=c.startOffset-f.getLength();f=a.getNext()}f.equals(j.getParent())&&c[k]++;f.equals(a.getParent())&&c[k]++;c[e?"endContainer":"startContainer"]=
+f;return c}CKEDITOR.dom.rangeList=function(a){if(a instanceof CKEDITOR.dom.rangeList)return a;a?a instanceof CKEDITOR.dom.range&&(a=[a]):a=[];return CKEDITOR.tools.extend(a,f)};var f={createIterator:function(){var a=this,c=CKEDITOR.dom.walker.bookmark(),e=[],d;return{getNextRange:function(f){d=d===void 0?0:d+1;var k=a[d];if(k&&a.length>1){if(!d)for(var j=a.length-1;j>=0;j--)e.unshift(a[j].createBookmark(true));if(f)for(var g=0;a[d+g+1];){for(var m=k.document,f=0,j=m.getById(e[g].endNode),m=m.getById(e[g+
+1].startNode);;){j=j.getNextSourceNode(false);if(m.equals(j))f=1;else if(c(j)||j.type==CKEDITOR.NODE_ELEMENT&&j.isBlockBoundary())continue;break}if(!f)break;g++}for(k.moveToBookmark(e.shift());g--;){j=a[++d];j.moveToBookmark(e.shift());k.setEnd(j.endContainer,j.endOffset)}}return k}}},createBookmarks:function(b){for(var c=[],e,d=0;d<this.length;d++){c.push(e=this[d].createBookmark(b,true));for(var f=d+1;f<this.length;f++){this[f]=a(e,this[f]);this[f]=a(e,this[f],true)}}return c},createBookmarks2:function(a){for(var c=
+[],e=0;e<this.length;e++)c.push(this[e].createBookmark2(a));return c},moveToBookmarks:function(a){for(var c=0;c<this.length;c++)this[c].moveToBookmark(a[c])}}})();
+(function(){function a(){return CKEDITOR.getUrl(CKEDITOR.skinName.split(",")[1]||"skins/"+CKEDITOR.skinName.split(",")[0]+"/")}function f(b){var c=CKEDITOR.skin["ua_"+b],d=CKEDITOR.env;if(c)for(var c=c.split(",").sort(function(a,b){return a>b?-1:1}),e=0,f;e<c.length;e++){f=c[e];if(d.ie&&(f.replace(/^ie/,"")==d.version||d.quirks&&f=="iequirks"))f="ie";if(d[f]){b=b+("_"+c[e]);break}}return CKEDITOR.getUrl(a()+b+".css")}function b(a,b){if(!d[a]){CKEDITOR.document.appendStyleSheet(f(a));d[a]=1}b&&b()}
+function c(a){var b=a.getById(h);if(!b){b=a.getHead().append("style");b.setAttribute("id",h);b.setAttribute("type","text/css")}return b}function e(a,b,c){var d,e,f;if(CKEDITOR.env.webkit){b=b.split("}").slice(0,-1);for(e=0;e<b.length;e++)b[e]=b[e].split("{")}for(var h=0;h<a.length;h++)if(CKEDITOR.env.webkit)for(e=0;e<b.length;e++){f=b[e][1];for(d=0;d<c.length;d++)f=f.replace(c[d][0],c[d][1]);a[h].$.sheet.addRule(b[e][0],f)}else{f=b;for(d=0;d<c.length;d++)f=f.replace(c[d][0],c[d][1]);CKEDITOR.env.ie&&
+CKEDITOR.env.version<11?a[h].$.styleSheet.cssText=a[h].$.styleSheet.cssText+f:a[h].$.innerHTML=a[h].$.innerHTML+f}}var d={};CKEDITOR.skin={path:a,loadPart:function(c,d){CKEDITOR.skin.name!=CKEDITOR.skinName.split(",")[0]?CKEDITOR.scriptLoader.load(CKEDITOR.getUrl(a()+"skin.js"),function(){b(c,d)}):b(c,d)},getPath:function(a){return CKEDITOR.getUrl(f(a))},icons:{},addIcon:function(a,b,c,d){a=a.toLowerCase();this.icons[a]||(this.icons[a]={path:b,offset:c||0,bgsize:d||"16px"})},getIconStyle:function(a,
+b,c,d,e){var f;if(a){a=a.toLowerCase();b&&(f=this.icons[a+"-rtl"]);f||(f=this.icons[a])}a=c||f&&f.path||"";d=d||f&&f.offset;e=e||f&&f.bgsize||"16px";return a&&"background-image:url("+CKEDITOR.getUrl(a)+");background-position:0 "+d+"px;background-size:"+e+";"}};CKEDITOR.tools.extend(CKEDITOR.editor.prototype,{getUiColor:function(){return this.uiColor},setUiColor:function(a){var b=c(CKEDITOR.document);return(this.setUiColor=function(a){this.uiColor=a;var c=CKEDITOR.skin.chameleon,d="",f="";if(typeof c==
+"function"){d=c(this,"editor");f=c(this,"panel")}a=[[j,a]];e([b],d,a);e(k,f,a)}).call(this,a)}});var h="cke_ui_color",k=[],j=/\$color/g;CKEDITOR.on("instanceLoaded",function(a){if(!CKEDITOR.env.ie||!CKEDITOR.env.quirks){var b=a.editor,a=function(a){a=(a.data[0]||a.data).element.getElementsByTag("iframe").getItem(0).getFrameDocument();if(!a.getById("cke_ui_color")){a=c(a);k.push(a);var d=b.getUiColor();d&&e([a],CKEDITOR.skin.chameleon(b,"panel"),[[j,d]])}};b.on("panelShow",a);b.on("menuShow",a);b.config.uiColor&&
+b.setUiColor(b.config.uiColor)}})})();
+(function(){if(CKEDITOR.env.webkit)CKEDITOR.env.hc=false;else{var a=CKEDITOR.dom.element.createFromHtml('<div style="width:0;height:0;position:absolute;left:-10000px;border:1px solid;border-color:red blue"></div>',CKEDITOR.document);a.appendTo(CKEDITOR.document.getHead());try{var f=a.getComputedStyle("border-top-color"),b=a.getComputedStyle("border-right-color");CKEDITOR.env.hc=!!(f&&f==b)}catch(c){CKEDITOR.env.hc=false}a.remove()}if(CKEDITOR.env.hc)CKEDITOR.env.cssClass=CKEDITOR.env.cssClass+" cke_hc";
+CKEDITOR.document.appendStyleText(".cke{visibility:hidden;}");CKEDITOR.status="loaded";CKEDITOR.fireOnce("loaded");if(a=CKEDITOR._.pending){delete CKEDITOR._.pending;for(f=0;f<a.length;f++){CKEDITOR.editor.prototype.constructor.apply(a[f][0],a[f][1]);CKEDITOR.add(a[f][0])}}})();/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.skin.name="moono";CKEDITOR.skin.ua_editor="ie,iequirks,ie7,ie8,gecko";CKEDITOR.skin.ua_dialog="ie,iequirks,ie7,ie8";
+CKEDITOR.skin.chameleon=function(){var b=function(){return function(b,e){for(var a=b.match(/[^#]./g),c=0;3>c;c++){var f=a,h=c,d;d=parseInt(a[c],16);d=("0"+(0>e?0|d*(1+e):0|d+(255-d)*e).toString(16)).slice(-2);f[h]=d}return"#"+a.join("")}}(),c=function(){var b=new CKEDITOR.template("background:#{to};background-image:-webkit-gradient(linear,lefttop,leftbottom,from({from}),to({to}));background-image:-moz-linear-gradient(top,{from},{to});background-image:-webkit-linear-gradient(top,{from},{to});background-image:-o-linear-gradient(top,{from},{to});background-image:-ms-linear-gradient(top,{from},{to});background-image:linear-gradient(top,{from},{to});filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='{from}',endColorstr='{to}');");return function(c,
+a){return b.output({from:c,to:a})}}(),f={editor:new CKEDITOR.template("{id}.cke_chrome [border-color:{defaultBorder};] {id} .cke_top [ {defaultGradient}border-bottom-color:{defaultBorder};] {id} .cke_bottom [{defaultGradient}border-top-color:{defaultBorder};] {id} .cke_resizer [border-right-color:{ckeResizer}] {id} .cke_dialog_title [{defaultGradient}border-bottom-color:{defaultBorder};] {id} .cke_dialog_footer [{defaultGradient}outline-color:{defaultBorder};border-top-color:{defaultBorder};] {id} .cke_dialog_tab [{lightGradient}border-color:{defaultBorder};] {id} .cke_dialog_tab:hover [{mediumGradient}] {id} .cke_dialog_contents [border-top-color:{defaultBorder};] {id} .cke_dialog_tab_selected, {id} .cke_dialog_tab_selected:hover [background:{dialogTabSelected};border-bottom-color:{dialogTabSelectedBorder};] {id} .cke_dialog_body [background:{dialogBody};border-color:{defaultBorder};] {id} .cke_toolgroup [{lightGradient}border-color:{defaultBorder};] {id} a.cke_button_off:hover, {id} a.cke_button_off:focus, {id} a.cke_button_off:active [{mediumGradient}] {id} .cke_button_on [{ckeButtonOn}] {id} .cke_toolbar_separator [background-color: {ckeToolbarSeparator};] {id} .cke_combo_button [border-color:{defaultBorder};{lightGradient}] {id} a.cke_combo_button:hover, {id} a.cke_combo_button:focus, {id} .cke_combo_on a.cke_combo_button [border-color:{defaultBorder};{mediumGradient}] {id} .cke_path_item [color:{elementsPathColor};] {id} a.cke_path_item:hover, {id} a.cke_path_item:focus, {id} a.cke_path_item:active [background-color:{elementsPathBg};] {id}.cke_panel [border-color:{defaultBorder};] "),
+panel:new CKEDITOR.template(".cke_panel_grouptitle [{lightGradient}border-color:{defaultBorder};] .cke_menubutton_icon [background-color:{menubuttonIcon};] .cke_menubutton:hover .cke_menubutton_icon, .cke_menubutton:focus .cke_menubutton_icon, .cke_menubutton:active .cke_menubutton_icon [background-color:{menubuttonIconHover};] .cke_menuseparator [background-color:{menubuttonIcon};] a:hover.cke_colorbox, a:focus.cke_colorbox, a:active.cke_colorbox [border-color:{defaultBorder};] a:hover.cke_colorauto, a:hover.cke_colormore, a:focus.cke_colorauto, a:focus.cke_colormore, a:active.cke_colorauto, a:active.cke_colormore [background-color:{ckeColorauto};border-color:{defaultBorder};] ")};
+return function(g,e){var a=g.uiColor,a={id:"."+g.id,defaultBorder:b(a,-0.1),defaultGradient:c(b(a,0.9),a),lightGradient:c(b(a,1),b(a,0.7)),mediumGradient:c(b(a,0.8),b(a,0.5)),ckeButtonOn:c(b(a,0.6),b(a,0.7)),ckeResizer:b(a,-0.4),ckeToolbarSeparator:b(a,0.5),ckeColorauto:b(a,0.8),dialogBody:b(a,0.7),dialogTabSelected:c("#FFFFFF","#FFFFFF"),dialogTabSelectedBorder:"#FFF",elementsPathColor:b(a,-0.6),elementsPathBg:a,menubuttonIcon:b(a,0.5),menubuttonIconHover:b(a,0.3)};return f[e].output(a).replace(/\[/g,
+"{").replace(/\]/g,"}")}}();CKEDITOR.plugins.add("dialogui",{onLoad:function(){var h=function(b){this._||(this._={});this._["default"]=this._.initValue=b["default"]||"";this._.required=b.required||!1;for(var a=[this._],d=1;d<arguments.length;d++)a.push(arguments[d]);a.push(!0);CKEDITOR.tools.extend.apply(CKEDITOR.tools,a);return this._},r={build:function(b,a,d){return new CKEDITOR.ui.dialog.textInput(b,a,d)}},l={build:function(b,a,d){return new CKEDITOR.ui.dialog[a.type](b,a,d)}},n={isChanged:function(){return this.getValue()!=
+this.getInitValue()},reset:function(b){this.setValue(this.getInitValue(),b)},setInitValue:function(){this._.initValue=this.getValue()},resetInitValue:function(){this._.initValue=this._["default"]},getInitValue:function(){return this._.initValue}},o=CKEDITOR.tools.extend({},CKEDITOR.ui.dialog.uiElement.prototype.eventProcessors,{onChange:function(b,a){this._.domOnChangeRegistered||(b.on("load",function(){this.getInputElement().on("change",function(){b.parts.dialog.isVisible()&&this.fire("change",{value:this.getValue()})},
+this)},this),this._.domOnChangeRegistered=!0);this.on("change",a)}},!0),s=/^on([A-Z]\w+)/,p=function(b){for(var a in b)(s.test(a)||"title"==a||"type"==a)&&delete b[a];return b};CKEDITOR.tools.extend(CKEDITOR.ui.dialog,{labeledElement:function(b,a,d,f){if(!(4>arguments.length)){var c=h.call(this,a);c.labelId=CKEDITOR.tools.getNextId()+"_label";this._.children=[];var e={role:a.role||"presentation"};a.includeLabel&&(e["aria-labelledby"]=c.labelId);CKEDITOR.ui.dialog.uiElement.call(this,b,a,d,"div",null,
+e,function(){var e=[],g=a.required?" cke_required":"";if(a.labelLayout!="horizontal")e.push('<label class="cke_dialog_ui_labeled_label'+g+'" ',' id="'+c.labelId+'"',c.inputId?' for="'+c.inputId+'"':"",(a.labelStyle?' style="'+a.labelStyle+'"':"")+">",a.label,"</label>",'<div class="cke_dialog_ui_labeled_content"',a.controlStyle?' style="'+a.controlStyle+'"':"",' role="presentation">',f.call(this,b,a),"</div>");else{g={type:"hbox",widths:a.widths,padding:0,children:[{type:"html",html:'<label class="cke_dialog_ui_labeled_label'+
+g+'" id="'+c.labelId+'" for="'+c.inputId+'"'+(a.labelStyle?' style="'+a.labelStyle+'"':"")+">"+CKEDITOR.tools.htmlEncode(a.label)+"</span>"},{type:"html",html:'<span class="cke_dialog_ui_labeled_content"'+(a.controlStyle?' style="'+a.controlStyle+'"':"")+">"+f.call(this,b,a)+"</span>"}]};CKEDITOR.dialog._.uiElementBuilders.hbox.build(b,g,e)}return e.join("")})}},textInput:function(b,a,d){if(!(3>arguments.length)){h.call(this,a);var f=this._.inputId=CKEDITOR.tools.getNextId()+"_textInput",c={"class":"cke_dialog_ui_input_"+
+a.type,id:f,type:a.type};a.validate&&(this.validate=a.validate);a.maxLength&&(c.maxlength=a.maxLength);a.size&&(c.size=a.size);a.inputStyle&&(c.style=a.inputStyle);var e=this,k=!1;b.on("load",function(){e.getInputElement().on("keydown",function(a){a.data.getKeystroke()==13&&(k=true)});e.getInputElement().on("keyup",function(a){if(a.data.getKeystroke()==13&&k){b.getButton("ok")&&setTimeout(function(){b.getButton("ok").click()},0);k=false}},null,null,1E3)});CKEDITOR.ui.dialog.labeledElement.call(this,
+b,a,d,function(){var b=['<div class="cke_dialog_ui_input_',a.type,'" role="presentation"'];a.width&&b.push('style="width:'+a.width+'" ');b.push("><input ");c["aria-labelledby"]=this._.labelId;this._.required&&(c["aria-required"]=this._.required);for(var e in c)b.push(e+'="'+c[e]+'" ');b.push(" /></div>");return b.join("")})}},textarea:function(b,a,d){if(!(3>arguments.length)){h.call(this,a);var f=this,c=this._.inputId=CKEDITOR.tools.getNextId()+"_textarea",e={};a.validate&&(this.validate=a.validate);
+e.rows=a.rows||5;e.cols=a.cols||20;e["class"]="cke_dialog_ui_input_textarea "+(a["class"]||"");"undefined"!=typeof a.inputStyle&&(e.style=a.inputStyle);a.dir&&(e.dir=a.dir);CKEDITOR.ui.dialog.labeledElement.call(this,b,a,d,function(){e["aria-labelledby"]=this._.labelId;this._.required&&(e["aria-required"]=this._.required);var a=['<div class="cke_dialog_ui_input_textarea" role="presentation"><textarea id="',c,'" '],b;for(b in e)a.push(b+'="'+CKEDITOR.tools.htmlEncode(e[b])+'" ');a.push(">",CKEDITOR.tools.htmlEncode(f._["default"]),
+"</textarea></div>");return a.join("")})}},checkbox:function(b,a,d){if(!(3>arguments.length)){var f=h.call(this,a,{"default":!!a["default"]});a.validate&&(this.validate=a.validate);CKEDITOR.ui.dialog.uiElement.call(this,b,a,d,"span",null,null,function(){var c=CKEDITOR.tools.extend({},a,{id:a.id?a.id+"_checkbox":CKEDITOR.tools.getNextId()+"_checkbox"},true),e=[],d=CKEDITOR.tools.getNextId()+"_label",g={"class":"cke_dialog_ui_checkbox_input",type:"checkbox","aria-labelledby":d};p(c);if(a["default"])g.checked=
+"checked";if(typeof c.inputStyle!="undefined")c.style=c.inputStyle;f.checkbox=new CKEDITOR.ui.dialog.uiElement(b,c,e,"input",null,g);e.push(' <label id="',d,'" for="',g.id,'"'+(a.labelStyle?' style="'+a.labelStyle+'"':"")+">",CKEDITOR.tools.htmlEncode(a.label),"</label>");return e.join("")})}},radio:function(b,a,d){if(!(3>arguments.length)){h.call(this,a);this._["default"]||(this._["default"]=this._.initValue=a.items[0][1]);a.validate&&(this.validate=a.valdiate);var f=[],c=this;a.role="radiogroup";
+a.includeLabel=!0;CKEDITOR.ui.dialog.labeledElement.call(this,b,a,d,function(){for(var e=[],d=[],g=(a.id?a.id:CKEDITOR.tools.getNextId())+"_radio",i=0;i<a.items.length;i++){var j=a.items[i],h=j[2]!==void 0?j[2]:j[0],l=j[1]!==void 0?j[1]:j[0],m=CKEDITOR.tools.getNextId()+"_radio_input",n=m+"_label",m=CKEDITOR.tools.extend({},a,{id:m,title:null,type:null},true),h=CKEDITOR.tools.extend({},m,{title:h},true),o={type:"radio","class":"cke_dialog_ui_radio_input",name:g,value:l,"aria-labelledby":n},q=[];if(c._["default"]==
+l)o.checked="checked";p(m);p(h);if(typeof m.inputStyle!="undefined")m.style=m.inputStyle;m.keyboardFocusable=true;f.push(new CKEDITOR.ui.dialog.uiElement(b,m,q,"input",null,o));q.push(" ");new CKEDITOR.ui.dialog.uiElement(b,h,q,"label",null,{id:n,"for":o.id},j[0]);e.push(q.join(""))}new CKEDITOR.ui.dialog.hbox(b,f,e,d);return d.join("")});this._.children=f}},button:function(b,a,d){if(arguments.length){"function"==typeof a&&(a=a(b.getParentEditor()));h.call(this,a,{disabled:a.disabled||!1});CKEDITOR.event.implementOn(this);
+var f=this;b.on("load",function(){var a=this.getElement();(function(){a.on("click",function(a){f.click();a.data.preventDefault()});a.on("keydown",function(a){a.data.getKeystroke()in{32:1}&&(f.click(),a.data.preventDefault())})})();a.unselectable()},this);var c=CKEDITOR.tools.extend({},a);delete c.style;var e=CKEDITOR.tools.getNextId()+"_label";CKEDITOR.ui.dialog.uiElement.call(this,b,c,d,"a",null,{style:a.style,href:"javascript:void(0)",title:a.label,hidefocus:"true","class":a["class"],role:"button",
+"aria-labelledby":e},'<span id="'+e+'" class="cke_dialog_ui_button">'+CKEDITOR.tools.htmlEncode(a.label)+"</span>")}},select:function(b,a,d){if(!(3>arguments.length)){var f=h.call(this,a);a.validate&&(this.validate=a.validate);f.inputId=CKEDITOR.tools.getNextId()+"_select";CKEDITOR.ui.dialog.labeledElement.call(this,b,a,d,function(){var c=CKEDITOR.tools.extend({},a,{id:a.id?a.id+"_select":CKEDITOR.tools.getNextId()+"_select"},true),e=[],d=[],g={id:f.inputId,"class":"cke_dialog_ui_input_select","aria-labelledby":this._.labelId};
+e.push('<div class="cke_dialog_ui_input_',a.type,'" role="presentation"');a.width&&e.push('style="width:'+a.width+'" ');e.push(">");if(a.size!==void 0)g.size=a.size;if(a.multiple!==void 0)g.multiple=a.multiple;p(c);for(var i=0,j;i<a.items.length&&(j=a.items[i]);i++)d.push('<option value="',CKEDITOR.tools.htmlEncode(j[1]!==void 0?j[1]:j[0]).replace(/"/g,"&quot;"),'" /> ',CKEDITOR.tools.htmlEncode(j[0]));if(typeof c.inputStyle!="undefined")c.style=c.inputStyle;f.select=new CKEDITOR.ui.dialog.uiElement(b,
+c,e,"select",null,g,d.join(""));e.push("</div>");return e.join("")})}},file:function(b,a,d){if(!(3>arguments.length)){void 0===a["default"]&&(a["default"]="");var f=CKEDITOR.tools.extend(h.call(this,a),{definition:a,buttons:[]});a.validate&&(this.validate=a.validate);b.on("load",function(){CKEDITOR.document.getById(f.frameId).getParent().addClass("cke_dialog_ui_input_file")});CKEDITOR.ui.dialog.labeledElement.call(this,b,a,d,function(){f.frameId=CKEDITOR.tools.getNextId()+"_fileInput";var b=['<iframe frameborder="0" allowtransparency="0" class="cke_dialog_ui_input_file" role="presentation" id="',
+f.frameId,'" title="',a.label,'" src="javascript:void('];b.push(CKEDITOR.env.ie?"(function(){"+encodeURIComponent("document.open();("+CKEDITOR.tools.fixDomain+")();document.close();")+"})()":"0");b.push(')"></iframe>');return b.join("")})}},fileButton:function(b,a,d){var f=this;if(!(3>arguments.length)){h.call(this,a);a.validate&&(this.validate=a.validate);var c=CKEDITOR.tools.extend({},a),e=c.onClick;c.className=(c.className?c.className+" ":"")+"cke_dialog_ui_button";c.onClick=function(c){var d=
+a["for"];if(!e||e.call(this,c)!==false){b.getContentElement(d[0],d[1]).submit();this.disable()}};b.on("load",function(){b.getContentElement(a["for"][0],a["for"][1])._.buttons.push(f)});CKEDITOR.ui.dialog.button.call(this,b,c,d)}},html:function(){var b=/^\s*<[\w:]+\s+([^>]*)?>/,a=/^(\s*<[\w:]+(?:\s+[^>]*)?)((?:.|\r|\n)+)$/,d=/\/$/;return function(f,c,e){if(!(3>arguments.length)){var k=[],g=c.html;"<"!=g.charAt(0)&&(g="<span>"+g+"</span>");var i=c.focus;if(i){var j=this.focus;this.focus=function(){("function"==
+typeof i?i:j).call(this);this.fire("focus")};c.isFocusable&&(this.isFocusable=this.isFocusable);this.keyboardFocusable=!0}CKEDITOR.ui.dialog.uiElement.call(this,f,c,k,"span",null,null,"");k=k.join("").match(b);g=g.match(a)||["","",""];d.test(g[1])&&(g[1]=g[1].slice(0,-1),g[2]="/"+g[2]);e.push([g[1]," ",k[1]||"",g[2]].join(""))}}}(),fieldset:function(b,a,d,f,c){var e=c.label;this._={children:a};CKEDITOR.ui.dialog.uiElement.call(this,b,c,f,"fieldset",null,null,function(){var a=[];e&&a.push("<legend"+
+(c.labelStyle?' style="'+c.labelStyle+'"':"")+">"+e+"</legend>");for(var b=0;b<d.length;b++)a.push(d[b]);return a.join("")})}},!0);CKEDITOR.ui.dialog.html.prototype=new CKEDITOR.ui.dialog.uiElement;CKEDITOR.ui.dialog.labeledElement.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.uiElement,{setLabel:function(b){var a=CKEDITOR.document.getById(this._.labelId);1>a.getChildCount()?(new CKEDITOR.dom.text(b,CKEDITOR.document)).appendTo(a):a.getChild(0).$.nodeValue=b;return this},getLabel:function(){var b=
+CKEDITOR.document.getById(this._.labelId);return!b||1>b.getChildCount()?"":b.getChild(0).getText()},eventProcessors:o},!0);CKEDITOR.ui.dialog.button.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.uiElement,{click:function(){return!this._.disabled?this.fire("click",{dialog:this._.dialog}):!1},enable:function(){this._.disabled=!1;var b=this.getElement();b&&b.removeClass("cke_disabled")},disable:function(){this._.disabled=!0;this.getElement().addClass("cke_disabled")},isVisible:function(){return this.getElement().getFirst().isVisible()},
+isEnabled:function(){return!this._.disabled},eventProcessors:CKEDITOR.tools.extend({},CKEDITOR.ui.dialog.uiElement.prototype.eventProcessors,{onClick:function(b,a){this.on("click",function(){a.apply(this,arguments)})}},!0),accessKeyUp:function(){this.click()},accessKeyDown:function(){this.focus()},keyboardFocusable:!0},!0);CKEDITOR.ui.dialog.textInput.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.labeledElement,{getInputElement:function(){return CKEDITOR.document.getById(this._.inputId)},
+focus:function(){var b=this.selectParentTab();setTimeout(function(){var a=b.getInputElement();a&&a.$.focus()},0)},select:function(){var b=this.selectParentTab();setTimeout(function(){var a=b.getInputElement();a&&(a.$.focus(),a.$.select())},0)},accessKeyUp:function(){this.select()},setValue:function(b){!b&&(b="");return CKEDITOR.ui.dialog.uiElement.prototype.setValue.apply(this,arguments)},keyboardFocusable:!0},n,!0);CKEDITOR.ui.dialog.textarea.prototype=new CKEDITOR.ui.dialog.textInput;CKEDITOR.ui.dialog.select.prototype=
+CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.labeledElement,{getInputElement:function(){return this._.select.getElement()},add:function(b,a,d){var f=new CKEDITOR.dom.element("option",this.getDialog().getParentEditor().document),c=this.getInputElement().$;f.$.text=b;f.$.value=void 0===a||null===a?b:a;void 0===d||null===d?CKEDITOR.env.ie?c.add(f.$):c.add(f.$,null):c.add(f.$,d);return this},remove:function(b){this.getInputElement().$.remove(b);return this},clear:function(){for(var b=this.getInputElement().$;0<
+b.length;)b.remove(0);return this},keyboardFocusable:!0},n,!0);CKEDITOR.ui.dialog.checkbox.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.uiElement,{getInputElement:function(){return this._.checkbox.getElement()},setValue:function(b,a){this.getInputElement().$.checked=b;!a&&this.fire("change",{value:b})},getValue:function(){return this.getInputElement().$.checked},accessKeyUp:function(){this.setValue(!this.getValue())},eventProcessors:{onChange:function(b,a){if(!CKEDITOR.env.ie||8<CKEDITOR.env.version)return o.onChange.apply(this,
+arguments);b.on("load",function(){var a=this._.checkbox.getElement();a.on("propertychange",function(b){b=b.data.$;"checked"==b.propertyName&&this.fire("change",{value:a.$.checked})},this)},this);this.on("change",a);return null}},keyboardFocusable:!0},n,!0);CKEDITOR.ui.dialog.radio.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.uiElement,{setValue:function(b,a){for(var d=this._.children,f,c=0;c<d.length&&(f=d[c]);c++)f.getElement().$.checked=f.getValue()==b;!a&&this.fire("change",{value:b})},
+getValue:function(){for(var b=this._.children,a=0;a<b.length;a++)if(b[a].getElement().$.checked)return b[a].getValue();return null},accessKeyUp:function(){var b=this._.children,a;for(a=0;a<b.length;a++)if(b[a].getElement().$.checked){b[a].getElement().focus();return}b[0].getElement().focus()},eventProcessors:{onChange:function(b,a){if(CKEDITOR.env.ie)b.on("load",function(){for(var a=this._.children,b=this,c=0;c<a.length;c++)a[c].getElement().on("propertychange",function(a){a=a.data.$;"checked"==a.propertyName&&
+this.$.checked&&b.fire("change",{value:this.getAttribute("value")})})},this),this.on("change",a);else return o.onChange.apply(this,arguments);return null}}},n,!0);CKEDITOR.ui.dialog.file.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.labeledElement,n,{getInputElement:function(){var b=CKEDITOR.document.getById(this._.frameId).getFrameDocument();return 0<b.$.forms.length?new CKEDITOR.dom.element(b.$.forms[0].elements[0]):this.getElement()},submit:function(){this.getInputElement().getParent().$.submit();
+return this},getAction:function(){return this.getInputElement().getParent().$.action},registerEvents:function(b){var a=/^on([A-Z]\w+)/,d,f=function(a,b,c,d){a.on("formLoaded",function(){a.getInputElement().on(c,d,a)})},c;for(c in b)if(d=c.match(a))this.eventProcessors[c]?this.eventProcessors[c].call(this,this._.dialog,b[c]):f(this,this._.dialog,d[1].toLowerCase(),b[c]);return this},reset:function(){function b(){d.$.open();var b="";f.size&&(b=f.size-(CKEDITOR.env.ie?7:0));var h=a.frameId+"_input";
+d.$.write(['<html dir="'+g+'" lang="'+i+'"><head><title></title></head><body style="margin: 0; overflow: hidden; background: transparent;">','<form enctype="multipart/form-data" method="POST" dir="'+g+'" lang="'+i+'" action="',CKEDITOR.tools.htmlEncode(f.action),'"><label id="',a.labelId,'" for="',h,'" style="display:none">',CKEDITOR.tools.htmlEncode(f.label),'</label><input style="width:100%" id="',h,'" aria-labelledby="',a.labelId,'" type="file" name="',CKEDITOR.tools.htmlEncode(f.id||"cke_upload"),
+'" size="',CKEDITOR.tools.htmlEncode(0<b?b:""),'" /></form></body></html><script>',CKEDITOR.env.ie?"("+CKEDITOR.tools.fixDomain+")();":"","window.parent.CKEDITOR.tools.callFunction("+e+");","window.onbeforeunload = function() {window.parent.CKEDITOR.tools.callFunction("+k+")}","<\/script>"].join(""));d.$.close();for(b=0;b<c.length;b++)c[b].enable()}var a=this._,d=CKEDITOR.document.getById(a.frameId).getFrameDocument(),f=a.definition,c=a.buttons,e=this.formLoadedNumber,k=this.formUnloadNumber,g=a.dialog._.editor.lang.dir,
+i=a.dialog._.editor.langCode;e||(e=this.formLoadedNumber=CKEDITOR.tools.addFunction(function(){this.fire("formLoaded")},this),k=this.formUnloadNumber=CKEDITOR.tools.addFunction(function(){this.getInputElement().clearCustomData()},this),this.getDialog()._.editor.on("destroy",function(){CKEDITOR.tools.removeFunction(e);CKEDITOR.tools.removeFunction(k)}));CKEDITOR.env.gecko?setTimeout(b,500):b()},getValue:function(){return this.getInputElement().$.value||""},setInitValue:function(){this._.initValue=
+""},eventProcessors:{onChange:function(b,a){this._.domOnChangeRegistered||(this.on("formLoaded",function(){this.getInputElement().on("change",function(){this.fire("change",{value:this.getValue()})},this)},this),this._.domOnChangeRegistered=!0);this.on("change",a)}},keyboardFocusable:!0},!0);CKEDITOR.ui.dialog.fileButton.prototype=new CKEDITOR.ui.dialog.button;CKEDITOR.ui.dialog.fieldset.prototype=CKEDITOR.tools.clone(CKEDITOR.ui.dialog.hbox.prototype);CKEDITOR.dialog.addUIElement("text",r);CKEDITOR.dialog.addUIElement("password",
+r);CKEDITOR.dialog.addUIElement("textarea",l);CKEDITOR.dialog.addUIElement("checkbox",l);CKEDITOR.dialog.addUIElement("radio",l);CKEDITOR.dialog.addUIElement("button",l);CKEDITOR.dialog.addUIElement("select",l);CKEDITOR.dialog.addUIElement("file",l);CKEDITOR.dialog.addUIElement("fileButton",l);CKEDITOR.dialog.addUIElement("html",l);CKEDITOR.dialog.addUIElement("fieldset",{build:function(b,a,d){for(var f=a.children,c,e=[],h=[],g=0;g<f.length&&(c=f[g]);g++){var i=[];e.push(i);h.push(CKEDITOR.dialog._.uiElementBuilders[c.type].build(b,
+c,i))}return new CKEDITOR.ui.dialog[a.type](b,h,e,d,a)}})}});CKEDITOR.DIALOG_RESIZE_NONE=0;CKEDITOR.DIALOG_RESIZE_WIDTH=1;CKEDITOR.DIALOG_RESIZE_HEIGHT=2;CKEDITOR.DIALOG_RESIZE_BOTH=3;
+(function(){function t(){for(var a=this._.tabIdList.length,b=CKEDITOR.tools.indexOf(this._.tabIdList,this._.currentTabId)+a,c=b-1;c>b-a;c--)if(this._.tabs[this._.tabIdList[c%a]][0].$.offsetHeight)return this._.tabIdList[c%a];return null}function u(){for(var a=this._.tabIdList.length,b=CKEDITOR.tools.indexOf(this._.tabIdList,this._.currentTabId),c=b+1;c<b+a;c++)if(this._.tabs[this._.tabIdList[c%a]][0].$.offsetHeight)return this._.tabIdList[c%a];return null}function G(a,b){for(var c=a.$.getElementsByTagName("input"),
+e=0,d=c.length;e<d;e++){var g=new CKEDITOR.dom.element(c[e]);"text"==g.getAttribute("type").toLowerCase()&&(b?(g.setAttribute("value",g.getCustomData("fake_value")||""),g.removeCustomData("fake_value")):(g.setCustomData("fake_value",g.getAttribute("value")),g.setAttribute("value","")))}}function P(a,b){var c=this.getInputElement();c&&(a?c.removeAttribute("aria-invalid"):c.setAttribute("aria-invalid",!0));a||(this.select?this.select():this.focus());b&&alert(b);this.fire("validated",{valid:a,msg:b})}
+function Q(){var a=this.getInputElement();a&&a.removeAttribute("aria-invalid")}function R(a){var a=CKEDITOR.dom.element.createFromHtml(CKEDITOR.addTemplate("dialog",S).output({id:CKEDITOR.tools.getNextNumber(),editorId:a.id,langDir:a.lang.dir,langCode:a.langCode,editorDialogClass:"cke_editor_"+a.name.replace(/\./g,"\\.")+"_dialog",closeTitle:a.lang.common.close,hidpi:CKEDITOR.env.hidpi?"cke_hidpi":""})),b=a.getChild([0,0,0,0,0]),c=b.getChild(0),e=b.getChild(1);if(CKEDITOR.env.ie&&!CKEDITOR.env.quirks){var d=
+"javascript:void(function(){"+encodeURIComponent("document.open();("+CKEDITOR.tools.fixDomain+")();document.close();")+"}())";CKEDITOR.dom.element.createFromHtml('<iframe frameBorder="0" class="cke_iframe_shim" src="'+d+'" tabIndex="-1"></iframe>').appendTo(b.getParent())}c.unselectable();e.unselectable();return{element:a,parts:{dialog:a.getChild(0),title:c,close:e,tabs:b.getChild(2),contents:b.getChild([3,0,0,0]),footer:b.getChild([3,0,1,0])}}}function H(a,b,c){this.element=b;this.focusIndex=c;this.tabIndex=
+0;this.isFocusable=function(){return!b.getAttribute("disabled")&&b.isVisible()};this.focus=function(){a._.currentFocusIndex=this.focusIndex;this.element.focus()};b.on("keydown",function(a){a.data.getKeystroke()in{32:1,13:1}&&this.fire("click")});b.on("focus",function(){this.fire("mouseover")});b.on("blur",function(){this.fire("mouseout")})}function T(a){function b(){a.layout()}var c=CKEDITOR.document.getWindow();c.on("resize",b);a.on("hide",function(){c.removeListener("resize",b)})}function I(a,b){this._=
+{dialog:a};CKEDITOR.tools.extend(this,b)}function U(a){function b(b){var c=a.getSize(),i=CKEDITOR.document.getWindow().getViewPaneSize(),o=b.data.$.screenX,j=b.data.$.screenY,n=o-e.x,l=j-e.y;e={x:o,y:j};d.x+=n;d.y+=l;a.move(d.x+h[3]<f?-h[3]:d.x-h[1]>i.width-c.width-f?i.width-c.width+("rtl"==g.lang.dir?0:h[1]):d.x,d.y+h[0]<f?-h[0]:d.y-h[2]>i.height-c.height-f?i.height-c.height+h[2]:d.y,1);b.data.preventDefault()}function c(){CKEDITOR.document.removeListener("mousemove",b);CKEDITOR.document.removeListener("mouseup",
+c);if(CKEDITOR.env.ie6Compat){var a=q.getChild(0).getFrameDocument();a.removeListener("mousemove",b);a.removeListener("mouseup",c)}}var e=null,d=null,g=a.getParentEditor(),f=g.config.dialog_magnetDistance,h=CKEDITOR.skin.margins||[0,0,0,0];"undefined"==typeof f&&(f=20);a.parts.title.on("mousedown",function(f){e={x:f.data.$.screenX,y:f.data.$.screenY};CKEDITOR.document.on("mousemove",b);CKEDITOR.document.on("mouseup",c);d=a.getPosition();if(CKEDITOR.env.ie6Compat){var h=q.getChild(0).getFrameDocument();
+h.on("mousemove",b);h.on("mouseup",c)}f.data.preventDefault()},a)}function V(a){var b,c;function e(d){var e="rtl"==h.lang.dir,j=o.width,C=o.height,D=j+(d.data.$.screenX-b)*(e?-1:1)*(a._.moved?1:2),n=C+(d.data.$.screenY-c)*(a._.moved?1:2),x=a._.element.getFirst(),x=e&&x.getComputedStyle("right"),y=a.getPosition();y.y+n>i.height&&(n=i.height-y.y);if((e?x:y.x)+D>i.width)D=i.width-(e?x:y.x);if(f==CKEDITOR.DIALOG_RESIZE_WIDTH||f==CKEDITOR.DIALOG_RESIZE_BOTH)j=Math.max(g.minWidth||0,D-m);if(f==CKEDITOR.DIALOG_RESIZE_HEIGHT||
+f==CKEDITOR.DIALOG_RESIZE_BOTH)C=Math.max(g.minHeight||0,n-k);a.resize(j,C);a._.moved||a.layout();d.data.preventDefault()}function d(){CKEDITOR.document.removeListener("mouseup",d);CKEDITOR.document.removeListener("mousemove",e);j&&(j.remove(),j=null);if(CKEDITOR.env.ie6Compat){var a=q.getChild(0).getFrameDocument();a.removeListener("mouseup",d);a.removeListener("mousemove",e)}}var g=a.definition,f=g.resizable;if(f!=CKEDITOR.DIALOG_RESIZE_NONE){var h=a.getParentEditor(),m,k,i,o,j,n=CKEDITOR.tools.addFunction(function(f){o=
+a.getSize();var h=a.parts.contents;h.$.getElementsByTagName("iframe").length&&(j=CKEDITOR.dom.element.createFromHtml('<div class="cke_dialog_resize_cover" style="height: 100%; position: absolute; width: 100%;"></div>'),h.append(j));k=o.height-a.parts.contents.getSize("height",!(CKEDITOR.env.gecko||CKEDITOR.env.ie&&CKEDITOR.env.quirks));m=o.width-a.parts.contents.getSize("width",1);b=f.screenX;c=f.screenY;i=CKEDITOR.document.getWindow().getViewPaneSize();CKEDITOR.document.on("mousemove",e);CKEDITOR.document.on("mouseup",
+d);CKEDITOR.env.ie6Compat&&(h=q.getChild(0).getFrameDocument(),h.on("mousemove",e),h.on("mouseup",d));f.preventDefault&&f.preventDefault()});a.on("load",function(){var b="";f==CKEDITOR.DIALOG_RESIZE_WIDTH?b=" cke_resizer_horizontal":f==CKEDITOR.DIALOG_RESIZE_HEIGHT&&(b=" cke_resizer_vertical");b=CKEDITOR.dom.element.createFromHtml('<div class="cke_resizer'+b+" cke_resizer_"+h.lang.dir+'" title="'+CKEDITOR.tools.htmlEncode(h.lang.common.resize)+'" onmousedown="CKEDITOR.tools.callFunction('+n+', event )">'+
+("ltr"==h.lang.dir?"â—¢":"â—£")+"</div>");a.parts.footer.append(b,1)});h.on("destroy",function(){CKEDITOR.tools.removeFunction(n)})}}function E(a){a.data.preventDefault(1)}function J(a){var b=CKEDITOR.document.getWindow(),c=a.config,e=c.dialog_backgroundCoverColor||"white",d=c.dialog_backgroundCoverOpacity,g=c.baseFloatZIndex,c=CKEDITOR.tools.genKey(e,d,g),f=w[c];f?f.show():(g=['<div tabIndex="-1" style="position: ',CKEDITOR.env.ie6Compat?"absolute":"fixed","; z-index: ",g,"; top: 0px; left: 0px; ",!CKEDITOR.env.ie6Compat?
+"background-color: "+e:"",'" class="cke_dialog_background_cover">'],CKEDITOR.env.ie6Compat&&(e="<html><body style=\\'background-color:"+e+";\\'></body></html>",g.push('<iframe hidefocus="true" frameborder="0" id="cke_dialog_background_iframe" src="javascript:'),g.push("void((function(){"+encodeURIComponent("document.open();("+CKEDITOR.tools.fixDomain+")();document.write( '"+e+"' );document.close();")+"})())"),g.push('" style="position:absolute;left:0;top:0;width:100%;height: 100%;filter: progid:DXImageTransform.Microsoft.Alpha(opacity=0)"></iframe>')),
+g.push("</div>"),f=CKEDITOR.dom.element.createFromHtml(g.join("")),f.setOpacity(void 0!==d?d:0.5),f.on("keydown",E),f.on("keypress",E),f.on("keyup",E),f.appendTo(CKEDITOR.document.getBody()),w[c]=f);a.focusManager.add(f);q=f;var a=function(){var a=b.getViewPaneSize();f.setStyles({width:a.width+"px",height:a.height+"px"})},h=function(){var a=b.getScrollPosition(),c=CKEDITOR.dialog._.currentTop;f.setStyles({left:a.x+"px",top:a.y+"px"});if(c){do{a=c.getPosition();c.move(a.x,a.y)}while(c=c._.parentDialog)
+}};F=a;b.on("resize",a);a();(!CKEDITOR.env.mac||!CKEDITOR.env.webkit)&&f.focus();if(CKEDITOR.env.ie6Compat){var m=function(){h();arguments.callee.prevScrollHandler.apply(this,arguments)};b.$.setTimeout(function(){m.prevScrollHandler=window.onscroll||function(){};window.onscroll=m},0);h()}}function K(a){q&&(a.focusManager.remove(q),a=CKEDITOR.document.getWindow(),q.hide(),a.removeListener("resize",F),CKEDITOR.env.ie6Compat&&a.$.setTimeout(function(){window.onscroll=window.onscroll&&window.onscroll.prevScrollHandler||
+null},0),F=null)}var r=CKEDITOR.tools.cssLength,S='<div class="cke_reset_all {editorId} {editorDialogClass} {hidpi}" dir="{langDir}" lang="{langCode}" role="dialog" aria-labelledby="cke_dialog_title_{id}"><table class="cke_dialog '+CKEDITOR.env.cssClass+' cke_{langDir}" style="position:absolute" role="presentation"><tr><td role="presentation"><div class="cke_dialog_body" role="presentation"><div id="cke_dialog_title_{id}" class="cke_dialog_title" role="presentation"></div><a id="cke_dialog_close_button_{id}" class="cke_dialog_close_button" href="javascript:void(0)" title="{closeTitle}" role="button"><span class="cke_label">X</span></a><div id="cke_dialog_tabs_{id}" class="cke_dialog_tabs" role="tablist"></div><table class="cke_dialog_contents" role="presentation"><tr><td id="cke_dialog_contents_{id}" class="cke_dialog_contents_body" role="presentation"></td></tr><tr><td id="cke_dialog_footer_{id}" class="cke_dialog_footer" role="presentation"></td></tr></table></div></td></tr></table></div>';
+CKEDITOR.dialog=function(a,b){function c(){var a=l._.focusList;a.sort(function(a,b){return a.tabIndex!=b.tabIndex?b.tabIndex-a.tabIndex:a.focusIndex-b.focusIndex});for(var b=a.length,c=0;c<b;c++)a[c].focusIndex=c}function e(a){var b=l._.focusList,a=a||0;if(!(1>b.length)){var c=l._.currentFocusIndex;try{b[c].getInputElement().$.blur()}catch(f){}for(var d=c=(c+a+b.length)%b.length;a&&!b[d].isFocusable()&&!(d=(d+a+b.length)%b.length,d==c););b[d].focus();"text"==b[d].type&&b[d].select()}}function d(b){if(l==
+CKEDITOR.dialog._.currentTop){var c=b.data.getKeystroke(),d="rtl"==a.lang.dir;o=j=0;if(9==c||c==CKEDITOR.SHIFT+9)c=c==CKEDITOR.SHIFT+9,l._.tabBarMode?(c=c?t.call(l):u.call(l),l.selectPage(c),l._.tabs[c][0].focus()):e(c?-1:1),o=1;else if(c==CKEDITOR.ALT+121&&!l._.tabBarMode&&1<l.getPageCount())l._.tabBarMode=!0,l._.tabs[l._.currentTabId][0].focus(),o=1;else if((37==c||39==c)&&l._.tabBarMode)c=c==(d?39:37)?t.call(l):u.call(l),l.selectPage(c),l._.tabs[c][0].focus(),o=1;else if((13==c||32==c)&&l._.tabBarMode)this.selectPage(this._.currentTabId),
+this._.tabBarMode=!1,this._.currentFocusIndex=-1,e(1),o=1;else if(13==c){c=b.data.getTarget();if(!c.is("a","button","select","textarea")&&(!c.is("input")||"button"!=c.$.type))(c=this.getButton("ok"))&&CKEDITOR.tools.setTimeout(c.click,0,c),o=1;j=1}else if(27==c)(c=this.getButton("cancel"))?CKEDITOR.tools.setTimeout(c.click,0,c):!1!==this.fire("cancel",{hide:!0}).hide&&this.hide(),j=1;else return;g(b)}}function g(a){o?a.data.preventDefault(1):j&&a.data.stopPropagation()}var f=CKEDITOR.dialog._.dialogDefinitions[b],
+h=CKEDITOR.tools.clone(W),m=a.config.dialog_buttonsOrder||"OS",k=a.lang.dir,i={},o,j;("OS"==m&&CKEDITOR.env.mac||"rtl"==m&&"ltr"==k||"ltr"==m&&"rtl"==k)&&h.buttons.reverse();f=CKEDITOR.tools.extend(f(a),h);f=CKEDITOR.tools.clone(f);f=new L(this,f);h=R(a);this._={editor:a,element:h.element,name:b,contentSize:{width:0,height:0},size:{width:0,height:0},contents:{},buttons:{},accessKeyMap:{},tabs:{},tabIdList:[],currentTabId:null,currentTabIndex:null,pageCount:0,lastTab:null,tabBarMode:!1,focusList:[],
+currentFocusIndex:0,hasFocus:!1};this.parts=h.parts;CKEDITOR.tools.setTimeout(function(){a.fire("ariaWidget",this.parts.contents)},0,this);h={position:CKEDITOR.env.ie6Compat?"absolute":"fixed",top:0,visibility:"hidden"};h["rtl"==k?"right":"left"]=0;this.parts.dialog.setStyles(h);CKEDITOR.event.call(this);this.definition=f=CKEDITOR.fire("dialogDefinition",{name:b,definition:f},a).definition;if(!("removeDialogTabs"in a._)&&a.config.removeDialogTabs){h=a.config.removeDialogTabs.split(";");for(k=0;k<
+h.length;k++)if(m=h[k].split(":"),2==m.length){var n=m[0];i[n]||(i[n]=[]);i[n].push(m[1])}a._.removeDialogTabs=i}if(a._.removeDialogTabs&&(i=a._.removeDialogTabs[b]))for(k=0;k<i.length;k++)f.removeContents(i[k]);if(f.onLoad)this.on("load",f.onLoad);if(f.onShow)this.on("show",f.onShow);if(f.onHide)this.on("hide",f.onHide);if(f.onOk)this.on("ok",function(b){a.fire("saveSnapshot");setTimeout(function(){a.fire("saveSnapshot")},0);!1===f.onOk.call(this,b)&&(b.data.hide=!1)});if(f.onCancel)this.on("cancel",
+function(a){!1===f.onCancel.call(this,a)&&(a.data.hide=!1)});var l=this,p=function(a){var b=l._.contents,c=!1,d;for(d in b)for(var f in b[d])if(c=a.call(this,b[d][f]))return};this.on("ok",function(a){p(function(b){if(b.validate){var c=b.validate(this),d="string"==typeof c||!1===c;d&&(a.data.hide=!1,a.stop());P.call(b,!d,"string"==typeof c?c:void 0);return d}})},this,null,0);this.on("cancel",function(b){p(function(c){if(c.isChanged())return!a.config.dialog_noConfirmCancel&&!confirm(a.lang.common.confirmCancel)&&
+(b.data.hide=!1),!0})},this,null,0);this.parts.close.on("click",function(a){!1!==this.fire("cancel",{hide:!0}).hide&&this.hide();a.data.preventDefault()},this);this.changeFocus=e;var v=this._.element;a.focusManager.add(v,1);this.on("show",function(){v.on("keydown",d,this);if(CKEDITOR.env.gecko)v.on("keypress",g,this)});this.on("hide",function(){v.removeListener("keydown",d);CKEDITOR.env.gecko&&v.removeListener("keypress",g);p(function(a){Q.apply(a)})});this.on("iframeAdded",function(a){(new CKEDITOR.dom.document(a.data.iframe.$.contentWindow.document)).on("keydown",
+d,this,null,0)});this.on("show",function(){c();if(a.config.dialog_startupFocusTab&&1<l._.pageCount)l._.tabBarMode=!0,l._.tabs[l._.currentTabId][0].focus();else if(!this._.hasFocus)if(this._.currentFocusIndex=-1,f.onFocus){var b=f.onFocus.call(this);b&&b.focus()}else e(1)},this,null,4294967295);if(CKEDITOR.env.ie6Compat)this.on("load",function(){var a=this.getElement(),b=a.getFirst();b.remove();b.appendTo(a)},this);U(this);V(this);(new CKEDITOR.dom.text(f.title,CKEDITOR.document)).appendTo(this.parts.title);
+for(k=0;k<f.contents.length;k++)(i=f.contents[k])&&this.addPage(i);this.parts.tabs.on("click",function(a){var b=a.data.getTarget();b.hasClass("cke_dialog_tab")&&(b=b.$.id,this.selectPage(b.substring(4,b.lastIndexOf("_"))),this._.tabBarMode&&(this._.tabBarMode=!1,this._.currentFocusIndex=-1,e(1)),a.data.preventDefault())},this);k=[];i=CKEDITOR.dialog._.uiElementBuilders.hbox.build(this,{type:"hbox",className:"cke_dialog_footer_buttons",widths:[],children:f.buttons},k).getChild();this.parts.footer.setHtml(k.join(""));
+for(k=0;k<i.length;k++)this._.buttons[i[k].id]=i[k]};CKEDITOR.dialog.prototype={destroy:function(){this.hide();this._.element.remove()},resize:function(){return function(a,b){if(!this._.contentSize||!(this._.contentSize.width==a&&this._.contentSize.height==b))CKEDITOR.dialog.fire("resize",{dialog:this,width:a,height:b},this._.editor),this.fire("resize",{width:a,height:b},this._.editor),this.parts.contents.setStyles({width:a+"px",height:b+"px"}),"rtl"==this._.editor.lang.dir&&this._.position&&(this._.position.x=
+CKEDITOR.document.getWindow().getViewPaneSize().width-this._.contentSize.width-parseInt(this._.element.getFirst().getStyle("right"),10)),this._.contentSize={width:a,height:b}}}(),getSize:function(){var a=this._.element.getFirst();return{width:a.$.offsetWidth||0,height:a.$.offsetHeight||0}},move:function(a,b,c){var e=this._.element.getFirst(),d="rtl"==this._.editor.lang.dir,g="fixed"==e.getComputedStyle("position");CKEDITOR.env.ie&&e.setStyle("zoom","100%");if(!g||!this._.position||!(this._.position.x==
+a&&this._.position.y==b))this._.position={x:a,y:b},g||(g=CKEDITOR.document.getWindow().getScrollPosition(),a+=g.x,b+=g.y),d&&(g=this.getSize(),a=CKEDITOR.document.getWindow().getViewPaneSize().width-g.width-a),b={top:(0<b?b:0)+"px"},b[d?"right":"left"]=(0<a?a:0)+"px",e.setStyles(b),c&&(this._.moved=1)},getPosition:function(){return CKEDITOR.tools.extend({},this._.position)},show:function(){var a=this._.element,b=this.definition;!a.getParent()||!a.getParent().equals(CKEDITOR.document.getBody())?a.appendTo(CKEDITOR.document.getBody()):
+a.setStyle("display","block");this.resize(this._.contentSize&&this._.contentSize.width||b.width||b.minWidth,this._.contentSize&&this._.contentSize.height||b.height||b.minHeight);this.reset();this.selectPage(this.definition.contents[0].id);null===CKEDITOR.dialog._.currentZIndex&&(CKEDITOR.dialog._.currentZIndex=this._.editor.config.baseFloatZIndex);this._.element.getFirst().setStyle("z-index",CKEDITOR.dialog._.currentZIndex+=10);null===CKEDITOR.dialog._.currentTop?(CKEDITOR.dialog._.currentTop=this,
+this._.parentDialog=null,J(this._.editor)):(this._.parentDialog=CKEDITOR.dialog._.currentTop,this._.parentDialog.getElement().getFirst().$.style.zIndex-=Math.floor(this._.editor.config.baseFloatZIndex/2),CKEDITOR.dialog._.currentTop=this);a.on("keydown",M);a.on("keyup",N);this._.hasFocus=!1;for(var c in b.contents)if(b.contents[c]){var a=b.contents[c],e=this._.tabs[a.id],d=a.requiredContent,g=0;if(e){for(var f in this._.contents[a.id]){var h=this._.contents[a.id][f];"hbox"==h.type||("vbox"==h.type||
+!h.getInputElement())||(h.requiredContent&&!this._.editor.activeFilter.check(h.requiredContent)?h.disable():(h.enable(),g++))}!g||d&&!this._.editor.activeFilter.check(d)?e[0].addClass("cke_dialog_tab_disabled"):e[0].removeClass("cke_dialog_tab_disabled")}}CKEDITOR.tools.setTimeout(function(){this.layout();T(this);this.parts.dialog.setStyle("visibility","");this.fireOnce("load",{});CKEDITOR.ui.fire("ready",this);this.fire("show",{});this._.editor.fire("dialogShow",this);this._.parentDialog||this._.editor.focusManager.lock();
+this.foreach(function(a){a.setInitValue&&a.setInitValue()})},100,this)},layout:function(){var a=this.parts.dialog,b=this.getSize(),c=CKEDITOR.document.getWindow().getViewPaneSize(),e=(c.width-b.width)/2,d=(c.height-b.height)/2;CKEDITOR.env.ie6Compat||(b.height+(0<d?d:0)>c.height||b.width+(0<e?e:0)>c.width?a.setStyle("position","absolute"):a.setStyle("position","fixed"));this.move(this._.moved?this._.position.x:e,this._.moved?this._.position.y:d)},foreach:function(a){for(var b in this._.contents)for(var c in this._.contents[b])a.call(this,
+this._.contents[b][c]);return this},reset:function(){var a=function(a){a.reset&&a.reset(1)};return function(){this.foreach(a);return this}}(),setupContent:function(){var a=arguments;this.foreach(function(b){b.setup&&b.setup.apply(b,a)})},commitContent:function(){var a=arguments;this.foreach(function(b){CKEDITOR.env.ie&&this._.currentFocusIndex==b.focusIndex&&b.getInputElement().$.blur();b.commit&&b.commit.apply(b,a)})},hide:function(){if(this.parts.dialog.isVisible()){this.fire("hide",{});this._.editor.fire("dialogHide",
+this);this.selectPage(this._.tabIdList[0]);var a=this._.element;a.setStyle("display","none");this.parts.dialog.setStyle("visibility","hidden");for(X(this);CKEDITOR.dialog._.currentTop!=this;)CKEDITOR.dialog._.currentTop.hide();if(this._.parentDialog){var b=this._.parentDialog.getElement().getFirst();b.setStyle("z-index",parseInt(b.$.style.zIndex,10)+Math.floor(this._.editor.config.baseFloatZIndex/2))}else K(this._.editor);if(CKEDITOR.dialog._.currentTop=this._.parentDialog)CKEDITOR.dialog._.currentZIndex-=
+10;else{CKEDITOR.dialog._.currentZIndex=null;a.removeListener("keydown",M);a.removeListener("keyup",N);var c=this._.editor;c.focus();setTimeout(function(){c.focusManager.unlock();CKEDITOR.env.iOS&&c.window.focus()},0)}delete this._.parentDialog;this.foreach(function(a){a.resetInitValue&&a.resetInitValue()})}},addPage:function(a){if(!a.requiredContent||this._.editor.filter.check(a.requiredContent)){for(var b=[],c=a.label?' title="'+CKEDITOR.tools.htmlEncode(a.label)+'"':"",e=CKEDITOR.dialog._.uiElementBuilders.vbox.build(this,
+{type:"vbox",className:"cke_dialog_page_contents",children:a.elements,expand:!!a.expand,padding:a.padding,style:a.style||"width: 100%;"},b),d=this._.contents[a.id]={},g=e.getChild(),f=0;e=g.shift();)!e.notAllowed&&("hbox"!=e.type&&"vbox"!=e.type)&&f++,d[e.id]=e,"function"==typeof e.getChild&&g.push.apply(g,e.getChild());f||(a.hidden=!0);b=CKEDITOR.dom.element.createFromHtml(b.join(""));b.setAttribute("role","tabpanel");e=CKEDITOR.env;d="cke_"+a.id+"_"+CKEDITOR.tools.getNextNumber();c=CKEDITOR.dom.element.createFromHtml(['<a class="cke_dialog_tab"',
+0<this._.pageCount?" cke_last":"cke_first",c,a.hidden?' style="display:none"':"",' id="',d,'"',e.gecko&&!e.hc?"":' href="javascript:void(0)"',' tabIndex="-1" hidefocus="true" role="tab">',a.label,"</a>"].join(""));b.setAttribute("aria-labelledby",d);this._.tabs[a.id]=[c,b];this._.tabIdList.push(a.id);!a.hidden&&this._.pageCount++;this._.lastTab=c;this.updateStyle();b.setAttribute("name",a.id);b.appendTo(this.parts.contents);c.unselectable();this.parts.tabs.append(c);a.accessKey&&(O(this,this,"CTRL+"+
+a.accessKey,Y,Z),this._.accessKeyMap["CTRL+"+a.accessKey]=a.id)}},selectPage:function(a){if(this._.currentTabId!=a&&!this._.tabs[a][0].hasClass("cke_dialog_tab_disabled")&&!1!==this.fire("selectPage",{page:a,currentPage:this._.currentTabId})){for(var b in this._.tabs){var c=this._.tabs[b][0],e=this._.tabs[b][1];b!=a&&(c.removeClass("cke_dialog_tab_selected"),e.hide());e.setAttribute("aria-hidden",b!=a)}var d=this._.tabs[a];d[0].addClass("cke_dialog_tab_selected");CKEDITOR.env.ie6Compat||CKEDITOR.env.ie7Compat?
+(G(d[1]),d[1].show(),setTimeout(function(){G(d[1],1)},0)):d[1].show();this._.currentTabId=a;this._.currentTabIndex=CKEDITOR.tools.indexOf(this._.tabIdList,a)}},updateStyle:function(){this.parts.dialog[(1===this._.pageCount?"add":"remove")+"Class"]("cke_single_page")},hidePage:function(a){var b=this._.tabs[a]&&this._.tabs[a][0];b&&(1!=this._.pageCount&&b.isVisible())&&(a==this._.currentTabId&&this.selectPage(t.call(this)),b.hide(),this._.pageCount--,this.updateStyle())},showPage:function(a){if(a=this._.tabs[a]&&
+this._.tabs[a][0])a.show(),this._.pageCount++,this.updateStyle()},getElement:function(){return this._.element},getName:function(){return this._.name},getContentElement:function(a,b){var c=this._.contents[a];return c&&c[b]},getValueOf:function(a,b){return this.getContentElement(a,b).getValue()},setValueOf:function(a,b,c){return this.getContentElement(a,b).setValue(c)},getButton:function(a){return this._.buttons[a]},click:function(a){return this._.buttons[a].click()},disableButton:function(a){return this._.buttons[a].disable()},
+enableButton:function(a){return this._.buttons[a].enable()},getPageCount:function(){return this._.pageCount},getParentEditor:function(){return this._.editor},getSelectedElement:function(){return this.getParentEditor().getSelection().getSelectedElement()},addFocusable:function(a,b){if("undefined"==typeof b)b=this._.focusList.length,this._.focusList.push(new H(this,a,b));else{this._.focusList.splice(b,0,new H(this,a,b));for(var c=b+1;c<this._.focusList.length;c++)this._.focusList[c].focusIndex++}}};
+CKEDITOR.tools.extend(CKEDITOR.dialog,{add:function(a,b){if(!this._.dialogDefinitions[a]||"function"==typeof b)this._.dialogDefinitions[a]=b},exists:function(a){return!!this._.dialogDefinitions[a]},getCurrent:function(){return CKEDITOR.dialog._.currentTop},isTabEnabled:function(a,b,c){a=a.config.removeDialogTabs;return!(a&&a.match(RegExp("(?:^|;)"+b+":"+c+"(?:$|;)","i")))},okButton:function(){var a=function(a,c){c=c||{};return CKEDITOR.tools.extend({id:"ok",type:"button",label:a.lang.common.ok,"class":"cke_dialog_ui_button_ok",
+onClick:function(a){a=a.data.dialog;!1!==a.fire("ok",{hide:!0}).hide&&a.hide()}},c,!0)};a.type="button";a.override=function(b){return CKEDITOR.tools.extend(function(c){return a(c,b)},{type:"button"},!0)};return a}(),cancelButton:function(){var a=function(a,c){c=c||{};return CKEDITOR.tools.extend({id:"cancel",type:"button",label:a.lang.common.cancel,"class":"cke_dialog_ui_button_cancel",onClick:function(a){a=a.data.dialog;!1!==a.fire("cancel",{hide:!0}).hide&&a.hide()}},c,!0)};a.type="button";a.override=
+function(b){return CKEDITOR.tools.extend(function(c){return a(c,b)},{type:"button"},!0)};return a}(),addUIElement:function(a,b){this._.uiElementBuilders[a]=b}});CKEDITOR.dialog._={uiElementBuilders:{},dialogDefinitions:{},currentTop:null,currentZIndex:null};CKEDITOR.event.implementOn(CKEDITOR.dialog);CKEDITOR.event.implementOn(CKEDITOR.dialog.prototype);var W={resizable:CKEDITOR.DIALOG_RESIZE_BOTH,minWidth:600,minHeight:400,buttons:[CKEDITOR.dialog.okButton,CKEDITOR.dialog.cancelButton]},z=function(a,
+b,c){for(var e=0,d;d=a[e];e++)if(d.id==b||c&&d[c]&&(d=z(d[c],b,c)))return d;return null},A=function(a,b,c,e,d){if(c){for(var g=0,f;f=a[g];g++){if(f.id==c)return a.splice(g,0,b),b;if(e&&f[e]&&(f=A(f[e],b,c,e,!0)))return f}if(d)return null}a.push(b);return b},B=function(a,b,c){for(var e=0,d;d=a[e];e++){if(d.id==b)return a.splice(e,1);if(c&&d[c]&&(d=B(d[c],b,c)))return d}return null},L=function(a,b){this.dialog=a;for(var c=b.contents,e=0,d;d=c[e];e++)c[e]=d&&new I(a,d);CKEDITOR.tools.extend(this,b)};
+L.prototype={getContents:function(a){return z(this.contents,a)},getButton:function(a){return z(this.buttons,a)},addContents:function(a,b){return A(this.contents,a,b)},addButton:function(a,b){return A(this.buttons,a,b)},removeContents:function(a){B(this.contents,a)},removeButton:function(a){B(this.buttons,a)}};I.prototype={get:function(a){return z(this.elements,a,"children")},add:function(a,b){return A(this.elements,a,b,"children")},remove:function(a){B(this.elements,a,"children")}};var F,w={},q,s=
+{},M=function(a){var b=a.data.$.ctrlKey||a.data.$.metaKey,c=a.data.$.altKey,e=a.data.$.shiftKey,d=String.fromCharCode(a.data.$.keyCode);if((b=s[(b?"CTRL+":"")+(c?"ALT+":"")+(e?"SHIFT+":"")+d])&&b.length)b=b[b.length-1],b.keydown&&b.keydown.call(b.uiElement,b.dialog,b.key),a.data.preventDefault()},N=function(a){var b=a.data.$.ctrlKey||a.data.$.metaKey,c=a.data.$.altKey,e=a.data.$.shiftKey,d=String.fromCharCode(a.data.$.keyCode);if((b=s[(b?"CTRL+":"")+(c?"ALT+":"")+(e?"SHIFT+":"")+d])&&b.length)b=b[b.length-
+1],b.keyup&&(b.keyup.call(b.uiElement,b.dialog,b.key),a.data.preventDefault())},O=function(a,b,c,e,d){(s[c]||(s[c]=[])).push({uiElement:a,dialog:b,key:c,keyup:d||a.accessKeyUp,keydown:e||a.accessKeyDown})},X=function(a){for(var b in s){for(var c=s[b],e=c.length-1;0<=e;e--)(c[e].dialog==a||c[e].uiElement==a)&&c.splice(e,1);0===c.length&&delete s[b]}},Z=function(a,b){a._.accessKeyMap[b]&&a.selectPage(a._.accessKeyMap[b])},Y=function(){};(function(){CKEDITOR.ui.dialog={uiElement:function(a,b,c,e,d,g,
+f){if(!(4>arguments.length)){var h=(e.call?e(b):e)||"div",m=["<",h," "],k=(d&&d.call?d(b):d)||{},i=(g&&g.call?g(b):g)||{},o=(f&&f.call?f.call(this,a,b):f)||"",j=this.domId=i.id||CKEDITOR.tools.getNextId()+"_uiElement";b.requiredContent&&!a.getParentEditor().filter.check(b.requiredContent)&&(k.display="none",this.notAllowed=!0);i.id=j;var n={};b.type&&(n["cke_dialog_ui_"+b.type]=1);b.className&&(n[b.className]=1);b.disabled&&(n.cke_disabled=1);for(var l=i["class"]&&i["class"].split?i["class"].split(" "):
+[],j=0;j<l.length;j++)l[j]&&(n[l[j]]=1);l=[];for(j in n)l.push(j);i["class"]=l.join(" ");b.title&&(i.title=b.title);n=(b.style||"").split(";");b.align&&(l=b.align,k["margin-left"]="left"==l?0:"auto",k["margin-right"]="right"==l?0:"auto");for(j in k)n.push(j+":"+k[j]);b.hidden&&n.push("display:none");for(j=n.length-1;0<=j;j--)""===n[j]&&n.splice(j,1);0<n.length&&(i.style=(i.style?i.style+"; ":"")+n.join("; "));for(j in i)m.push(j+'="'+CKEDITOR.tools.htmlEncode(i[j])+'" ');m.push(">",o,"</",h,">");
+c.push(m.join(""));(this._||(this._={})).dialog=a;"boolean"==typeof b.isChanged&&(this.isChanged=function(){return b.isChanged});"function"==typeof b.isChanged&&(this.isChanged=b.isChanged);"function"==typeof b.setValue&&(this.setValue=CKEDITOR.tools.override(this.setValue,function(a){return function(c){a.call(this,b.setValue.call(this,c))}}));"function"==typeof b.getValue&&(this.getValue=CKEDITOR.tools.override(this.getValue,function(a){return function(){return b.getValue.call(this,a.call(this))}}));
+CKEDITOR.event.implementOn(this);this.registerEvents(b);this.accessKeyUp&&(this.accessKeyDown&&b.accessKey)&&O(this,a,"CTRL+"+b.accessKey);var p=this;a.on("load",function(){var b=p.getInputElement();if(b){var c=p.type in{checkbox:1,ratio:1}&&CKEDITOR.env.ie&&CKEDITOR.env.version<8?"cke_dialog_ui_focused":"";b.on("focus",function(){a._.tabBarMode=false;a._.hasFocus=true;p.fire("focus");c&&this.addClass(c)});b.on("blur",function(){p.fire("blur");c&&this.removeClass(c)})}});CKEDITOR.tools.extend(this,
+b);this.keyboardFocusable&&(this.tabIndex=b.tabIndex||0,this.focusIndex=a._.focusList.push(this)-1,this.on("focus",function(){a._.currentFocusIndex=p.focusIndex}))}},hbox:function(a,b,c,e,d){if(!(4>arguments.length)){this._||(this._={});var g=this._.children=b,f=d&&d.widths||null,h=d&&d.height||null,m,k={role:"presentation"};d&&d.align&&(k.align=d.align);CKEDITOR.ui.dialog.uiElement.call(this,a,d||{type:"hbox"},e,"table",{},k,function(){var a=['<tbody><tr class="cke_dialog_ui_hbox">'];for(m=0;m<c.length;m++){var b=
+"cke_dialog_ui_hbox_child",e=[];0===m&&(b="cke_dialog_ui_hbox_first");m==c.length-1&&(b="cke_dialog_ui_hbox_last");a.push('<td class="',b,'" role="presentation" ');f?f[m]&&e.push("width:"+r(f[m])):e.push("width:"+Math.floor(100/c.length)+"%");h&&e.push("height:"+r(h));d&&void 0!==d.padding&&e.push("padding:"+r(d.padding));CKEDITOR.env.ie&&(CKEDITOR.env.quirks&&g[m].align)&&e.push("text-align:"+g[m].align);0<e.length&&a.push('style="'+e.join("; ")+'" ');a.push(">",c[m],"</td>")}a.push("</tr></tbody>");
+return a.join("")})}},vbox:function(a,b,c,e,d){if(!(3>arguments.length)){this._||(this._={});var g=this._.children=b,f=d&&d.width||null,h=d&&d.heights||null;CKEDITOR.ui.dialog.uiElement.call(this,a,d||{type:"vbox"},e,"div",null,{role:"presentation"},function(){var b=['<table role="presentation" cellspacing="0" border="0" '];b.push('style="');d&&d.expand&&b.push("height:100%;");b.push("width:"+r(f||"100%"),";");CKEDITOR.env.webkit&&b.push("float:none;");b.push('"');b.push('align="',CKEDITOR.tools.htmlEncode(d&&
+d.align||("ltr"==a.getParentEditor().lang.dir?"left":"right")),'" ');b.push("><tbody>");for(var e=0;e<c.length;e++){var i=[];b.push('<tr><td role="presentation" ');f&&i.push("width:"+r(f||"100%"));h?i.push("height:"+r(h[e])):d&&d.expand&&i.push("height:"+Math.floor(100/c.length)+"%");d&&void 0!==d.padding&&i.push("padding:"+r(d.padding));CKEDITOR.env.ie&&(CKEDITOR.env.quirks&&g[e].align)&&i.push("text-align:"+g[e].align);0<i.length&&b.push('style="',i.join("; "),'" ');b.push(' class="cke_dialog_ui_vbox_child">',
+c[e],"</td></tr>")}b.push("</tbody></table>");return b.join("")})}}}})();CKEDITOR.ui.dialog.uiElement.prototype={getElement:function(){return CKEDITOR.document.getById(this.domId)},getInputElement:function(){return this.getElement()},getDialog:function(){return this._.dialog},setValue:function(a,b){this.getInputElement().setValue(a);!b&&this.fire("change",{value:a});return this},getValue:function(){return this.getInputElement().getValue()},isChanged:function(){return!1},selectParentTab:function(){for(var a=
+this.getInputElement();(a=a.getParent())&&-1==a.$.className.search("cke_dialog_page_contents"););if(!a)return this;a=a.getAttribute("name");this._.dialog._.currentTabId!=a&&this._.dialog.selectPage(a);return this},focus:function(){this.selectParentTab().getInputElement().focus();return this},registerEvents:function(a){var b=/^on([A-Z]\w+)/,c,e=function(a,b,c,d){b.on("load",function(){a.getInputElement().on(c,d,a)})},d;for(d in a)if(c=d.match(b))this.eventProcessors[d]?this.eventProcessors[d].call(this,
+this._.dialog,a[d]):e(this,this._.dialog,c[1].toLowerCase(),a[d]);return this},eventProcessors:{onLoad:function(a,b){a.on("load",b,this)},onShow:function(a,b){a.on("show",b,this)},onHide:function(a,b){a.on("hide",b,this)}},accessKeyDown:function(){this.focus()},accessKeyUp:function(){},disable:function(){var a=this.getElement();this.getInputElement().setAttribute("disabled","true");a.addClass("cke_disabled")},enable:function(){var a=this.getElement();this.getInputElement().removeAttribute("disabled");
+a.removeClass("cke_disabled")},isEnabled:function(){return!this.getElement().hasClass("cke_disabled")},isVisible:function(){return this.getInputElement().isVisible()},isFocusable:function(){return!this.isEnabled()||!this.isVisible()?!1:!0}};CKEDITOR.ui.dialog.hbox.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.uiElement,{getChild:function(a){if(1>arguments.length)return this._.children.concat();a.splice||(a=[a]);return 2>a.length?this._.children[a[0]]:this._.children[a[0]]&&this._.children[a[0]].getChild?
+this._.children[a[0]].getChild(a.slice(1,a.length)):null}},!0);CKEDITOR.ui.dialog.vbox.prototype=new CKEDITOR.ui.dialog.hbox;(function(){var a={build:function(a,c,e){for(var d=c.children,g,f=[],h=[],m=0;m<d.length&&(g=d[m]);m++){var k=[];f.push(k);h.push(CKEDITOR.dialog._.uiElementBuilders[g.type].build(a,g,k))}return new CKEDITOR.ui.dialog[c.type](a,h,f,e,c)}};CKEDITOR.dialog.addUIElement("hbox",a);CKEDITOR.dialog.addUIElement("vbox",a)})();CKEDITOR.dialogCommand=function(a,b){this.dialogName=a;
+CKEDITOR.tools.extend(this,b,!0)};CKEDITOR.dialogCommand.prototype={exec:function(a){a.openDialog(this.dialogName)},canUndo:!1,editorFocus:1};(function(){var a=/^([a]|[^a])+$/,b=/^\d*$/,c=/^\d*(?:\.\d+)?$/,e=/^(((\d*(\.\d+))|(\d*))(px|\%)?)?$/,d=/^(((\d*(\.\d+))|(\d*))(px|em|ex|in|cm|mm|pt|pc|\%)?)?$/i,g=/^(\s*[\w-]+\s*:\s*[^:;]+(?:;|$))*$/;CKEDITOR.VALIDATE_OR=1;CKEDITOR.VALIDATE_AND=2;CKEDITOR.dialog.validate={functions:function(){var a=arguments;return function(){var b=this&&this.getValue?this.getValue():
+a[0],c,d=CKEDITOR.VALIDATE_AND,e=[],g;for(g=0;g<a.length;g++)if("function"==typeof a[g])e.push(a[g]);else break;g<a.length&&"string"==typeof a[g]&&(c=a[g],g++);g<a.length&&"number"==typeof a[g]&&(d=a[g]);var j=d==CKEDITOR.VALIDATE_AND?!0:!1;for(g=0;g<e.length;g++)j=d==CKEDITOR.VALIDATE_AND?j&&e[g](b):j||e[g](b);return!j?c:!0}},regex:function(a,b){return function(c){c=this&&this.getValue?this.getValue():c;return!a.test(c)?b:!0}},notEmpty:function(b){return this.regex(a,b)},integer:function(a){return this.regex(b,
+a)},number:function(a){return this.regex(c,a)},cssLength:function(a){return this.functions(function(a){return d.test(CKEDITOR.tools.trim(a))},a)},htmlLength:function(a){return this.functions(function(a){return e.test(CKEDITOR.tools.trim(a))},a)},inlineStyle:function(a){return this.functions(function(a){return g.test(CKEDITOR.tools.trim(a))},a)},equals:function(a,b){return this.functions(function(b){return b==a},b)},notEqual:function(a,b){return this.functions(function(b){return b!=a},b)}};CKEDITOR.on("instanceDestroyed",
+function(a){if(CKEDITOR.tools.isEmpty(CKEDITOR.instances)){for(var b;b=CKEDITOR.dialog._.currentTop;)b.hide();for(var c in w)w[c].remove();w={}}var a=a.editor._.storedDialogs,d;for(d in a)a[d].destroy()})})();CKEDITOR.tools.extend(CKEDITOR.editor.prototype,{openDialog:function(a,b){var c=null,e=CKEDITOR.dialog._.dialogDefinitions[a];null===CKEDITOR.dialog._.currentTop&&J(this);if("function"==typeof e)c=this._.storedDialogs||(this._.storedDialogs={}),c=c[a]||(c[a]=new CKEDITOR.dialog(this,a)),b&&b.call(c,
+c),c.show();else{if("failed"==e)throw K(this),Error('[CKEDITOR.dialog.openDialog] Dialog "'+a+'" failed when loading definition.');"string"==typeof e&&CKEDITOR.scriptLoader.load(CKEDITOR.getUrl(e),function(){"function"!=typeof CKEDITOR.dialog._.dialogDefinitions[a]&&(CKEDITOR.dialog._.dialogDefinitions[a]="failed");this.openDialog(a,b)},this,0,1)}CKEDITOR.skin.loadPart("dialog");return c}})})();
+CKEDITOR.plugins.add("dialog",{requires:"dialogui",init:function(t){t.on("doubleclick",function(u){u.data.dialog&&t.openDialog(u.data.dialog)},null,null,999)}});CKEDITOR.plugins.add("about",{requires:"dialog",init:function(a){var b=a.addCommand("about",new CKEDITOR.dialogCommand("about"));b.modes={wysiwyg:1,source:1};b.canUndo=!1;b.readOnly=1;a.ui.addButton&&a.ui.addButton("About",{label:a.lang.about.title,command:"about",toolbar:"about"});CKEDITOR.dialog.add("about",this.path+"dialogs/about.js")}});(function(){CKEDITOR.plugins.add("a11yhelp",{requires:"dialog",availableLangs:{af:1,ar:1,bg:1,ca:1,cs:1,cy:1,da:1,de:1,el:1,en:1,"en-gb":1,eo:1,es:1,et:1,fa:1,fi:1,fr:1,"fr-ca":1,gl:1,gu:1,he:1,hi:1,hr:1,hu:1,id:1,it:1,ja:1,km:1,ko:1,ku:1,lt:1,lv:1,mk:1,mn:1,nb:1,nl:1,no:1,pl:1,pt:1,"pt-br":1,ro:1,ru:1,si:1,sk:1,sl:1,sq:1,sr:1,"sr-latn":1,sv:1,th:1,tr:1,tt:1,ug:1,uk:1,vi:1,zh:1,"zh-cn":1},init:function(b){var c=this;b.addCommand("a11yHelp",{exec:function(){var a=b.langCode,a=c.availableLangs[a]?a:
+c.availableLangs[a.replace(/-.*/,"")]?a.replace(/-.*/,""):"en";CKEDITOR.scriptLoader.load(CKEDITOR.getUrl(c.path+"dialogs/lang/"+a+".js"),function(){b.lang.a11yhelp=c.langEntries[a];b.openDialog("a11yHelp")})},modes:{wysiwyg:1,source:1},readOnly:1,canUndo:!1});b.setKeystroke(CKEDITOR.ALT+48,"a11yHelp");CKEDITOR.dialog.add("a11yHelp",this.path+"dialogs/a11yhelp.js");b.on("ariaEditorHelpLabel",function(a){a.data.label=b.lang.common.editorHelp})}})})();CKEDITOR.plugins.add("basicstyles",{init:function(c){var e=0,d=function(g,d,b,a){if(a){var a=new CKEDITOR.style(a),f=h[b];f.unshift(a);c.attachStyleStateChange(a,function(a){!c.readOnly&&c.getCommand(b).setState(a)});c.addCommand(b,new CKEDITOR.styleCommand(a,{contentForms:f}));c.ui.addButton&&c.ui.addButton(g,{label:d,command:b,toolbar:"basicstyles,"+(e+=10)})}},h={bold:["strong","b",["span",function(a){a=a.styles["font-weight"];return"bold"==a||700<=+a}]],italic:["em","i",["span",function(a){return"italic"==
+a.styles["font-style"]}]],underline:["u",["span",function(a){return"underline"==a.styles["text-decoration"]}]],strike:["s","strike",["span",function(a){return"line-through"==a.styles["text-decoration"]}]],subscript:["sub"],superscript:["sup"]},b=c.config,a=c.lang.basicstyles;d("Bold",a.bold,"bold",b.coreStyles_bold);d("Italic",a.italic,"italic",b.coreStyles_italic);d("Underline",a.underline,"underline",b.coreStyles_underline);d("Strike",a.strike,"strike",b.coreStyles_strike);d("Subscript",a.subscript,
+"subscript",b.coreStyles_subscript);d("Superscript",a.superscript,"superscript",b.coreStyles_superscript);c.setKeystroke([[CKEDITOR.CTRL+66,"bold"],[CKEDITOR.CTRL+73,"italic"],[CKEDITOR.CTRL+85,"underline"]])}});CKEDITOR.config.coreStyles_bold={element:"strong",overrides:"b"};CKEDITOR.config.coreStyles_italic={element:"em",overrides:"i"};CKEDITOR.config.coreStyles_underline={element:"u"};CKEDITOR.config.coreStyles_strike={element:"s",overrides:"strike"};CKEDITOR.config.coreStyles_subscript={element:"sub"};
+CKEDITOR.config.coreStyles_superscript={element:"sup"};(function(){var k={exec:function(g){var a=g.getCommand("blockquote").state,i=g.getSelection(),c=i&&i.getRanges()[0];if(c){var h=i.createBookmarks();if(CKEDITOR.env.ie){var e=h[0].startNode,b=h[0].endNode,d;if(e&&"blockquote"==e.getParent().getName())for(d=e;d=d.getNext();)if(d.type==CKEDITOR.NODE_ELEMENT&&d.isBlockBoundary()){e.move(d,!0);break}if(b&&"blockquote"==b.getParent().getName())for(d=b;d=d.getPrevious();)if(d.type==CKEDITOR.NODE_ELEMENT&&d.isBlockBoundary()){b.move(d);break}}var f=c.createIterator();
+f.enlargeBr=g.config.enterMode!=CKEDITOR.ENTER_BR;if(a==CKEDITOR.TRISTATE_OFF){for(e=[];a=f.getNextParagraph();)e.push(a);1>e.length&&(a=g.document.createElement(g.config.enterMode==CKEDITOR.ENTER_P?"p":"div"),b=h.shift(),c.insertNode(a),a.append(new CKEDITOR.dom.text("",g.document)),c.moveToBookmark(b),c.selectNodeContents(a),c.collapse(!0),b=c.createBookmark(),e.push(a),h.unshift(b));d=e[0].getParent();c=[];for(b=0;b<e.length;b++)a=e[b],d=d.getCommonAncestor(a.getParent());for(a={table:1,tbody:1,
+tr:1,ol:1,ul:1};a[d.getName()];)d=d.getParent();for(b=null;0<e.length;){for(a=e.shift();!a.getParent().equals(d);)a=a.getParent();a.equals(b)||c.push(a);b=a}for(;0<c.length;)if(a=c.shift(),"blockquote"==a.getName()){for(b=new CKEDITOR.dom.documentFragment(g.document);a.getFirst();)b.append(a.getFirst().remove()),e.push(b.getLast());b.replace(a)}else e.push(a);c=g.document.createElement("blockquote");for(c.insertBefore(e[0]);0<e.length;)a=e.shift(),c.append(a)}else if(a==CKEDITOR.TRISTATE_ON){b=[];
+for(d={};a=f.getNextParagraph();){for(e=c=null;a.getParent();){if("blockquote"==a.getParent().getName()){c=a.getParent();e=a;break}a=a.getParent()}c&&(e&&!e.getCustomData("blockquote_moveout"))&&(b.push(e),CKEDITOR.dom.element.setMarker(d,e,"blockquote_moveout",!0))}CKEDITOR.dom.element.clearAllMarkers(d);a=[];e=[];for(d={};0<b.length;)f=b.shift(),c=f.getParent(),f.getPrevious()?f.getNext()?(f.breakParent(f.getParent()),e.push(f.getNext())):f.remove().insertAfter(c):f.remove().insertBefore(c),c.getCustomData("blockquote_processed")||
+(e.push(c),CKEDITOR.dom.element.setMarker(d,c,"blockquote_processed",!0)),a.push(f);CKEDITOR.dom.element.clearAllMarkers(d);for(b=e.length-1;0<=b;b--){c=e[b];a:{d=c;for(var f=0,k=d.getChildCount(),j=void 0;f<k&&(j=d.getChild(f));f++)if(j.type==CKEDITOR.NODE_ELEMENT&&j.isBlockBoundary()){d=!1;break a}d=!0}d&&c.remove()}if(g.config.enterMode==CKEDITOR.ENTER_BR)for(c=!0;a.length;)if(f=a.shift(),"div"==f.getName()){b=new CKEDITOR.dom.documentFragment(g.document);c&&(f.getPrevious()&&!(f.getPrevious().type==
+CKEDITOR.NODE_ELEMENT&&f.getPrevious().isBlockBoundary()))&&b.append(g.document.createElement("br"));for(c=f.getNext()&&!(f.getNext().type==CKEDITOR.NODE_ELEMENT&&f.getNext().isBlockBoundary());f.getFirst();)f.getFirst().remove().appendTo(b);c&&b.append(g.document.createElement("br"));b.replace(f);c=!1}}i.selectBookmarks(h);g.focus()}},refresh:function(g,a){this.setState(g.elementPath(a.block||a.blockLimit).contains("blockquote",1)?CKEDITOR.TRISTATE_ON:CKEDITOR.TRISTATE_OFF)},context:"blockquote",
+allowedContent:"blockquote",requiredContent:"blockquote"};CKEDITOR.plugins.add("blockquote",{init:function(g){g.blockless||(g.addCommand("blockquote",k),g.ui.addButton&&g.ui.addButton("Blockquote",{label:g.lang.blockquote.toolbar,command:"blockquote",toolbar:"blocks,10"}))}})})();(function(){function v(b){function a(){var e=b.editable();e.on(p,function(b){(!CKEDITOR.env.ie||!n)&&u(b)});CKEDITOR.env.ie&&e.on("paste",function(e){q||(g(),e.data.preventDefault(),u(e),h("paste")||b.openDialog("paste"))});CKEDITOR.env.ie&&(e.on("contextmenu",i,null,null,0),e.on("beforepaste",function(b){b.data&&(!b.data.$.ctrlKey&&!b.data.$.shiftKey)&&i()},null,null,0));e.on("beforecut",function(){!n&&j(b)});var a;e.attachListener(CKEDITOR.env.ie?e:b.document.getDocumentElement(),"mouseup",function(){a=
+setTimeout(function(){r()},0)});b.on("destroy",function(){clearTimeout(a)});e.on("keyup",r)}function c(e){return{type:e,canUndo:"cut"==e,startDisabled:!0,exec:function(){"cut"==this.type&&j();var e;var a=this.type;if(CKEDITOR.env.ie)e=h(a);else try{e=b.document.$.execCommand(a,!1,null)}catch(d){e=!1}e||alert(b.lang.clipboard[this.type+"Error"]);return e}}}function d(){return{canUndo:!1,async:!0,exec:function(b,a){var d=function(a,d){a&&f(a.type,a.dataValue,!!d);b.fire("afterCommandExec",{name:"paste",
+command:c,returnValue:!!a})},c=this;"string"==typeof a?d({type:"auto",dataValue:a},1):b.getClipboardData(d)}}}function g(){q=1;setTimeout(function(){q=0},100)}function i(){n=1;setTimeout(function(){n=0},10)}function h(e){var a=b.document,d=a.getBody(),c=!1,j=function(){c=!0};d.on(e,j);(7<CKEDITOR.env.version?a.$:a.$.selection.createRange()).execCommand(e);d.removeListener(e,j);return c}function f(e,a,d){e={type:e};if(d&&!1===b.fire("beforePaste",e)||!a)return!1;e.dataValue=a;return b.fire("paste",
+e)}function j(){if(CKEDITOR.env.ie&&!CKEDITOR.env.quirks){var e=b.getSelection(),a,d,c;if(e.getType()==CKEDITOR.SELECTION_ELEMENT&&(a=e.getSelectedElement()))d=e.getRanges()[0],c=b.document.createText(""),c.insertBefore(a),d.setStartBefore(c),d.setEndAfter(a),e.selectRanges([d]),setTimeout(function(){a.getParent()&&(c.remove(),e.selectElement(a))},0)}}function l(a,d){var c=b.document,j=b.editable(),l=function(b){b.cancel()},g;if(!c.getById("cke_pastebin")){var i=b.getSelection(),s=i.createBookmarks();
+CKEDITOR.env.ie&&i.root.fire("selectionchange");var k=new CKEDITOR.dom.element((CKEDITOR.env.webkit||j.is("body"))&&!CKEDITOR.env.ie?"body":"div",c);k.setAttributes({id:"cke_pastebin","data-cke-temp":"1"});var f=0,c=c.getWindow();CKEDITOR.env.webkit?(j.append(k),k.addClass("cke_editable"),j.is("body")||(f="static"!=j.getComputedStyle("position")?j:CKEDITOR.dom.element.get(j.$.offsetParent),f=f.getDocumentPosition().y)):j.getAscendant(CKEDITOR.env.ie?"body":"html",1).append(k);k.setStyles({position:"absolute",
+top:c.getScrollPosition().y-f+10+"px",width:"1px",height:Math.max(1,c.getViewPaneSize().height-20)+"px",overflow:"hidden",margin:0,padding:0});CKEDITOR.env.safari&&k.setStyles(CKEDITOR.tools.cssVendorPrefix("user-select","text"));(f=k.getParent().isReadOnly())?(k.setOpacity(0),k.setAttribute("contenteditable",!0)):k.setStyle("ltr"==b.config.contentsLangDirection?"left":"right","-1000px");b.on("selectionChange",l,null,null,0);if(CKEDITOR.env.webkit||CKEDITOR.env.gecko)g=j.once("blur",l,null,null,-100);
+f&&k.focus();f=new CKEDITOR.dom.range(k);f.selectNodeContents(k);var h=f.select();CKEDITOR.env.ie&&(g=j.once("blur",function(){b.lockSelection(h)}));var m=CKEDITOR.document.getWindow().getScrollPosition().y;setTimeout(function(){if(CKEDITOR.env.webkit)CKEDITOR.document.getBody().$.scrollTop=m;g&&g.removeListener();CKEDITOR.env.ie&&j.focus();i.selectBookmarks(s);k.remove();var a;if(CKEDITOR.env.webkit&&(a=k.getFirst())&&a.is&&a.hasClass("Apple-style-span"))k=a;b.removeListener("selectionChange",l);
+d(k.getHtml())},0)}}function s(){if(CKEDITOR.env.ie){b.focus();g();var a=b.focusManager;a.lock();if(b.editable().fire(p)&&!h("paste"))return a.unlock(),!1;a.unlock()}else try{if(b.editable().fire(p)&&!b.document.$.execCommand("Paste",!1,null))throw 0;}catch(d){return!1}return!0}function o(a){if("wysiwyg"==b.mode)switch(a.data.keyCode){case CKEDITOR.CTRL+86:case CKEDITOR.SHIFT+45:a=b.editable();g();!CKEDITOR.env.ie&&a.fire("beforepaste");break;case CKEDITOR.CTRL+88:case CKEDITOR.SHIFT+46:b.fire("saveSnapshot"),
+setTimeout(function(){b.fire("saveSnapshot")},50)}}function u(a){var d={type:"auto"},c=b.fire("beforePaste",d);l(a,function(b){b=b.replace(/<span[^>]+data-cke-bookmark[^<]*?<\/span>/ig,"");c&&f(d.type,b,0,1)})}function r(){if("wysiwyg"==b.mode){var a=m("paste");b.getCommand("cut").setState(m("cut"));b.getCommand("copy").setState(m("copy"));b.getCommand("paste").setState(a);b.fire("pasteState",a)}}function m(a){if(t&&a in{paste:1,cut:1})return CKEDITOR.TRISTATE_DISABLED;if("paste"==a)return CKEDITOR.TRISTATE_OFF;
+var a=b.getSelection(),d=a.getRanges();return a.getType()==CKEDITOR.SELECTION_NONE||1==d.length&&d[0].collapsed?CKEDITOR.TRISTATE_DISABLED:CKEDITOR.TRISTATE_OFF}var n=0,q=0,t=0,p=CKEDITOR.env.ie?"beforepaste":"paste";(function(){b.on("key",o);b.on("contentDom",a);b.on("selectionChange",function(b){t=b.data.selection.getRanges()[0].checkReadOnly();r()});b.contextMenu&&b.contextMenu.addListener(function(b,a){t=a.getRanges()[0].checkReadOnly();return{cut:m("cut"),copy:m("copy"),paste:m("paste")}})})();
+(function(){function a(d,c,j,e,l){var g=b.lang.clipboard[c];b.addCommand(c,j);b.ui.addButton&&b.ui.addButton(d,{label:g,command:c,toolbar:"clipboard,"+e});b.addMenuItems&&b.addMenuItem(c,{label:g,command:c,group:"clipboard",order:l})}a("Cut","cut",c("cut"),10,1);a("Copy","copy",c("copy"),20,4);a("Paste","paste",d(),30,8)})();b.getClipboardData=function(a,d){function c(a){a.removeListener();a.cancel();d(a.data)}function j(a){a.removeListener();a.cancel();i=!0;d({type:f,dataValue:a.data})}function l(){this.customTitle=
+a&&a.title}var g=!1,f="auto",i=!1;d||(d=a,a=null);b.on("paste",c,null,null,0);b.on("beforePaste",function(a){a.removeListener();g=true;f=a.data.type},null,null,1E3);!1===s()&&(b.removeListener("paste",c),g&&b.fire("pasteDialog",l)?(b.on("pasteDialogCommit",j),b.on("dialogHide",function(a){a.removeListener();a.data.removeListener("pasteDialogCommit",j);setTimeout(function(){i||d(null)},10)})):d(null))}}function w(b){if(CKEDITOR.env.webkit){if(!b.match(/^[^<]*$/g)&&!b.match(/^(<div><br( ?\/)?><\/div>|<div>[^<]*<\/div>)*$/gi))return"html"}else if(CKEDITOR.env.ie){if(!b.match(/^([^<]|<br( ?\/)?>)*$/gi)&&
+!b.match(/^(<p>([^<]|<br( ?\/)?>)*<\/p>|(\r\n))*$/gi))return"html"}else if(CKEDITOR.env.gecko){if(!b.match(/^([^<]|<br( ?\/)?>)*$/gi))return"html"}else return"html";return"htmlifiedtext"}function x(b,a){function c(a){return CKEDITOR.tools.repeat("</p><p>",~~(a/2))+(1==a%2?"<br>":"")}a=a.replace(/\s+/g," ").replace(/> +</g,"><").replace(/<br ?\/>/gi,"<br>");a=a.replace(/<\/?[A-Z]+>/g,function(a){return a.toLowerCase()});if(a.match(/^[^<]$/))return a;CKEDITOR.env.webkit&&-1<a.indexOf("<div>")&&(a=a.replace(/^(<div>(<br>|)<\/div>)(?!$|(<div>(<br>|)<\/div>))/g,
+"<br>").replace(/^(<div>(<br>|)<\/div>){2}(?!$)/g,"<div></div>"),a.match(/<div>(<br>|)<\/div>/)&&(a="<p>"+a.replace(/(<div>(<br>|)<\/div>)+/g,function(a){return c(a.split("</div><div>").length+1)})+"</p>"),a=a.replace(/<\/div><div>/g,"<br>"),a=a.replace(/<\/?div>/g,""));CKEDITOR.env.gecko&&b.enterMode!=CKEDITOR.ENTER_BR&&(CKEDITOR.env.gecko&&(a=a.replace(/^<br><br>$/,"<br>")),-1<a.indexOf("<br><br>")&&(a="<p>"+a.replace(/(<br>){2,}/g,function(a){return c(a.length/4)})+"</p>"));return o(b,a)}function y(){var b=
+new CKEDITOR.htmlParser.filter,a={blockquote:1,dl:1,fieldset:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,ol:1,p:1,table:1,ul:1},c=CKEDITOR.tools.extend({br:0},CKEDITOR.dtd.$inline),d={p:1,br:1,"cke:br":1},g=CKEDITOR.dtd,i=CKEDITOR.tools.extend({area:1,basefont:1,embed:1,iframe:1,map:1,object:1,param:1},CKEDITOR.dtd.$nonBodyContent,CKEDITOR.dtd.$cdata),h=function(a){delete a.name;a.add(new CKEDITOR.htmlParser.text(" "))},f=function(a){for(var b=a,c;(b=b.next)&&b.name&&b.name.match(/^h\d$/);){c=new CKEDITOR.htmlParser.element("cke:br");
+c.isEmpty=!0;for(a.add(c);c=b.children.shift();)a.add(c)}};b.addRules({elements:{h1:f,h2:f,h3:f,h4:f,h5:f,h6:f,img:function(a){var a=CKEDITOR.tools.trim(a.attributes.alt||""),b=" ";a&&!a.match(/(^http|\.(jpe?g|gif|png))/i)&&(b=" ["+a+"] ");return new CKEDITOR.htmlParser.text(b)},td:h,th:h,$:function(b){var f=b.name,h;if(i[f])return!1;b.attributes={};if("br"==f)return b;if(a[f])b.name="p";else if(c[f])delete b.name;else if(g[f]){h=new CKEDITOR.htmlParser.element("cke:br");h.isEmpty=!0;if(CKEDITOR.dtd.$empty[f])return h;
+b.add(h,0);h=h.clone();h.isEmpty=!0;b.add(h);delete b.name}d[b.name]||delete b.name;return b}}},{applyToAll:!0});return b}function z(b,a,c){var a=new CKEDITOR.htmlParser.fragment.fromHtml(a),d=new CKEDITOR.htmlParser.basicWriter;a.writeHtml(d,c);var a=d.getHtml(),a=a.replace(/\s*(<\/?[a-z:]+ ?\/?>)\s*/g,"$1").replace(/(<cke:br \/>){2,}/g,"<cke:br />").replace(/(<cke:br \/>)(<\/?p>|<br \/>)/g,"$2").replace(/(<\/?p>|<br \/>)(<cke:br \/>)/g,"$1").replace(/<(cke:)?br( \/)?>/g,"<br>").replace(/<p><\/p>/g,
+""),g=0,a=a.replace(/<\/?p>/g,function(a){if("<p>"==a){if(1<++g)return"</p><p>"}else if(0<--g)return"</p><p>";return a}).replace(/<p><\/p>/g,"");return o(b,a)}function o(b,a){b.enterMode==CKEDITOR.ENTER_BR?a=a.replace(/(<\/p><p>)+/g,function(a){return CKEDITOR.tools.repeat("<br>",2*(a.length/7))}).replace(/<\/?p>/g,""):b.enterMode==CKEDITOR.ENTER_DIV&&(a=a.replace(/<(\/)?p>/g,"<$1div>"));return a}CKEDITOR.plugins.add("clipboard",{requires:"dialog",init:function(b){var a;v(b);CKEDITOR.dialog.add("paste",
+CKEDITOR.getUrl(this.path+"dialogs/paste.js"));b.on("paste",function(a){var b=a.data.dataValue,g=CKEDITOR.dtd.$block;-1<b.indexOf("Apple-")&&(b=b.replace(/<span class="Apple-converted-space">&nbsp;<\/span>/gi," "),"html"!=a.data.type&&(b=b.replace(/<span class="Apple-tab-span"[^>]*>([^<]*)<\/span>/gi,function(a,b){return b.replace(/\t/g,"&nbsp;&nbsp; &nbsp;")})),-1<b.indexOf('<br class="Apple-interchange-newline">')&&(a.data.startsWithEOL=1,a.data.preSniffing="html",b=b.replace(/<br class="Apple-interchange-newline">/,
+"")),b=b.replace(/(<[^>]+) class="Apple-[^"]*"/gi,"$1"));if(b.match(/^<[^<]+cke_(editable|contents)/i)){var i,h,f=new CKEDITOR.dom.element("div");for(f.setHtml(b);1==f.getChildCount()&&(i=f.getFirst())&&i.type==CKEDITOR.NODE_ELEMENT&&(i.hasClass("cke_editable")||i.hasClass("cke_contents"));)f=h=i;h&&(b=h.getHtml().replace(/<br>$/i,""))}CKEDITOR.env.ie?b=b.replace(/^&nbsp;(?: |\r\n)?<(\w+)/g,function(b,d){if(d.toLowerCase()in g){a.data.preSniffing="html";return"<"+d}return b}):CKEDITOR.env.webkit?
+b=b.replace(/<\/(\w+)><div><br><\/div>$/,function(b,d){if(d in g){a.data.endsWithEOL=1;return"</"+d+">"}return b}):CKEDITOR.env.gecko&&(b=b.replace(/(\s)<br>$/,"$1"));a.data.dataValue=b},null,null,3);b.on("paste",function(c){var c=c.data,d=c.type,g=c.dataValue,i,h=b.config.clipboard_defaultContentType||"html";i="html"==d||"html"==c.preSniffing?"html":w(g);"htmlifiedtext"==i?g=x(b.config,g):"text"==d&&"html"==i&&(g=z(b.config,g,a||(a=y(b))));c.startsWithEOL&&(g='<br data-cke-eol="1">'+g);c.endsWithEOL&&
+(g+='<br data-cke-eol="1">');"auto"==d&&(d="html"==i||"html"==h?"html":"text");c.type=d;c.dataValue=g;delete c.preSniffing;delete c.startsWithEOL;delete c.endsWithEOL},null,null,6);b.on("paste",function(a){a=a.data;b.insertHtml(a.dataValue,a.type);setTimeout(function(){b.fire("afterPaste")},0)},null,null,1E3);b.on("pasteDialog",function(a){setTimeout(function(){b.openDialog("paste",a.data)},0)})}})})();(function(){CKEDITOR.plugins.add("panel",{beforeInit:function(a){a.ui.addHandler(CKEDITOR.UI_PANEL,CKEDITOR.ui.panel.handler)}});CKEDITOR.UI_PANEL="panel";CKEDITOR.ui.panel=function(a,b){b&&CKEDITOR.tools.extend(this,b);CKEDITOR.tools.extend(this,{className:"",css:[]});this.id=CKEDITOR.tools.getNextId();this.document=a;this.isFramed=this.forceIFrame||this.css.length;this._={blocks:{}}};CKEDITOR.ui.panel.handler={create:function(a){return new CKEDITOR.ui.panel(a)}};var f=CKEDITOR.addTemplate("panel",
+'<div lang="{langCode}" id="{id}" dir={dir} class="cke cke_reset_all {editorId} cke_panel cke_panel {cls} cke_{dir}" style="z-index:{z-index}" role="presentation">{frame}</div>'),g=CKEDITOR.addTemplate("panel-frame",'<iframe id="{id}" class="cke_panel_frame" role="presentation" frameborder="0" src="{src}"></iframe>'),h=CKEDITOR.addTemplate("panel-frame-inner",'<!DOCTYPE html><html class="cke_panel_container {env}" dir="{dir}" lang="{langCode}"><head>{css}</head><body class="cke_{dir}" style="margin:0;padding:0" onload="{onload}"></body></html>');
+CKEDITOR.ui.panel.prototype={render:function(a,b){this.getHolderElement=function(){var a=this._.holder;if(!a){if(this.isFramed){var a=this.document.getById(this.id+"_frame"),b=a.getParent(),a=a.getFrameDocument();CKEDITOR.env.iOS&&b.setStyles({overflow:"scroll","-webkit-overflow-scrolling":"touch"});b=CKEDITOR.tools.addFunction(CKEDITOR.tools.bind(function(){this.isLoaded=!0;if(this.onLoad)this.onLoad()},this));a.write(h.output(CKEDITOR.tools.extend({css:CKEDITOR.tools.buildStyleHtml(this.css),onload:"window.parent.CKEDITOR.tools.callFunction("+
+b+");"},d)));a.getWindow().$.CKEDITOR=CKEDITOR;a.on("keydown",function(a){var b=a.data.getKeystroke(),c=this.document.getById(this.id).getAttribute("dir");this._.onKeyDown&&!1===this._.onKeyDown(b)?a.data.preventDefault():(27==b||b==("rtl"==c?39:37))&&this.onEscape&&!1===this.onEscape(b)&&a.data.preventDefault()},this);a=a.getBody();a.unselectable();CKEDITOR.env.air&&CKEDITOR.tools.callFunction(b)}else a=this.document.getById(this.id);this._.holder=a}return a};var d={editorId:a.id,id:this.id,langCode:a.langCode,
+dir:a.lang.dir,cls:this.className,frame:"",env:CKEDITOR.env.cssClass,"z-index":a.config.baseFloatZIndex+1};if(this.isFramed){var e=CKEDITOR.env.air?"javascript:void(0)":CKEDITOR.env.ie?"javascript:void(function(){"+encodeURIComponent("document.open();("+CKEDITOR.tools.fixDomain+")();document.close();")+"}())":"";d.frame=g.output({id:this.id+"_frame",src:e})}e=f.output(d);b&&b.push(e);return e},addBlock:function(a,b){b=this._.blocks[a]=b instanceof CKEDITOR.ui.panel.block?b:new CKEDITOR.ui.panel.block(this.getHolderElement(),
+b);this._.currentBlock||this.showBlock(a);return b},getBlock:function(a){return this._.blocks[a]},showBlock:function(a){var a=this._.blocks[a],b=this._.currentBlock,d=!this.forceIFrame||CKEDITOR.env.ie?this._.holder:this.document.getById(this.id+"_frame");b&&b.hide();this._.currentBlock=a;CKEDITOR.fire("ariaWidget",d);a._.focusIndex=-1;this._.onKeyDown=a.onKeyDown&&CKEDITOR.tools.bind(a.onKeyDown,a);a.show();return a},destroy:function(){this.element&&this.element.remove()}};CKEDITOR.ui.panel.block=
+CKEDITOR.tools.createClass({$:function(a,b){this.element=a.append(a.getDocument().createElement("div",{attributes:{tabindex:-1,"class":"cke_panel_block"},styles:{display:"none"}}));b&&CKEDITOR.tools.extend(this,b);this.element.setAttributes({role:this.attributes.role||"presentation","aria-label":this.attributes["aria-label"],title:this.attributes.title||this.attributes["aria-label"]});this.keys={};this._.focusIndex=-1;this.element.disableContextMenu()},_:{markItem:function(a){-1!=a&&(a=this.element.getElementsByTag("a").getItem(this._.focusIndex=
+a),CKEDITOR.env.webkit&&a.getDocument().getWindow().focus(),a.focus(),this.onMark&&this.onMark(a))}},proto:{show:function(){this.element.setStyle("display","")},hide:function(){(!this.onHide||!0!==this.onHide.call(this))&&this.element.setStyle("display","none")},onKeyDown:function(a,b){var d=this.keys[a];switch(d){case "next":for(var e=this._.focusIndex,d=this.element.getElementsByTag("a"),c;c=d.getItem(++e);)if(c.getAttribute("_cke_focus")&&c.$.offsetWidth){this._.focusIndex=e;c.focus();break}return!c&&
+!b?(this._.focusIndex=-1,this.onKeyDown(a,1)):!1;case "prev":e=this._.focusIndex;for(d=this.element.getElementsByTag("a");0<e&&(c=d.getItem(--e));){if(c.getAttribute("_cke_focus")&&c.$.offsetWidth){this._.focusIndex=e;c.focus();break}c=null}return!c&&!b?(this._.focusIndex=d.count(),this.onKeyDown(a,1)):!1;case "click":case "mouseup":return e=this._.focusIndex,(c=0<=e&&this.element.getElementsByTag("a").getItem(e))&&(c.$[d]?c.$[d]():c.$["on"+d]()),!1}return!0}}})})();CKEDITOR.plugins.add("floatpanel",{requires:"panel"});
+(function(){function r(a,b,c,i,f){var f=CKEDITOR.tools.genKey(b.getUniqueId(),c.getUniqueId(),a.lang.dir,a.uiColor||"",i.css||"",f||""),h=g[f];h||(h=g[f]=new CKEDITOR.ui.panel(b,i),h.element=c.append(CKEDITOR.dom.element.createFromHtml(h.render(a),b)),h.element.setStyles({display:"none",position:"absolute"}));return h}var g={};CKEDITOR.ui.floatPanel=CKEDITOR.tools.createClass({$:function(a,b,c,i){function f(){d.hide()}c.forceIFrame=1;c.toolbarRelated&&a.elementMode==CKEDITOR.ELEMENT_MODE_INLINE&&
+(b=CKEDITOR.document.getById("cke_"+a.name));var h=b.getDocument(),i=r(a,h,b,c,i||0),j=i.element,l=j.getFirst(),d=this;j.disableContextMenu();this.element=j;this._={editor:a,panel:i,parentElement:b,definition:c,document:h,iframe:l,children:[],dir:a.lang.dir};a.on("mode",f);a.on("resize",f);if(!CKEDITOR.env.iOS)h.getWindow().on("resize",f)},proto:{addBlock:function(a,b){return this._.panel.addBlock(a,b)},addListBlock:function(a,b){return this._.panel.addListBlock(a,b)},getBlock:function(a){return this._.panel.getBlock(a)},
+showBlock:function(a,b,c,i,f,h){var j=this._.panel,l=j.showBlock(a);this.allowBlur(!1);a=this._.editor.editable();this._.returnFocus=a.hasFocus?a:new CKEDITOR.dom.element(CKEDITOR.document.$.activeElement);this._.hideTimeout=0;var d=this.element,a=this._.iframe,a=CKEDITOR.env.ie?a:new CKEDITOR.dom.window(a.$.contentWindow),g=d.getDocument(),o=this._.parentElement.getPositionedAncestor(),p=b.getDocumentPosition(g),g=o?o.getDocumentPosition(g):{x:0,y:0},m="rtl"==this._.dir,e=p.x+(i||0)-g.x,k=p.y+(f||
+0)-g.y;if(m&&(1==c||4==c))e+=b.$.offsetWidth;else if(!m&&(2==c||3==c))e+=b.$.offsetWidth-1;if(3==c||4==c)k+=b.$.offsetHeight-1;this._.panel._.offsetParentId=b.getId();d.setStyles({top:k+"px",left:0,display:""});d.setOpacity(0);d.getFirst().removeStyle("width");this._.editor.focusManager.add(a);this._.blurSet||(CKEDITOR.event.useCapture=!0,a.on("blur",function(a){function q(){delete this._.returnFocus;this.hide()}this.allowBlur()&&a.data.getPhase()==CKEDITOR.EVENT_PHASE_AT_TARGET&&(this.visible&&!this._.activeChild)&&
+(CKEDITOR.env.iOS?this._.hideTimeout||(this._.hideTimeout=CKEDITOR.tools.setTimeout(q,0,this)):q.call(this))},this),a.on("focus",function(){this._.focused=!0;this.hideChild();this.allowBlur(!0)},this),CKEDITOR.env.iOS&&(a.on("touchstart",function(){clearTimeout(this._.hideTimeout)},this),a.on("touchend",function(){this._.hideTimeout=0;this.focus()},this)),CKEDITOR.event.useCapture=!1,this._.blurSet=1);j.onEscape=CKEDITOR.tools.bind(function(a){if(this.onEscape&&this.onEscape(a)===false)return false},
+this);CKEDITOR.tools.setTimeout(function(){var a=CKEDITOR.tools.bind(function(){d.removeStyle("width");if(l.autoSize){var a=l.element.getDocument(),a=(CKEDITOR.env.webkit?l.element:a.getBody()).$.scrollWidth;CKEDITOR.env.ie&&(CKEDITOR.env.quirks&&a>0)&&(a=a+((d.$.offsetWidth||0)-(d.$.clientWidth||0)+3));d.setStyle("width",a+10+"px");a=l.element.$.scrollHeight;CKEDITOR.env.ie&&(CKEDITOR.env.quirks&&a>0)&&(a=a+((d.$.offsetHeight||0)-(d.$.clientHeight||0)+3));d.setStyle("height",a+"px");j._.currentBlock.element.setStyle("display",
+"none").removeStyle("display")}else d.removeStyle("height");m&&(e=e-d.$.offsetWidth);d.setStyle("left",e+"px");var b=j.element.getWindow(),a=d.$.getBoundingClientRect(),b=b.getViewPaneSize(),c=a.width||a.right-a.left,f=a.height||a.bottom-a.top,i=m?a.right:b.width-a.left,g=m?b.width-a.right:a.left;m?i<c&&(e=g>c?e+c:b.width>c?e-a.left:e-a.right+b.width):i<c&&(e=g>c?e-c:b.width>c?e-a.right+b.width:e-a.left);c=a.top;b.height-a.top<f&&(k=c>f?k-f:b.height>f?k-a.bottom+b.height:k-a.top);if(CKEDITOR.env.ie){b=
+a=new CKEDITOR.dom.element(d.$.offsetParent);b.getName()=="html"&&(b=b.getDocument().getBody());b.getComputedStyle("direction")=="rtl"&&(e=CKEDITOR.env.ie8Compat?e-d.getDocument().getDocumentElement().$.scrollLeft*2:e-(a.$.scrollWidth-a.$.clientWidth))}var a=d.getFirst(),n;(n=a.getCustomData("activePanel"))&&n.onHide&&n.onHide.call(this,1);a.setCustomData("activePanel",this);d.setStyles({top:k+"px",left:e+"px"});d.setOpacity(1);h&&h()},this);j.isLoaded?a():j.onLoad=a;CKEDITOR.tools.setTimeout(function(){var a=
+CKEDITOR.env.webkit&&CKEDITOR.document.getWindow().getScrollPosition().y;this.focus();l.element.focus();if(CKEDITOR.env.webkit)CKEDITOR.document.getBody().$.scrollTop=a;this.allowBlur(true);this._.editor.fire("panelShow",this)},0,this)},CKEDITOR.env.air?200:0,this);this.visible=1;this.onShow&&this.onShow.call(this)},focus:function(){if(CKEDITOR.env.webkit){var a=CKEDITOR.document.getActive();a&&!a.equals(this._.iframe)&&a.$.blur()}(this._.lastFocused||this._.iframe.getFrameDocument().getWindow()).focus()},
+blur:function(){var a=this._.iframe.getFrameDocument().getActive();a&&a.is("a")&&(this._.lastFocused=a)},hide:function(a){if(this.visible&&(!this.onHide||!0!==this.onHide.call(this))){this.hideChild();CKEDITOR.env.gecko&&this._.iframe.getFrameDocument().$.activeElement.blur();this.element.setStyle("display","none");this.visible=0;this.element.getFirst().removeCustomData("activePanel");if(a=a&&this._.returnFocus)CKEDITOR.env.webkit&&a.type&&a.getWindow().$.focus(),a.focus();delete this._.lastFocused;
+this._.editor.fire("panelHide",this)}},allowBlur:function(a){var b=this._.panel;void 0!==a&&(b.allowBlur=a);return b.allowBlur},showAsChild:function(a,b,c,g,f,h){this._.activeChild==a&&a._.panel._.offsetParentId==c.getId()||(this.hideChild(),a.onHide=CKEDITOR.tools.bind(function(){CKEDITOR.tools.setTimeout(function(){this._.focused||this.hide()},0,this)},this),this._.activeChild=a,this._.focused=!1,a.showBlock(b,c,g,f,h),this.blur(),(CKEDITOR.env.ie7Compat||CKEDITOR.env.ie6Compat)&&setTimeout(function(){a.element.getChild(0).$.style.cssText+=
+""},100))},hideChild:function(a){var b=this._.activeChild;b&&(delete b.onHide,delete this._.activeChild,b.hide(),a&&this.focus())}}});CKEDITOR.on("instanceDestroyed",function(){var a=CKEDITOR.tools.isEmpty(CKEDITOR.instances),b;for(b in g){var c=g[b];a?c.destroy():c.element.hide()}a&&(g={})})})();CKEDITOR.plugins.add("menu",{requires:"floatpanel",beforeInit:function(g){for(var h=g.config.menu_groups.split(","),m=g._.menuGroups={},l=g._.menuItems={},a=0;a<h.length;a++)m[h[a]]=a+1;g.addMenuGroup=function(b,a){m[b]=a||100};g.addMenuItem=function(a,c){m[c.group]&&(l[a]=new CKEDITOR.menuItem(this,a,c))};g.addMenuItems=function(a){for(var c in a)this.addMenuItem(c,a[c])};g.getMenuItem=function(a){return l[a]};g.removeMenuItem=function(a){delete l[a]}}});
+(function(){function g(a){a.sort(function(a,c){return a.group<c.group?-1:a.group>c.group?1:a.order<c.order?-1:a.order>c.order?1:0})}var h='<span class="cke_menuitem"><a id="{id}" class="cke_menubutton cke_menubutton__{name} cke_menubutton_{state} {cls}" href="{href}" title="{title}" tabindex="-1"_cke_focus=1 hidefocus="true" role="{role}" aria-haspopup="{hasPopup}" aria-disabled="{disabled}" {ariaChecked}';CKEDITOR.env.gecko&&CKEDITOR.env.mac&&(h+=' onkeypress="return false;"');CKEDITOR.env.gecko&&
+(h+=' onblur="this.style.cssText = this.style.cssText;"');var h=h+(' onmouseover="CKEDITOR.tools.callFunction({hoverFn},{index});" onmouseout="CKEDITOR.tools.callFunction({moveOutFn},{index});" '+(CKEDITOR.env.ie?'onclick="return false;" onmouseup':"onclick")+'="CKEDITOR.tools.callFunction({clickFn},{index}); return false;">'),m=CKEDITOR.addTemplate("menuItem",h+'<span class="cke_menubutton_inner"><span class="cke_menubutton_icon"><span class="cke_button_icon cke_button__{iconName}_icon" style="{iconStyle}"></span></span><span class="cke_menubutton_label">{label}</span>{arrowHtml}</span></a></span>'),
+l=CKEDITOR.addTemplate("menuArrow",'<span class="cke_menuarrow"><span>{label}</span></span>');CKEDITOR.menu=CKEDITOR.tools.createClass({$:function(a,b){b=this._.definition=b||{};this.id=CKEDITOR.tools.getNextId();this.editor=a;this.items=[];this._.listeners=[];this._.level=b.level||1;var c=CKEDITOR.tools.extend({},b.panel,{css:[CKEDITOR.skin.getPath("editor")],level:this._.level-1,block:{}}),k=c.block.attributes=c.attributes||{};!k.role&&(k.role="menu");this._.panelDefinition=c},_:{onShow:function(){var a=
+this.editor.getSelection(),b=a&&a.getStartElement(),c=this.editor.elementPath(),k=this._.listeners;this.removeAll();for(var e=0;e<k.length;e++){var j=k[e](b,a,c);if(j)for(var i in j){var f=this.editor.getMenuItem(i);if(f&&(!f.command||this.editor.getCommand(f.command).state))f.state=j[i],this.add(f)}}},onClick:function(a){this.hide();if(a.onClick)a.onClick();else a.command&&this.editor.execCommand(a.command)},onEscape:function(a){var b=this.parent;b?b._.panel.hideChild(1):27==a&&this.hide(1);return!1},
+onHide:function(){this.onHide&&this.onHide()},showSubMenu:function(a){var b=this._.subMenu,c=this.items[a];if(c=c.getItems&&c.getItems()){b?b.removeAll():(b=this._.subMenu=new CKEDITOR.menu(this.editor,CKEDITOR.tools.extend({},this._.definition,{level:this._.level+1},!0)),b.parent=this,b._.onClick=CKEDITOR.tools.bind(this._.onClick,this));for(var k in c){var e=this.editor.getMenuItem(k);e&&(e.state=c[k],b.add(e))}var j=this._.panel.getBlock(this.id).element.getDocument().getById(this.id+(""+a));setTimeout(function(){b.show(j,
+2)},0)}else this._.panel.hideChild(1)}},proto:{add:function(a){a.order||(a.order=this.items.length);this.items.push(a)},removeAll:function(){this.items=[]},show:function(a,b,c,k){if(!this.parent&&(this._.onShow(),!this.items.length))return;var b=b||("rtl"==this.editor.lang.dir?2:1),e=this.items,j=this.editor,i=this._.panel,f=this._.element;if(!i){i=this._.panel=new CKEDITOR.ui.floatPanel(this.editor,CKEDITOR.document.getBody(),this._.panelDefinition,this._.level);i.onEscape=CKEDITOR.tools.bind(function(a){if(!1===
+this._.onEscape(a))return!1},this);i.onShow=function(){i._.panel.getHolderElement().getParent().addClass("cke cke_reset_all")};i.onHide=CKEDITOR.tools.bind(function(){this._.onHide&&this._.onHide()},this);f=i.addBlock(this.id,this._.panelDefinition.block);f.autoSize=!0;var d=f.keys;d[40]="next";d[9]="next";d[38]="prev";d[CKEDITOR.SHIFT+9]="prev";d["rtl"==j.lang.dir?37:39]=CKEDITOR.env.ie?"mouseup":"click";d[32]=CKEDITOR.env.ie?"mouseup":"click";CKEDITOR.env.ie&&(d[13]="mouseup");f=this._.element=
+f.element;d=f.getDocument();d.getBody().setStyle("overflow","hidden");d.getElementsByTag("html").getItem(0).setStyle("overflow","hidden");this._.itemOverFn=CKEDITOR.tools.addFunction(function(a){clearTimeout(this._.showSubTimeout);this._.showSubTimeout=CKEDITOR.tools.setTimeout(this._.showSubMenu,j.config.menu_subMenuDelay||400,this,[a])},this);this._.itemOutFn=CKEDITOR.tools.addFunction(function(){clearTimeout(this._.showSubTimeout)},this);this._.itemClickFn=CKEDITOR.tools.addFunction(function(a){var b=
+this.items[a];if(b.state==CKEDITOR.TRISTATE_DISABLED)this.hide(1);else if(b.getItems)this._.showSubMenu(a);else this._.onClick(b)},this)}g(e);for(var d=j.elementPath(),d=['<div class="cke_menu'+(d&&d.direction()!=j.lang.dir?" cke_mixed_dir_content":"")+'" role="presentation">'],h=e.length,m=h&&e[0].group,l=0;l<h;l++){var n=e[l];m!=n.group&&(d.push('<div class="cke_menuseparator" role="separator"></div>'),m=n.group);n.render(this,l,d)}d.push("</div>");f.setHtml(d.join(""));CKEDITOR.ui.fire("ready",
+this);this.parent?this.parent._.panel.showAsChild(i,this.id,a,b,c,k):i.showBlock(this.id,a,b,c,k);j.fire("menuShow",[i])},addListener:function(a){this._.listeners.push(a)},hide:function(a){this._.onHide&&this._.onHide();this._.panel&&this._.panel.hide(a)}}});CKEDITOR.menuItem=CKEDITOR.tools.createClass({$:function(a,b,c){CKEDITOR.tools.extend(this,c,{order:0,className:"cke_menubutton__"+b});this.group=a._.menuGroups[this.group];this.editor=a;this.name=b},proto:{render:function(a,b,c){var h=a.id+(""+
+b),e="undefined"==typeof this.state?CKEDITOR.TRISTATE_OFF:this.state,j="",i=e==CKEDITOR.TRISTATE_ON?"on":e==CKEDITOR.TRISTATE_DISABLED?"disabled":"off";this.role in{menuitemcheckbox:1,menuitemradio:1}&&(j=' aria-checked="'+(e==CKEDITOR.TRISTATE_ON?"true":"false")+'"');var f=this.getItems,d="&#"+("rtl"==this.editor.lang.dir?"9668":"9658")+";",g=this.name;this.icon&&!/\./.test(this.icon)&&(g=this.icon);a={id:h,name:this.name,iconName:g,label:this.label,cls:this.className||"",state:i,hasPopup:f?"true":
+"false",disabled:e==CKEDITOR.TRISTATE_DISABLED,title:this.label,href:"javascript:void('"+(this.label||"").replace("'")+"')",hoverFn:a._.itemOverFn,moveOutFn:a._.itemOutFn,clickFn:a._.itemClickFn,index:b,iconStyle:CKEDITOR.skin.getIconStyle(g,"rtl"==this.editor.lang.dir,g==this.icon?null:this.icon,this.iconOffset),arrowHtml:f?l.output({label:d}):"",role:this.role?this.role:"menuitem",ariaChecked:j};m.output(a,c)}}})})();CKEDITOR.config.menu_groups="clipboard,form,tablecell,tablecellproperties,tablerow,tablecolumn,table,anchor,link,image,flash,checkbox,radio,textfield,hiddenfield,imagebutton,button,select,textarea,div";CKEDITOR.plugins.add("contextmenu",{requires:"menu",onLoad:function(){CKEDITOR.plugins.contextMenu=CKEDITOR.tools.createClass({base:CKEDITOR.menu,$:function(a){this.base.call(this,a,{panel:{className:"cke_menu_panel",attributes:{"aria-label":a.lang.contextmenu.options}}})},proto:{addTarget:function(a,e){a.on("contextmenu",function(a){var a=a.data,c=CKEDITOR.env.webkit?f:CKEDITOR.env.mac?a.$.metaKey:a.$.ctrlKey;if(!e||!c){a.preventDefault();if(CKEDITOR.env.mac&&CKEDITOR.env.webkit){var c=this.editor,
+b=(new CKEDITOR.dom.elementPath(a.getTarget(),c.editable())).contains(function(a){return a.hasAttribute("contenteditable")},!0);b&&"false"==b.getAttribute("contenteditable")&&c.getSelection().fake(b)}var b=a.getTarget().getDocument(),d=a.getTarget().getDocument().getDocumentElement(),c=!b.equals(CKEDITOR.document),b=b.getWindow().getScrollPosition(),g=c?a.$.clientX:a.$.pageX||b.x+a.$.clientX,h=c?a.$.clientY:a.$.pageY||b.y+a.$.clientY;CKEDITOR.tools.setTimeout(function(){this.open(d,null,g,h)},CKEDITOR.env.ie?
+200:0,this)}},this);if(CKEDITOR.env.webkit){var f,d=function(){f=0};a.on("keydown",function(a){f=CKEDITOR.env.mac?a.data.$.metaKey:a.data.$.ctrlKey});a.on("keyup",d);a.on("contextmenu",d)}},open:function(a,e,f,d){this.editor.focus();a=a||CKEDITOR.document.getDocumentElement();this.editor.selectionChange(1);this.show(a,e,f,d)}}})},beforeInit:function(a){var e=a.contextMenu=new CKEDITOR.plugins.contextMenu(a);a.on("contentDom",function(){e.addTarget(a.editable(),!1!==a.config.browserContextMenuOnCtrl)});
+a.addCommand("contextMenu",{exec:function(){a.contextMenu.open(a.document.getBody())}});a.setKeystroke(CKEDITOR.SHIFT+121,"contextMenu");a.setKeystroke(CKEDITOR.CTRL+CKEDITOR.SHIFT+121,"contextMenu")}});CKEDITOR.plugins.add("resize",{init:function(b){var f,g,n,o;function c(d){var e=f,l=g,c=e+(d.data.$.screenX-n)*("rtl"==h?-1:1),d=l+(d.data.$.screenY-o);i&&(e=Math.max(a.resize_minWidth,Math.min(c,a.resize_maxWidth)));m&&(l=Math.max(a.resize_minHeight,Math.min(d,a.resize_maxHeight)));b.resize(i?e:null,l)}function j(){CKEDITOR.document.removeListener("mousemove",c);CKEDITOR.document.removeListener("mouseup",j);b.document&&(b.document.removeListener("mousemove",c),b.document.removeListener("mouseup",
+j))}var a=b.config,q=b.ui.spaceId("resizer"),h=b.element?b.element.getDirection(1):"ltr";!a.resize_dir&&(a.resize_dir="vertical");void 0===a.resize_maxWidth&&(a.resize_maxWidth=3E3);void 0===a.resize_maxHeight&&(a.resize_maxHeight=3E3);void 0===a.resize_minWidth&&(a.resize_minWidth=750);void 0===a.resize_minHeight&&(a.resize_minHeight=250);if(!1!==a.resize_enabled){var k=null,i=("both"==a.resize_dir||"horizontal"==a.resize_dir)&&a.resize_minWidth!=a.resize_maxWidth,m=("both"==a.resize_dir||"vertical"==
+a.resize_dir)&&a.resize_minHeight!=a.resize_maxHeight,p=CKEDITOR.tools.addFunction(function(d){k||(k=b.getResizable());f=k.$.offsetWidth||0;g=k.$.offsetHeight||0;n=d.screenX;o=d.screenY;a.resize_minWidth>f&&(a.resize_minWidth=f);a.resize_minHeight>g&&(a.resize_minHeight=g);CKEDITOR.document.on("mousemove",c);CKEDITOR.document.on("mouseup",j);b.document&&(b.document.on("mousemove",c),b.document.on("mouseup",j));d.preventDefault&&d.preventDefault()});b.on("destroy",function(){CKEDITOR.tools.removeFunction(p)});
+b.on("uiSpace",function(a){if("bottom"==a.data.space){var e="";i&&!m&&(e=" cke_resizer_horizontal");!i&&m&&(e=" cke_resizer_vertical");var c='<span id="'+q+'" class="cke_resizer'+e+" cke_resizer_"+h+'" title="'+CKEDITOR.tools.htmlEncode(b.lang.common.resize)+'" onmousedown="CKEDITOR.tools.callFunction('+p+', event)">'+("ltr"==h?"â—¢":"â—£")+"</span>";"ltr"==h&&"ltr"==e?a.data.html+=c:a.data.html=c+a.data.html}},b,null,100);b.on("maximize",function(a){b.ui.space("resizer")[a.data==CKEDITOR.TRISTATE_ON?
+"hide":"show"]()})}}});(function(){var c='<a id="{id}" class="cke_button cke_button__{name} cke_button_{state} {cls}"'+(CKEDITOR.env.gecko&&!CKEDITOR.env.hc?"":" href=\"javascript:void('{titleJs}')\"")+' title="{title}" tabindex="-1" hidefocus="true" role="button" aria-labelledby="{id}_label" aria-haspopup="{hasArrow}" aria-disabled="{ariaDisabled}"';CKEDITOR.env.gecko&&CKEDITOR.env.mac&&(c+=' onkeypress="return false;"');CKEDITOR.env.gecko&&(c+=' onblur="this.style.cssText = this.style.cssText;"');var c=c+(' onkeydown="return CKEDITOR.tools.callFunction({keydownFn},event);" onfocus="return CKEDITOR.tools.callFunction({focusFn},event);" '+
+(CKEDITOR.env.ie?'onclick="return false;" onmouseup':"onclick")+'="CKEDITOR.tools.callFunction({clickFn},this);return false;"><span class="cke_button_icon cke_button__{iconName}_icon" style="{style}"'),c=c+'>&nbsp;</span><span id="{id}_label" class="cke_button_label cke_button__{name}_label" aria-hidden="false">{label}</span>{arrowHtml}</a>',o=CKEDITOR.addTemplate("buttonArrow",'<span class="cke_button_arrow">'+(CKEDITOR.env.hc?"&#9660;":"")+"</span>"),p=CKEDITOR.addTemplate("button",c);CKEDITOR.plugins.add("button",
+{beforeInit:function(a){a.ui.addHandler(CKEDITOR.UI_BUTTON,CKEDITOR.ui.button.handler)}});CKEDITOR.UI_BUTTON="button";CKEDITOR.ui.button=function(a){CKEDITOR.tools.extend(this,a,{title:a.label,click:a.click||function(b){b.execCommand(a.command)}});this._={}};CKEDITOR.ui.button.handler={create:function(a){return new CKEDITOR.ui.button(a)}};CKEDITOR.ui.button.prototype={render:function(a,b){function c(){var e=a.mode;e&&(e=this.modes[e]?void 0!==i[e]?i[e]:CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,
+e=a.readOnly&&!this.readOnly?CKEDITOR.TRISTATE_DISABLED:e,this.setState(e),this.refresh&&this.refresh())}var j=CKEDITOR.env,k=this._.id=CKEDITOR.tools.getNextId(),f="",g=this.command,l;this._.editor=a;var d={id:k,button:this,editor:a,focus:function(){CKEDITOR.document.getById(k).focus()},execute:function(){this.button.click(a)},attach:function(a){this.button.attach(a)}},q=CKEDITOR.tools.addFunction(function(a){if(d.onkey)return a=new CKEDITOR.dom.event(a),!1!==d.onkey(d,a.getKeystroke())}),r=CKEDITOR.tools.addFunction(function(a){var b;
+d.onfocus&&(b=!1!==d.onfocus(d,new CKEDITOR.dom.event(a)));return b}),m=0;d.clickFn=l=CKEDITOR.tools.addFunction(function(){m&&(a.unlockSelection(1),m=0);d.execute();j.iOS&&a.focus()});if(this.modes){var i={};a.on("beforeModeUnload",function(){a.mode&&this._.state!=CKEDITOR.TRISTATE_DISABLED&&(i[a.mode]=this._.state)},this);a.on("activeFilterChange",c,this);a.on("mode",c,this);!this.readOnly&&a.on("readOnly",c,this)}else if(g&&(g=a.getCommand(g)))g.on("state",function(){this.setState(g.state)},this),
+f+=g.state==CKEDITOR.TRISTATE_ON?"on":g.state==CKEDITOR.TRISTATE_DISABLED?"disabled":"off";if(this.directional)a.on("contentDirChanged",function(b){var c=CKEDITOR.document.getById(this._.id),d=c.getFirst(),b=b.data;b!=a.lang.dir?c.addClass("cke_"+b):c.removeClass("cke_ltr").removeClass("cke_rtl");d.setAttribute("style",CKEDITOR.skin.getIconStyle(h,"rtl"==b,this.icon,this.iconOffset))},this);g||(f+="off");var n=this.name||this.command,h=n;this.icon&&!/\./.test(this.icon)&&(h=this.icon,this.icon=null);
+f={id:k,name:n,iconName:h,label:this.label,cls:this.className||"",state:f,ariaDisabled:"disabled"==f?"true":"false",title:this.title,titleJs:j.gecko&&!j.hc?"":(this.title||"").replace("'",""),hasArrow:this.hasArrow?"true":"false",keydownFn:q,focusFn:r,clickFn:l,style:CKEDITOR.skin.getIconStyle(h,"rtl"==a.lang.dir,this.icon,this.iconOffset),arrowHtml:this.hasArrow?o.output():""};p.output(f,b);if(this.onRender)this.onRender();return d},setState:function(a){if(this._.state==a)return!1;this._.state=a;
+var b=CKEDITOR.document.getById(this._.id);return b?(b.setState(a,"cke_button"),a==CKEDITOR.TRISTATE_DISABLED?b.setAttribute("aria-disabled",!0):b.removeAttribute("aria-disabled"),this.hasArrow?(a=a==CKEDITOR.TRISTATE_ON?this._.editor.lang.button.selectedLabel.replace(/%1/g,this.label):this.label,CKEDITOR.document.getById(this._.id+"_label").setText(a)):a==CKEDITOR.TRISTATE_ON?b.setAttribute("aria-pressed",!0):b.removeAttribute("aria-pressed"),!0):!1},getState:function(){return this._.state},toFeature:function(a){if(this._.feature)return this._.feature;
+var b=this;!this.allowedContent&&(!this.requiredContent&&this.command)&&(b=a.getCommand(this.command)||b);return this._.feature=b}};CKEDITOR.ui.prototype.addButton=function(a,b){this.add(a,CKEDITOR.UI_BUTTON,b)}})();(function(){function w(a){function d(){for(var b=g(),e=CKEDITOR.tools.clone(a.config.toolbarGroups)||n(a),f=0;f<e.length;f++){var k=e[f];if("/"!=k){"string"==typeof k&&(k=e[f]={name:k});var i,d=k.groups;if(d)for(var h=0;h<d.length;h++)i=d[h],(i=b[i])&&c(k,i);(i=b[k.name])&&c(k,i)}}return e}function g(){var b={},c,f,e;for(c in a.ui.items)f=a.ui.items[c],e=f.toolbar||"others",e=e.split(","),f=e[0],e=parseInt(e[1]||-1,10),b[f]||(b[f]=[]),b[f].push({name:c,order:e});for(f in b)b[f]=b[f].sort(function(b,
+a){return b.order==a.order?0:0>a.order?-1:0>b.order?1:b.order<a.order?-1:1});return b}function c(c,e){if(e.length){c.items?c.items.push(a.ui.create("-")):c.items=[];for(var f;f=e.shift();)if(f="string"==typeof f?f:f.name,!b||-1==CKEDITOR.tools.indexOf(b,f))(f=a.ui.create(f))&&a.addFeature(f)&&c.items.push(f)}}function h(b){var a=[],e,d,h;for(e=0;e<b.length;++e)d=b[e],h={},"/"==d?a.push(d):CKEDITOR.tools.isArray(d)?(c(h,CKEDITOR.tools.clone(d)),a.push(h)):d.items&&(c(h,CKEDITOR.tools.clone(d.items)),
+h.name=d.name,a.push(h));return a}var b=a.config.removeButtons,b=b&&b.split(","),e=a.config.toolbar;"string"==typeof e&&(e=a.config["toolbar_"+e]);return a.toolbar=e?h(e):d()}function n(a){return a._.toolbarGroups||(a._.toolbarGroups=[{name:"document",groups:["mode","document","doctools"]},{name:"clipboard",groups:["clipboard","undo"]},{name:"editing",groups:["find","selection","spellchecker"]},{name:"forms"},"/",{name:"basicstyles",groups:["basicstyles","cleanup"]},{name:"paragraph",groups:["list",
+"indent","blocks","align","bidi"]},{name:"links"},{name:"insert"},"/",{name:"styles"},{name:"colors"},{name:"tools"},{name:"others"},{name:"about"}])}var u=function(){this.toolbars=[];this.focusCommandExecuted=!1};u.prototype.focus=function(){for(var a=0,d;d=this.toolbars[a++];)for(var g=0,c;c=d.items[g++];)if(c.focus){c.focus();return}};var x={modes:{wysiwyg:1,source:1},readOnly:1,exec:function(a){a.toolbox&&(a.toolbox.focusCommandExecuted=!0,CKEDITOR.env.ie||CKEDITOR.env.air?setTimeout(function(){a.toolbox.focus()},
+100):a.toolbox.focus())}};CKEDITOR.plugins.add("toolbar",{requires:"button",init:function(a){var d,g=function(c,h){var b,e="rtl"==a.lang.dir,j=a.config.toolbarGroupCycling,o=e?37:39,e=e?39:37,j=void 0===j||j;switch(h){case 9:case CKEDITOR.SHIFT+9:for(;!b||!b.items.length;)if(b=9==h?(b?b.next:c.toolbar.next)||a.toolbox.toolbars[0]:(b?b.previous:c.toolbar.previous)||a.toolbox.toolbars[a.toolbox.toolbars.length-1],b.items.length)for(c=b.items[d?b.items.length-1:0];c&&!c.focus;)(c=d?c.previous:c.next)||
+(b=0);c&&c.focus();return!1;case o:b=c;do b=b.next,!b&&j&&(b=c.toolbar.items[0]);while(b&&!b.focus);b?b.focus():g(c,9);return!1;case 40:return c.button&&c.button.hasArrow?(a.once("panelShow",function(b){b.data._.panel._.currentBlock.onKeyDown(40)}),c.execute()):g(c,40==h?o:e),!1;case e:case 38:b=c;do b=b.previous,!b&&j&&(b=c.toolbar.items[c.toolbar.items.length-1]);while(b&&!b.focus);b?b.focus():(d=1,g(c,CKEDITOR.SHIFT+9),d=0);return!1;case 27:return a.focus(),!1;case 13:case 32:return c.execute(),
+!1}return!0};a.on("uiSpace",function(c){if(c.data.space==a.config.toolbarLocation){c.removeListener();a.toolbox=new u;var d=CKEDITOR.tools.getNextId(),b=['<span id="',d,'" class="cke_voice_label">',a.lang.toolbar.toolbars,"</span>",'<span id="'+a.ui.spaceId("toolbox")+'" class="cke_toolbox" role="group" aria-labelledby="',d,'" onmousedown="return false;">'],d=!1!==a.config.toolbarStartupExpanded,e,j;a.config.toolbarCanCollapse&&a.elementMode!=CKEDITOR.ELEMENT_MODE_INLINE&&b.push('<span class="cke_toolbox_main"'+
+(d?">":' style="display:none">'));for(var o=a.toolbox.toolbars,f=w(a),k=0;k<f.length;k++){var i,l=0,r,m=f[k],s;if(m)if(e&&(b.push("</span>"),j=e=0),"/"===m)b.push('<span class="cke_toolbar_break"></span>');else{s=m.items||m;for(var t=0;t<s.length;t++){var p=s[t],n;if(p)if(p.type==CKEDITOR.UI_SEPARATOR)j=e&&p;else{n=!1!==p.canGroup;if(!l){i=CKEDITOR.tools.getNextId();l={id:i,items:[]};r=m.name&&(a.lang.toolbar.toolbarGroups[m.name]||m.name);b.push('<span id="',i,'" class="cke_toolbar"',r?' aria-labelledby="'+
+i+'_label"':"",' role="toolbar">');r&&b.push('<span id="',i,'_label" class="cke_voice_label">',r,"</span>");b.push('<span class="cke_toolbar_start"></span>');var q=o.push(l)-1;0<q&&(l.previous=o[q-1],l.previous.next=l)}n?e||(b.push('<span class="cke_toolgroup" role="presentation">'),e=1):e&&(b.push("</span>"),e=0);i=function(c){c=c.render(a,b);q=l.items.push(c)-1;if(q>0){c.previous=l.items[q-1];c.previous.next=c}c.toolbar=l;c.onkey=g;c.onfocus=function(){a.toolbox.focusCommandExecuted||a.focus()}};
+j&&(i(j),j=0);i(p)}}e&&(b.push("</span>"),j=e=0);l&&b.push('<span class="cke_toolbar_end"></span></span>')}}a.config.toolbarCanCollapse&&b.push("</span>");if(a.config.toolbarCanCollapse&&a.elementMode!=CKEDITOR.ELEMENT_MODE_INLINE){var v=CKEDITOR.tools.addFunction(function(){a.execCommand("toolbarCollapse")});a.on("destroy",function(){CKEDITOR.tools.removeFunction(v)});a.addCommand("toolbarCollapse",{readOnly:1,exec:function(b){var a=b.ui.space("toolbar_collapser"),c=a.getPrevious(),e=b.ui.space("contents"),
+d=c.getParent(),f=parseInt(e.$.style.height,10),h=d.$.offsetHeight,g=a.hasClass("cke_toolbox_collapser_min");g?(c.show(),a.removeClass("cke_toolbox_collapser_min"),a.setAttribute("title",b.lang.toolbar.toolbarCollapse)):(c.hide(),a.addClass("cke_toolbox_collapser_min"),a.setAttribute("title",b.lang.toolbar.toolbarExpand));a.getFirst().setText(g?"â–²":"â—€");e.setStyle("height",f-(d.$.offsetHeight-h)+"px");b.fire("resize")},modes:{wysiwyg:1,source:1}});a.setKeystroke(CKEDITOR.ALT+(CKEDITOR.env.ie||CKEDITOR.env.webkit?
+189:109),"toolbarCollapse");b.push('<a title="'+(d?a.lang.toolbar.toolbarCollapse:a.lang.toolbar.toolbarExpand)+'" id="'+a.ui.spaceId("toolbar_collapser")+'" tabIndex="-1" class="cke_toolbox_collapser');d||b.push(" cke_toolbox_collapser_min");b.push('" onclick="CKEDITOR.tools.callFunction('+v+')">','<span class="cke_arrow">&#9650;</span>',"</a>")}b.push("</span>");c.data.html+=b.join("")}});a.on("destroy",function(){if(this.toolbox){var a,d=0,b,e,g;for(a=this.toolbox.toolbars;d<a.length;d++){e=a[d].items;
+for(b=0;b<e.length;b++)g=e[b],g.clickFn&&CKEDITOR.tools.removeFunction(g.clickFn),g.keyDownFn&&CKEDITOR.tools.removeFunction(g.keyDownFn)}}});a.on("uiReady",function(){var c=a.ui.space("toolbox");c&&a.focusManager.add(c,1)});a.addCommand("toolbarFocus",x);a.setKeystroke(CKEDITOR.ALT+121,"toolbarFocus");a.ui.add("-",CKEDITOR.UI_SEPARATOR,{});a.ui.addHandler(CKEDITOR.UI_SEPARATOR,{create:function(){return{render:function(a,d){d.push('<span class="cke_toolbar_separator" role="separator"></span>');return{}}}}})}});
+CKEDITOR.ui.prototype.addToolbarGroup=function(a,d,g){var c=n(this.editor),h=0===d,b={name:a};if(g){if(g=CKEDITOR.tools.search(c,function(a){return a.name==g})){!g.groups&&(g.groups=[]);if(d&&(d=CKEDITOR.tools.indexOf(g.groups,d),0<=d)){g.groups.splice(d+1,0,a);return}h?g.groups.splice(0,0,a):g.groups.push(a);return}d=null}d&&(d=CKEDITOR.tools.indexOf(c,function(a){return a.name==d}));h?c.splice(0,0,a):"number"==typeof d?c.splice(d+1,0,b):c.push(a)}})();CKEDITOR.UI_SEPARATOR="separator";
+CKEDITOR.config.toolbarLocation="top";(function(){var k;function n(a,c){function j(d){d=i.list[d];if(d.equals(a.editable())||"true"==d.getAttribute("contenteditable")){var e=a.createRange();e.selectNodeContents(d);e.select()}else a.getSelection().selectElement(d);a.focus()}function s(){l&&l.setHtml(o);delete i.list}var m=a.ui.spaceId("path"),l,i=a._.elementsPath,n=i.idBase;c.html+='<span id="'+m+'_label" class="cke_voice_label">'+a.lang.elementspath.eleLabel+'</span><span id="'+m+'" class="cke_path" role="group" aria-labelledby="'+m+
+'_label">'+o+"</span>";a.on("uiReady",function(){var d=a.ui.space("path");d&&a.focusManager.add(d,1)});i.onClick=j;var t=CKEDITOR.tools.addFunction(j),u=CKEDITOR.tools.addFunction(function(d,e){var g=i.idBase,b,e=new CKEDITOR.dom.event(e);b="rtl"==a.lang.dir;switch(e.getKeystroke()){case b?39:37:case 9:return(b=CKEDITOR.document.getById(g+(d+1)))||(b=CKEDITOR.document.getById(g+"0")),b.focus(),!1;case b?37:39:case CKEDITOR.SHIFT+9:return(b=CKEDITOR.document.getById(g+(d-1)))||(b=CKEDITOR.document.getById(g+
+(i.list.length-1))),b.focus(),!1;case 27:return a.focus(),!1;case 13:case 32:return j(d),!1}return!0});a.on("selectionChange",function(){for(var d=[],e=i.list=[],g=[],b=i.filters,c=!0,j=a.elementPath().elements,f,k=j.length;k--;){var h=j[k],p=0;f=h.data("cke-display-name")?h.data("cke-display-name"):h.data("cke-real-element-type")?h.data("cke-real-element-type"):h.getName();c=h.hasAttribute("contenteditable")?"true"==h.getAttribute("contenteditable"):c;!c&&!h.hasAttribute("contenteditable")&&(p=1);
+for(var q=0;q<b.length;q++){var r=b[q](h,f);if(!1===r){p=1;break}f=r||f}p||(e.unshift(h),g.unshift(f))}e=e.length;for(b=0;b<e;b++)f=g[b],c=a.lang.elementspath.eleTitle.replace(/%1/,f),f=v.output({id:n+b,label:c,text:f,jsTitle:"javascript:void('"+f+"')",index:b,keyDownFn:u,clickFn:t}),d.unshift(f);l||(l=CKEDITOR.document.getById(m));g=l;g.setHtml(d.join("")+o);a.fire("elementsPathUpdate",{space:g})});a.on("readOnly",s);a.on("contentDomUnload",s);a.addCommand("elementsPathFocus",k);a.setKeystroke(CKEDITOR.ALT+
+122,"elementsPathFocus")}k={editorFocus:!1,readOnly:1,exec:function(a){(a=CKEDITOR.document.getById(a._.elementsPath.idBase+"0"))&&a.focus(CKEDITOR.env.ie||CKEDITOR.env.air)}};var o='<span class="cke_path_empty">&nbsp;</span>',c="";CKEDITOR.env.gecko&&CKEDITOR.env.mac&&(c+=' onkeypress="return false;"');CKEDITOR.env.gecko&&(c+=' onblur="this.style.cssText = this.style.cssText;"');var v=CKEDITOR.addTemplate("pathItem",'<a id="{id}" href="{jsTitle}" tabindex="-1" class="cke_path_item" title="{label}"'+
+c+' hidefocus="true" onkeydown="return CKEDITOR.tools.callFunction({keyDownFn},{index}, event );" onclick="CKEDITOR.tools.callFunction({clickFn},{index}); return false;" role="button" aria-label="{label}">{text}</a>');CKEDITOR.plugins.add("elementspath",{init:function(a){a._.elementsPath={idBase:"cke_elementspath_"+CKEDITOR.tools.getNextNumber()+"_",filters:[]};a.on("uiSpace",function(c){"bottom"==c.data.space&&n(a,c.data)})}})})();(function(){function m(b,d,a){a=b.config.forceEnterMode||a;"wysiwyg"==b.mode&&(d||(d=b.activeEnterMode),b.elementPath().isContextFor("p")||(d=CKEDITOR.ENTER_BR,a=1),b.fire("saveSnapshot"),d==CKEDITOR.ENTER_BR?p(b,d,null,a):q(b,d,null,a),b.fire("saveSnapshot"))}function r(b){for(var b=b.getSelection().getRanges(!0),d=b.length-1;0<d;d--)b[d].deleteContents();return b[0]}function u(b){var d=b.startContainer.getAscendant(function(a){return a.type==CKEDITOR.NODE_ELEMENT&&"true"==a.getAttribute("contenteditable")},
+!0);if(b.root.equals(d))return b;d=new CKEDITOR.dom.range(d);d.moveToRange(b);return d}CKEDITOR.plugins.add("enterkey",{init:function(b){b.addCommand("enter",{modes:{wysiwyg:1},editorFocus:!1,exec:function(b){m(b)}});b.addCommand("shiftEnter",{modes:{wysiwyg:1},editorFocus:!1,exec:function(b){m(b,b.activeShiftEnterMode,1)}});b.setKeystroke([[13,"enter"],[CKEDITOR.SHIFT+13,"shiftEnter"]])}});var v=CKEDITOR.dom.walker.whitespaces(),w=CKEDITOR.dom.walker.bookmark();CKEDITOR.plugins.enterkey={enterBlock:function(b,
+d,a,h){if(a=a||r(b)){var a=u(a),f=a.document,i=a.checkStartOfBlock(),k=a.checkEndOfBlock(),j=b.elementPath(a.startContainer),c=j.block,l=d==CKEDITOR.ENTER_DIV?"div":"p",e;if(i&&k){if(c&&(c.is("li")||c.getParent().is("li"))){c.is("li")||(c=c.getParent());a=c.getParent();e=a.getParent();var h=!c.hasPrevious(),n=!c.hasNext(),l=b.getSelection(),g=l.createBookmarks(),i=c.getDirection(1),k=c.getAttribute("class"),o=c.getAttribute("style"),m=e.getDirection(1)!=i,b=b.enterMode!=CKEDITOR.ENTER_BR||m||o||k;
+if(e.is("li"))if(h||n)c[h?"insertBefore":"insertAfter"](e);else c.breakParent(e);else{if(b)if(j.block.is("li")?(e=f.createElement(d==CKEDITOR.ENTER_P?"p":"div"),m&&e.setAttribute("dir",i),o&&e.setAttribute("style",o),k&&e.setAttribute("class",k),c.moveChildren(e)):e=j.block,h||n)e[h?"insertBefore":"insertAfter"](a);else c.breakParent(a),e.insertAfter(a);else if(c.appendBogus(!0),h||n)for(;f=c[h?"getFirst":"getLast"]();)f[h?"insertBefore":"insertAfter"](a);else for(c.breakParent(a);f=c.getLast();)f.insertAfter(a);
+c.remove()}l.selectBookmarks(g);return}if(c&&c.getParent().is("blockquote")){c.breakParent(c.getParent());c.getPrevious().getFirst(CKEDITOR.dom.walker.invisible(1))||c.getPrevious().remove();c.getNext().getFirst(CKEDITOR.dom.walker.invisible(1))||c.getNext().remove();a.moveToElementEditStart(c);a.select();return}}else if(c&&c.is("pre")&&!k){p(b,d,a,h);return}if(i=a.splitBlock(l)){d=i.previousBlock;c=i.nextBlock;j=i.wasStartOfBlock;b=i.wasEndOfBlock;if(c)g=c.getParent(),g.is("li")&&(c.breakParent(g),
+c.move(c.getNext(),1));else if(d&&(g=d.getParent())&&g.is("li"))d.breakParent(g),g=d.getNext(),a.moveToElementEditStart(g),d.move(d.getPrevious());if(!j&&!b)c.is("li")&&(e=a.clone(),e.selectNodeContents(c),e=new CKEDITOR.dom.walker(e),e.evaluator=function(a){return!(w(a)||v(a)||a.type==CKEDITOR.NODE_ELEMENT&&a.getName()in CKEDITOR.dtd.$inline&&!(a.getName()in CKEDITOR.dtd.$empty))},(g=e.next())&&(g.type==CKEDITOR.NODE_ELEMENT&&g.is("ul","ol"))&&(CKEDITOR.env.needsBrFiller?f.createElement("br"):f.createText(" ")).insertBefore(g)),
+c&&a.moveToElementEditStart(c);else{if(d){if(d.is("li")||!s.test(d.getName())&&!d.is("pre"))e=d.clone()}else c&&(e=c.clone());e?h&&!e.is("li")&&e.renameNode(l):g&&g.is("li")?e=g:(e=f.createElement(l),d&&(n=d.getDirection())&&e.setAttribute("dir",n));if(f=i.elementPath){h=0;for(l=f.elements.length;h<l;h++){g=f.elements[h];if(g.equals(f.block)||g.equals(f.blockLimit))break;CKEDITOR.dtd.$removeEmpty[g.getName()]&&(g=g.clone(),e.moveChildren(g),e.append(g))}}e.appendBogus();e.getParent()||a.insertNode(e);
+e.is("li")&&e.removeAttribute("value");if(CKEDITOR.env.ie&&j&&(!b||!d.getChildCount()))a.moveToElementEditStart(b?d:e),a.select();a.moveToElementEditStart(j&&!b?c:e)}a.select();a.scrollIntoView()}}},enterBr:function(b,d,a,h){if(a=a||r(b)){var f=a.document,i=a.checkEndOfBlock(),k=new CKEDITOR.dom.elementPath(b.getSelection().getStartElement()),j=k.block,c=j&&k.block.getName();!h&&"li"==c?q(b,d,a,h):(!h&&i&&s.test(c)?(i=j.getDirection())?(f=f.createElement("div"),f.setAttribute("dir",i),f.insertAfter(j),
+a.setStart(f,0)):(f.createElement("br").insertAfter(j),CKEDITOR.env.gecko&&f.createText("").insertAfter(j),a.setStartAt(j.getNext(),CKEDITOR.env.ie?CKEDITOR.POSITION_BEFORE_START:CKEDITOR.POSITION_AFTER_START)):(b="pre"==c&&CKEDITOR.env.ie&&8>CKEDITOR.env.version?f.createText("\r"):f.createElement("br"),a.deleteContents(),a.insertNode(b),CKEDITOR.env.needsBrFiller?(f.createText("").insertAfter(b),i&&(j||k.blockLimit).appendBogus(),b.getNext().$.nodeValue="",a.setStartAt(b.getNext(),CKEDITOR.POSITION_AFTER_START)):
+a.setStartAt(b,CKEDITOR.POSITION_AFTER_END)),a.collapse(!0),a.select(),a.scrollIntoView())}}};var t=CKEDITOR.plugins.enterkey,p=t.enterBr,q=t.enterBlock,s=/^h[1-6]$/})();(function(){function i(b,f){var g={},c=[],e={nbsp:" ",shy:"­",gt:">",lt:"<",amp:"&",apos:"'",quot:'"'},b=b.replace(/\b(nbsp|shy|gt|lt|amp|apos|quot)(?:,|$)/g,function(b,a){var d=f?"&"+a+";":e[a];g[d]=f?e[a]:"&"+a+";";c.push(d);return""});if(!f&&b){var b=b.split(","),a=document.createElement("div"),d;a.innerHTML="&"+b.join(";&")+";";d=a.innerHTML;a=null;for(a=0;a<d.length;a++){var h=d.charAt(a);g[h]="&"+b[a]+";";c.push(h)}}g.regex=c.join(f?"|":"");return g}CKEDITOR.plugins.add("entities",{afterInit:function(b){function f(a){return h[a]}
+function g(b){return"force"==c.entities_processNumerical||!a[b]?"&#"+b.charCodeAt(0)+";":a[b]}var c=b.config;if(b=(b=b.dataProcessor)&&b.htmlFilter){var e=[];!1!==c.basicEntities&&e.push("nbsp,gt,lt,amp");c.entities&&(e.length&&e.push("quot,iexcl,cent,pound,curren,yen,brvbar,sect,uml,copy,ordf,laquo,not,shy,reg,macr,deg,plusmn,sup2,sup3,acute,micro,para,middot,cedil,sup1,ordm,raquo,frac14,frac12,frac34,iquest,times,divide,fnof,bull,hellip,prime,Prime,oline,frasl,weierp,image,real,trade,alefsym,larr,uarr,rarr,darr,harr,crarr,lArr,uArr,rArr,dArr,hArr,forall,part,exist,empty,nabla,isin,notin,ni,prod,sum,minus,lowast,radic,prop,infin,ang,and,or,cap,cup,int,there4,sim,cong,asymp,ne,equiv,le,ge,sub,sup,nsub,sube,supe,oplus,otimes,perp,sdot,lceil,rceil,lfloor,rfloor,lang,rang,loz,spades,clubs,hearts,diams,circ,tilde,ensp,emsp,thinsp,zwnj,zwj,lrm,rlm,ndash,mdash,lsquo,rsquo,sbquo,ldquo,rdquo,bdquo,dagger,Dagger,permil,lsaquo,rsaquo,euro"),
+c.entities_latin&&e.push("Agrave,Aacute,Acirc,Atilde,Auml,Aring,AElig,Ccedil,Egrave,Eacute,Ecirc,Euml,Igrave,Iacute,Icirc,Iuml,ETH,Ntilde,Ograve,Oacute,Ocirc,Otilde,Ouml,Oslash,Ugrave,Uacute,Ucirc,Uuml,Yacute,THORN,szlig,agrave,aacute,acirc,atilde,auml,aring,aelig,ccedil,egrave,eacute,ecirc,euml,igrave,iacute,icirc,iuml,eth,ntilde,ograve,oacute,ocirc,otilde,ouml,oslash,ugrave,uacute,ucirc,uuml,yacute,thorn,yuml,OElig,oelig,Scaron,scaron,Yuml"),c.entities_greek&&e.push("Alpha,Beta,Gamma,Delta,Epsilon,Zeta,Eta,Theta,Iota,Kappa,Lambda,Mu,Nu,Xi,Omicron,Pi,Rho,Sigma,Tau,Upsilon,Phi,Chi,Psi,Omega,alpha,beta,gamma,delta,epsilon,zeta,eta,theta,iota,kappa,lambda,mu,nu,xi,omicron,pi,rho,sigmaf,sigma,tau,upsilon,phi,chi,psi,omega,thetasym,upsih,piv"),
+c.entities_additional&&e.push(c.entities_additional));var a=i(e.join(",")),d=a.regex?"["+a.regex+"]":"a^";delete a.regex;c.entities&&c.entities_processNumerical&&(d="[^ -~]|"+d);var d=RegExp(d,"g"),h=i("nbsp,gt,lt,amp,shy",!0),j=RegExp(h.regex,"g");b.addRules({text:function(a){return a.replace(j,f).replace(d,g)}},{applyToAll:!0,excludeNestedEditable:!0})}}})})();CKEDITOR.config.basicEntities=!0;CKEDITOR.config.entities=!0;CKEDITOR.config.entities_latin=!0;CKEDITOR.config.entities_greek=!0;
+CKEDITOR.config.entities_additional="#39";CKEDITOR.plugins.add("popup");
+CKEDITOR.tools.extend(CKEDITOR.editor.prototype,{popup:function(e,a,b,d){a=a||"80%";b=b||"70%";"string"==typeof a&&(1<a.length&&"%"==a.substr(a.length-1,1))&&(a=parseInt(window.screen.width*parseInt(a,10)/100,10));"string"==typeof b&&(1<b.length&&"%"==b.substr(b.length-1,1))&&(b=parseInt(window.screen.height*parseInt(b,10)/100,10));640>a&&(a=640);420>b&&(b=420);var f=parseInt((window.screen.height-b)/2,10),g=parseInt((window.screen.width-a)/2,10),d=(d||"location=no,menubar=no,toolbar=no,dependent=yes,minimizable=no,modal=yes,alwaysRaised=yes,resizable=yes,scrollbars=yes")+",width="+
+a+",height="+b+",top="+f+",left="+g,c=window.open("",null,d,!0);if(!c)return!1;try{-1==navigator.userAgent.toLowerCase().indexOf(" chrome/")&&(c.moveTo(g,f),c.resizeTo(a,b)),c.focus(),c.location.href=e}catch(h){window.open(e,null,d,!0)}return!0}});(function(){function g(a,c){var d=[];if(c)for(var b in c)d.push(b+"="+encodeURIComponent(c[b]));else return a;return a+(-1!=a.indexOf("?")?"&":"?")+d.join("&")}function i(a){a+="";return a.charAt(0).toUpperCase()+a.substr(1)}function k(){var a=this.getDialog(),c=a.getParentEditor();c._.filebrowserSe=this;var d=c.config["filebrowser"+i(a.getName())+"WindowWidth"]||c.config.filebrowserWindowWidth||"80%",a=c.config["filebrowser"+i(a.getName())+"WindowHeight"]||c.config.filebrowserWindowHeight||"70%",
+b=this.filebrowser.params||{};b.CKEditor=c.name;b.CKEditorFuncNum=c._.filebrowserFn;b.langCode||(b.langCode=c.langCode);b=g(this.filebrowser.url,b);c.popup(b,d,a,c.config.filebrowserWindowFeatures||c.config.fileBrowserWindowFeatures)}function l(){var a=this.getDialog();a.getParentEditor()._.filebrowserSe=this;return!a.getContentElement(this["for"][0],this["for"][1]).getInputElement().$.value||!a.getContentElement(this["for"][0],this["for"][1]).getAction()?!1:!0}function m(a,c,d){var b=d.params||{};
+b.CKEditor=a.name;b.CKEditorFuncNum=a._.filebrowserFn;b.langCode||(b.langCode=a.langCode);c.action=g(d.url,b);c.filebrowser=d}function j(a,c,d,b){if(b&&b.length)for(var e,g=b.length;g--;)if(e=b[g],("hbox"==e.type||"vbox"==e.type||"fieldset"==e.type)&&j(a,c,d,e.children),e.filebrowser)if("string"==typeof e.filebrowser&&(e.filebrowser={action:"fileButton"==e.type?"QuickUpload":"Browse",target:e.filebrowser}),"Browse"==e.filebrowser.action){var f=e.filebrowser.url;void 0===f&&(f=a.config["filebrowser"+
+i(c)+"BrowseUrl"],void 0===f&&(f=a.config.filebrowserBrowseUrl));f&&(e.onClick=k,e.filebrowser.url=f,e.hidden=!1)}else if("QuickUpload"==e.filebrowser.action&&e["for"]&&(f=e.filebrowser.url,void 0===f&&(f=a.config["filebrowser"+i(c)+"UploadUrl"],void 0===f&&(f=a.config.filebrowserUploadUrl)),f)){var h=e.onClick;e.onClick=function(a){var b=a.sender;return h&&h.call(b,a)===false?false:l.call(b,a)};e.filebrowser.url=f;e.hidden=!1;m(a,d.getContents(e["for"][0]).get(e["for"][1]),e.filebrowser)}}function h(a,
+c,d){if(-1!==d.indexOf(";")){for(var d=d.split(";"),b=0;b<d.length;b++)if(h(a,c,d[b]))return!0;return!1}return(a=a.getContents(c).get(d).filebrowser)&&a.url}function n(a,c){var d=this._.filebrowserSe.getDialog(),b=this._.filebrowserSe["for"],e=this._.filebrowserSe.filebrowser.onSelect;b&&d.getContentElement(b[0],b[1]).reset();if(!("function"==typeof c&&!1===c.call(this._.filebrowserSe))&&!(e&&!1===e.call(this._.filebrowserSe,a,c))&&("string"==typeof c&&c&&alert(c),a&&(b=this._.filebrowserSe,d=b.getDialog(),
+b=b.filebrowser.target||null)))if(b=b.split(":"),e=d.getContentElement(b[0],b[1]))e.setValue(a),d.selectPage(b[0])}CKEDITOR.plugins.add("filebrowser",{requires:"popup",init:function(a){a._.filebrowserFn=CKEDITOR.tools.addFunction(n,a);a.on("destroy",function(){CKEDITOR.tools.removeFunction(this._.filebrowserFn)})}});CKEDITOR.on("dialogDefinition",function(a){if(a.editor.plugins.filebrowser)for(var c=a.data.definition,d,b=0;b<c.contents.length;++b)if(d=c.contents[b])j(a.editor,a.data.name,c,d.elements),
+d.hidden&&d.filebrowser&&(d.hidden=!h(c,d.id,d.filebrowser))})})();(function(){function i(a){var j=a.config,m=a.fire("uiSpace",{space:"top",html:""}).html,p=function(){function f(a,c,e){b.setStyle(c,s(e));b.setStyle("position",a)}function e(a){var b=i.getDocumentPosition();switch(a){case "top":f("absolute","top",b.y-n-o);break;case "pin":f("fixed","top",t);break;case "bottom":f("absolute","top",b.y+(c.height||c.bottom-c.top)+o)}k=a}var k,i,l,c,h,n,r,m=j.floatSpaceDockedOffsetX||0,o=j.floatSpaceDockedOffsetY||0,q=j.floatSpacePinnedOffsetX||0,t=j.floatSpacePinnedOffsetY||
+0;return function(d){if(i=a.editable())if(d&&"focus"==d.name&&b.show(),b.removeStyle("left"),b.removeStyle("right"),l=b.getClientRect(),c=i.getClientRect(),h=g.getViewPaneSize(),n=l.height,r="pageXOffset"in g.$?g.$.pageXOffset:CKEDITOR.document.$.documentElement.scrollLeft,k){n+o<=c.top?e("top"):n+o>h.height-c.bottom?e("pin"):e("bottom");var d=h.width/2,d=0<c.left&&c.right<h.width&&c.width>l.width?"rtl"==a.config.contentsLangDirection?"right":"left":d-c.left>c.right-d?"left":"right",f;l.width>h.width?
+(d="left",f=0):(f="left"==d?0<c.left?c.left:0:c.right<h.width?h.width-c.right:0,f+l.width>h.width&&(d="left"==d?"right":"left",f=0));b.setStyle(d,s(("pin"==k?q:m)+f+("pin"==k?0:"left"==d?r:-r)))}else k="pin",e("pin"),p(d)}}();if(m){var i=new CKEDITOR.template('<div id="cke_{name}" class="cke {id} cke_reset_all cke_chrome cke_editor_{name} cke_float cke_{langDir} '+CKEDITOR.env.cssClass+'" dir="{langDir}" title="'+(CKEDITOR.env.gecko?" ":"")+'" lang="{langCode}" role="application" style="{style}"'+
+(a.title?' aria-labelledby="cke_{name}_arialbl"':" ")+">"+(a.title?'<span id="cke_{name}_arialbl" class="cke_voice_label">{voiceLabel}</span>':" ")+'<div class="cke_inner"><div id="{topId}" class="cke_top" role="presentation">{content}</div></div></div>'),b=CKEDITOR.document.getBody().append(CKEDITOR.dom.element.createFromHtml(i.output({content:m,id:a.id,langDir:a.lang.dir,langCode:a.langCode,name:a.name,style:"display:none;z-index:"+(j.baseFloatZIndex-1),topId:a.ui.spaceId("top"),voiceLabel:a.title}))),
+q=CKEDITOR.tools.eventsBuffer(500,p),e=CKEDITOR.tools.eventsBuffer(100,p);b.unselectable();b.on("mousedown",function(a){a=a.data;a.getTarget().hasAscendant("a",1)||a.preventDefault()});a.on("focus",function(b){p(b);a.on("change",q.input);g.on("scroll",e.input);g.on("resize",e.input)});a.on("blur",function(){b.hide();a.removeListener("change",q.input);g.removeListener("scroll",e.input);g.removeListener("resize",e.input)});a.on("destroy",function(){g.removeListener("scroll",e.input);g.removeListener("resize",
+e.input);b.clearCustomData();b.remove()});a.focusManager.hasFocus&&b.show();a.focusManager.add(b,1)}}var g=CKEDITOR.document.getWindow(),s=CKEDITOR.tools.cssLength;CKEDITOR.plugins.add("floatingspace",{init:function(a){a.on("loaded",function(){i(this)},null,null,20)}})})();CKEDITOR.plugins.add("listblock",{requires:"panel",onLoad:function(){var f=CKEDITOR.addTemplate("panel-list",'<ul role="presentation" class="cke_panel_list">{items}</ul>'),g=CKEDITOR.addTemplate("panel-list-item",'<li id="{id}" class="cke_panel_listItem" role=presentation><a id="{id}_option" _cke_focus=1 hidefocus=true title="{title}" href="javascript:void(\'{val}\')" {onclick}="CKEDITOR.tools.callFunction({clickFn},\'{val}\'); return false;" role="option">{text}</a></li>'),h=CKEDITOR.addTemplate("panel-list-group",
+'<h1 id="{id}" class="cke_panel_grouptitle" role="presentation" >{label}</h1>'),i=/\'/g;CKEDITOR.ui.panel.prototype.addListBlock=function(a,b){return this.addBlock(a,new CKEDITOR.ui.listBlock(this.getHolderElement(),b))};CKEDITOR.ui.listBlock=CKEDITOR.tools.createClass({base:CKEDITOR.ui.panel.block,$:function(a,b){var b=b||{},c=b.attributes||(b.attributes={});(this.multiSelect=!!b.multiSelect)&&(c["aria-multiselectable"]=!0);!c.role&&(c.role="listbox");this.base.apply(this,arguments);this.element.setAttribute("role",
+c.role);c=this.keys;c[40]="next";c[9]="next";c[38]="prev";c[CKEDITOR.SHIFT+9]="prev";c[32]=CKEDITOR.env.ie?"mouseup":"click";CKEDITOR.env.ie&&(c[13]="mouseup");this._.pendingHtml=[];this._.pendingList=[];this._.items={};this._.groups={}},_:{close:function(){if(this._.started){var a=f.output({items:this._.pendingList.join("")});this._.pendingList=[];this._.pendingHtml.push(a);delete this._.started}},getClick:function(){this._.click||(this._.click=CKEDITOR.tools.addFunction(function(a){var b=this.toggle(a);
+if(this.onClick)this.onClick(a,b)},this));return this._.click}},proto:{add:function(a,b,c){var d=CKEDITOR.tools.getNextId();this._.started||(this._.started=1,this._.size=this._.size||0);this._.items[a]=d;var e;e=CKEDITOR.tools.htmlEncodeAttr(a).replace(i,"\\'");a={id:d,val:e,onclick:CKEDITOR.env.ie?'onclick="return false;" onmouseup':"onclick",clickFn:this._.getClick(),title:CKEDITOR.tools.htmlEncodeAttr(c||a),text:b||a};this._.pendingList.push(g.output(a))},startGroup:function(a){this._.close();
+var b=CKEDITOR.tools.getNextId();this._.groups[a]=b;this._.pendingHtml.push(h.output({id:b,label:a}))},commit:function(){this._.close();this.element.appendHtml(this._.pendingHtml.join(""));delete this._.size;this._.pendingHtml=[]},toggle:function(a){var b=this.isMarked(a);b?this.unmark(a):this.mark(a);return!b},hideGroup:function(a){var b=(a=this.element.getDocument().getById(this._.groups[a]))&&a.getNext();a&&(a.setStyle("display","none"),b&&"ul"==b.getName()&&b.setStyle("display","none"))},hideItem:function(a){this.element.getDocument().getById(this._.items[a]).setStyle("display",
+"none")},showAll:function(){var a=this._.items,b=this._.groups,c=this.element.getDocument(),d;for(d in a)c.getById(a[d]).setStyle("display","");for(var e in b)a=c.getById(b[e]),d=a.getNext(),a.setStyle("display",""),d&&"ul"==d.getName()&&d.setStyle("display","")},mark:function(a){this.multiSelect||this.unmarkAll();var a=this._.items[a],b=this.element.getDocument().getById(a);b.addClass("cke_selected");this.element.getDocument().getById(a+"_option").setAttribute("aria-selected",!0);this.onMark&&this.onMark(b)},
+unmark:function(a){var b=this.element.getDocument(),a=this._.items[a],c=b.getById(a);c.removeClass("cke_selected");b.getById(a+"_option").removeAttribute("aria-selected");this.onUnmark&&this.onUnmark(c)},unmarkAll:function(){var a=this._.items,b=this.element.getDocument(),c;for(c in a){var d=a[c];b.getById(d).removeClass("cke_selected");b.getById(d+"_option").removeAttribute("aria-selected")}this.onUnmark&&this.onUnmark()},isMarked:function(a){return this.element.getDocument().getById(this._.items[a]).hasClass("cke_selected")},
+focus:function(a){this._.focusIndex=-1;var b=this.element.getElementsByTag("a"),c,d=-1;if(a)for(c=this.element.getDocument().getById(this._.items[a]).getFirst();a=b.getItem(++d);){if(a.equals(c)){this._.focusIndex=d;break}}else this.element.focus();c&&setTimeout(function(){c.focus()},0)}}})}});CKEDITOR.plugins.add("richcombo",{requires:"floatpanel,listblock,button",beforeInit:function(d){d.ui.addHandler(CKEDITOR.UI_RICHCOMBO,CKEDITOR.ui.richCombo.handler)}});
+(function(){var d='<span id="{id}" class="cke_combo cke_combo__{name} {cls}" role="presentation"><span id="{id}_label" class="cke_combo_label">{label}</span><a class="cke_combo_button" title="{title}" tabindex="-1"'+(CKEDITOR.env.gecko&&!CKEDITOR.env.hc?"":" href=\"javascript:void('{titleJs}')\"")+' hidefocus="true" role="button" aria-labelledby="{id}_label" aria-haspopup="true"';CKEDITOR.env.gecko&&CKEDITOR.env.mac&&(d+=' onkeypress="return false;"');CKEDITOR.env.gecko&&(d+=' onblur="this.style.cssText = this.style.cssText;"');
+var d=d+(' onkeydown="return CKEDITOR.tools.callFunction({keydownFn},event,this);" onfocus="return CKEDITOR.tools.callFunction({focusFn},event);" '+(CKEDITOR.env.ie?'onclick="return false;" onmouseup':"onclick")+'="CKEDITOR.tools.callFunction({clickFn},this);return false;"><span id="{id}_text" class="cke_combo_text cke_combo_inlinelabel">{label}</span><span class="cke_combo_open"><span class="cke_combo_arrow">'+(CKEDITOR.env.hc?"&#9660;":CKEDITOR.env.air?"&nbsp;":"")+"</span></span></a></span>"),
+i=CKEDITOR.addTemplate("combo",d);CKEDITOR.UI_RICHCOMBO="richcombo";CKEDITOR.ui.richCombo=CKEDITOR.tools.createClass({$:function(a){CKEDITOR.tools.extend(this,a,{canGroup:!1,title:a.label,modes:{wysiwyg:1},editorFocus:1});a=this.panel||{};delete this.panel;this.id=CKEDITOR.tools.getNextNumber();this.document=a.parent&&a.parent.getDocument()||CKEDITOR.document;a.className="cke_combopanel";a.block={multiSelect:a.multiSelect,attributes:a.attributes};a.toolbarRelated=!0;this._={panelDefinition:a,items:{}}},
+proto:{renderHtml:function(a){var b=[];this.render(a,b);return b.join("")},render:function(a,b){function g(){if(this.getState()!=CKEDITOR.TRISTATE_ON){var c=this.modes[a.mode]?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED;a.readOnly&&!this.readOnly&&(c=CKEDITOR.TRISTATE_DISABLED);this.setState(c);this.setValue("");c!=CKEDITOR.TRISTATE_DISABLED&&this.refresh&&this.refresh()}}var d=CKEDITOR.env,h="cke_"+this.id,e=CKEDITOR.tools.addFunction(function(b){j&&(a.unlockSelection(1),j=0);c.execute(b)},
+this),f=this,c={id:h,combo:this,focus:function(){CKEDITOR.document.getById(h).getChild(1).focus()},execute:function(c){var b=f._;if(b.state!=CKEDITOR.TRISTATE_DISABLED)if(f.createPanel(a),b.on)b.panel.hide();else{f.commit();var d=f.getValue();d?b.list.mark(d):b.list.unmarkAll();b.panel.showBlock(f.id,new CKEDITOR.dom.element(c),4)}},clickFn:e};a.on("activeFilterChange",g,this);a.on("mode",g,this);a.on("selectionChange",g,this);!this.readOnly&&a.on("readOnly",g,this);var k=CKEDITOR.tools.addFunction(function(b,
+d){var b=new CKEDITOR.dom.event(b),g=b.getKeystroke();if(40==g)a.once("panelShow",function(a){a.data._.panel._.currentBlock.onKeyDown(40)});switch(g){case 13:case 32:case 40:CKEDITOR.tools.callFunction(e,d);break;default:c.onkey(c,g)}b.preventDefault()}),l=CKEDITOR.tools.addFunction(function(){c.onfocus&&c.onfocus()}),j=0;c.keyDownFn=k;d={id:h,name:this.name||this.command,label:this.label,title:this.title,cls:this.className||"",titleJs:d.gecko&&!d.hc?"":(this.title||"").replace("'",""),keydownFn:k,
+focusFn:l,clickFn:e};i.output(d,b);if(this.onRender)this.onRender();return c},createPanel:function(a){if(!this._.panel){var b=this._.panelDefinition,d=this._.panelDefinition.block,i=b.parent||CKEDITOR.document.getBody(),h="cke_combopanel__"+this.name,e=new CKEDITOR.ui.floatPanel(a,i,b),f=e.addListBlock(this.id,d),c=this;e.onShow=function(){this.element.addClass(h);c.setState(CKEDITOR.TRISTATE_ON);c._.on=1;c.editorFocus&&!a.focusManager.hasFocus&&a.focus();if(c.onOpen)c.onOpen();a.once("panelShow",
+function(){f.focus(!f.multiSelect&&c.getValue())})};e.onHide=function(b){this.element.removeClass(h);c.setState(c.modes&&c.modes[a.mode]?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED);c._.on=0;if(!b&&c.onClose)c.onClose()};e.onEscape=function(){e.hide(1)};f.onClick=function(a,b){c.onClick&&c.onClick.call(c,a,b);e.hide()};this._.panel=e;this._.list=f;e.getBlock(this.id).onHide=function(){c._.on=0;c.setState(CKEDITOR.TRISTATE_OFF)};this.init&&this.init()}},setValue:function(a,b){this._.value=a;var d=
+this.document.getById("cke_"+this.id+"_text");d&&(!a&&!b?(b=this.label,d.addClass("cke_combo_inlinelabel")):d.removeClass("cke_combo_inlinelabel"),d.setText("undefined"!=typeof b?b:a))},getValue:function(){return this._.value||""},unmarkAll:function(){this._.list.unmarkAll()},mark:function(a){this._.list.mark(a)},hideItem:function(a){this._.list.hideItem(a)},hideGroup:function(a){this._.list.hideGroup(a)},showAll:function(){this._.list.showAll()},add:function(a,b,d){this._.items[a]=d||a;this._.list.add(a,
+b,d)},startGroup:function(a){this._.list.startGroup(a)},commit:function(){this._.committed||(this._.list.commit(),this._.committed=1,CKEDITOR.ui.fire("ready",this));this._.committed=1},setState:function(a){if(this._.state!=a){var b=this.document.getById("cke_"+this.id);b.setState(a,"cke_combo");a==CKEDITOR.TRISTATE_DISABLED?b.setAttribute("aria-disabled",!0):b.removeAttribute("aria-disabled");this._.state=a}},getState:function(){return this._.state},enable:function(){this._.state==CKEDITOR.TRISTATE_DISABLED&&
+this.setState(this._.lastState)},disable:function(){this._.state!=CKEDITOR.TRISTATE_DISABLED&&(this._.lastState=this._.state,this.setState(CKEDITOR.TRISTATE_DISABLED))}},statics:{handler:{create:function(a){return new CKEDITOR.ui.richCombo(a)}}}});CKEDITOR.ui.prototype.addRichCombo=function(a,b){this.add(a,CKEDITOR.UI_RICHCOMBO,b)}})();CKEDITOR.plugins.add("format",{requires:"richcombo",init:function(a){if(!a.blockless){for(var f=a.config,c=a.lang.format,j=f.format_tags.split(";"),d={},k=0,l=[],g=0;g<j.length;g++){var h=j[g],i=new CKEDITOR.style(f["format_"+h]);if(!a.filter.customConfig||a.filter.check(i))k++,d[h]=i,d[h]._.enterMode=a.config.enterMode,l.push(i)}0!==k&&a.ui.addRichCombo("Format",{label:c.label,title:c.panelTitle,toolbar:"styles,20",allowedContent:l,panel:{css:[CKEDITOR.skin.getPath("editor")].concat(f.contentsCss),
+multiSelect:!1,attributes:{"aria-label":c.panelTitle}},init:function(){this.startGroup(c.panelTitle);for(var a in d){var e=c["tag_"+a];this.add(a,d[a].buildPreview(e),e)}},onClick:function(b){a.focus();a.fire("saveSnapshot");var b=d[b],e=a.elementPath();a[b.checkActive(e,a)?"removeStyle":"applyStyle"](b);setTimeout(function(){a.fire("saveSnapshot")},0)},onRender:function(){a.on("selectionChange",function(b){var e=this.getValue(),b=b.data.path;this.refresh();for(var c in d)if(d[c].checkActive(b,a)){c!=
+e&&this.setValue(c,a.lang.format["tag_"+c]);return}this.setValue("")},this)},onOpen:function(){this.showAll();for(var b in d)a.activeFilter.check(d[b])||this.hideItem(b)},refresh:function(){var b=a.elementPath();if(b){if(b.isContextFor("p"))for(var c in d)if(a.activeFilter.check(d[c]))return;this.setState(CKEDITOR.TRISTATE_DISABLED)}}})}}});CKEDITOR.config.format_tags="p;h1;h2;h3;h4;h5;h6;pre;address;div";CKEDITOR.config.format_p={element:"p"};CKEDITOR.config.format_div={element:"div"};
+CKEDITOR.config.format_pre={element:"pre"};CKEDITOR.config.format_address={element:"address"};CKEDITOR.config.format_h1={element:"h1"};CKEDITOR.config.format_h2={element:"h2"};CKEDITOR.config.format_h3={element:"h3"};CKEDITOR.config.format_h4={element:"h4"};CKEDITOR.config.format_h5={element:"h5"};CKEDITOR.config.format_h6={element:"h6"};(function(){var b={canUndo:!1,exec:function(a){var b=a.document.createElement("hr");a.insertElement(b)},allowedContent:"hr",requiredContent:"hr"};CKEDITOR.plugins.add("horizontalrule",{init:function(a){a.blockless||(a.addCommand("horizontalrule",b),a.ui.addButton&&a.ui.addButton("HorizontalRule",{label:a.lang.horizontalrule.toolbar,command:"horizontalrule",toolbar:"insert,40"}))}})})();CKEDITOR.plugins.add("htmlwriter",{init:function(b){var a=new CKEDITOR.htmlWriter;a.forceSimpleAmpersand=b.config.forceSimpleAmpersand;a.indentationChars=b.config.dataIndentationChars||"\t";b.dataProcessor.writer=a}});
+CKEDITOR.htmlWriter=CKEDITOR.tools.createClass({base:CKEDITOR.htmlParser.basicWriter,$:function(){this.base();this.indentationChars="\t";this.selfClosingEnd=" />";this.lineBreakChars="\n";this.sortAttributes=1;this._.indent=0;this._.indentation="";this._.inPre=0;this._.rules={};var b=CKEDITOR.dtd,a;for(a in CKEDITOR.tools.extend({},b.$nonBodyContent,b.$block,b.$listItem,b.$tableContent))this.setRules(a,{indent:!b[a]["#"],breakBeforeOpen:1,breakBeforeClose:!b[a]["#"],breakAfterClose:1,needsSpace:a in
+b.$block&&!(a in{li:1,dt:1,dd:1})});this.setRules("br",{breakAfterOpen:1});this.setRules("title",{indent:0,breakAfterOpen:0});this.setRules("style",{indent:0,breakBeforeClose:1});this.setRules("pre",{breakAfterOpen:1,indent:0})},proto:{openTag:function(b){var a=this._.rules[b];this._.afterCloser&&(a&&a.needsSpace&&this._.needsSpace)&&this._.output.push("\n");this._.indent?this.indentation():a&&a.breakBeforeOpen&&(this.lineBreak(),this.indentation());this._.output.push("<",b);this._.afterCloser=0},
+openTagClose:function(b,a){var c=this._.rules[b];a?(this._.output.push(this.selfClosingEnd),c&&c.breakAfterClose&&(this._.needsSpace=c.needsSpace)):(this._.output.push(">"),c&&c.indent&&(this._.indentation+=this.indentationChars));c&&c.breakAfterOpen&&this.lineBreak();"pre"==b&&(this._.inPre=1)},attribute:function(b,a){"string"==typeof a&&(this.forceSimpleAmpersand&&(a=a.replace(/&amp;/g,"&")),a=CKEDITOR.tools.htmlEncodeAttr(a));this._.output.push(" ",b,'="',a,'"')},closeTag:function(b){var a=this._.rules[b];
+a&&a.indent&&(this._.indentation=this._.indentation.substr(this.indentationChars.length));this._.indent?this.indentation():a&&a.breakBeforeClose&&(this.lineBreak(),this.indentation());this._.output.push("</",b,">");"pre"==b&&(this._.inPre=0);a&&a.breakAfterClose&&(this.lineBreak(),this._.needsSpace=a.needsSpace);this._.afterCloser=1},text:function(b){this._.indent&&(this.indentation(),!this._.inPre&&(b=CKEDITOR.tools.ltrim(b)));this._.output.push(b)},comment:function(b){this._.indent&&this.indentation();
+this._.output.push("<\!--",b,"--\>")},lineBreak:function(){!this._.inPre&&0<this._.output.length&&this._.output.push(this.lineBreakChars);this._.indent=1},indentation:function(){!this._.inPre&&this._.indentation&&this._.output.push(this._.indentation);this._.indent=0},reset:function(){this._.output=[];this._.indent=0;this._.indentation="";this._.afterCloser=0;this._.inPre=0},setRules:function(b,a){var c=this._.rules[b];c?CKEDITOR.tools.extend(c,a,!0):this._.rules[b]=a}}});(function(){function k(a){var e=this.editor,b=a.document,c=b.body,d=b.getElementById("cke_actscrpt");d&&d.parentNode.removeChild(d);(d=b.getElementById("cke_shimscrpt"))&&d.parentNode.removeChild(d);(d=b.getElementById("cke_basetagscrpt"))&&d.parentNode.removeChild(d);c.contentEditable=!0;CKEDITOR.env.ie&&(c.hideFocus=!0,c.disabled=!0,c.removeAttribute("disabled"));delete this._.isLoadingData;this.$=c;b=new CKEDITOR.dom.document(b);this.setup();this.fixInitialSelection();CKEDITOR.env.ie&&(b.getDocumentElement().addClass(b.$.compatMode),
+e.config.enterMode!=CKEDITOR.ENTER_P&&this.attachListener(b,"selectionchange",function(){var a=b.getBody(),c=e.getSelection(),d=c&&c.getRanges()[0];d&&(a.getHtml().match(/^<p>(?:&nbsp;|<br>)<\/p>$/i)&&d.startContainer.equals(a))&&setTimeout(function(){d=e.getSelection().getRanges()[0];if(!d.startContainer.equals("body")){a.getFirst().remove(1);d.moveToElementEditEnd(a);d.select()}},0)}));if(CKEDITOR.env.webkit||CKEDITOR.env.ie&&10<CKEDITOR.env.version)b.getDocumentElement().on("mousedown",function(a){a.data.getTarget().is("html")&&
+setTimeout(function(){e.editable().focus()})});l(e);try{e.document.$.execCommand("2D-position",!1,!0)}catch(g){}(CKEDITOR.env.gecko||CKEDITOR.env.ie&&"CSS1Compat"==e.document.$.compatMode)&&this.attachListener(this,"keydown",function(a){var b=a.data.getKeystroke();if(b==33||b==34)if(CKEDITOR.env.ie)setTimeout(function(){e.getSelection().scrollIntoView()},0);else if(e.window.$.innerHeight>this.$.offsetHeight){var c=e.createRange();c[b==33?"moveToElementEditStart":"moveToElementEditEnd"](this);c.select();
+a.data.preventDefault()}});CKEDITOR.env.ie&&this.attachListener(b,"blur",function(){try{b.$.selection.empty()}catch(a){}});CKEDITOR.env.iOS&&this.attachListener(b,"touchend",function(){a.focus()});c=e.document.getElementsByTag("title").getItem(0);c.data("cke-title",c.getText());CKEDITOR.env.ie&&(e.document.$.title=this._.docTitle);CKEDITOR.tools.setTimeout(function(){if(this.status=="unloaded")this.status="ready";e.fire("contentDom");if(this._.isPendingFocus){e.focus();this._.isPendingFocus=false}setTimeout(function(){e.fire("dataReady")},
+0);CKEDITOR.env.ie&&setTimeout(function(){if(e.document){var a=e.document.$.body;a.runtimeStyle.marginBottom="0px";a.runtimeStyle.marginBottom=""}},1E3)},0,this)}function l(a){function e(){var c;a.editable().attachListener(a,"selectionChange",function(){var d=a.getSelection().getSelectedElement();d&&(c&&(c.detachEvent("onresizestart",b),c=null),d.$.attachEvent("onresizestart",b),c=d.$)})}function b(a){a.returnValue=!1}if(CKEDITOR.env.gecko)try{var c=a.document.$;c.execCommand("enableObjectResizing",
+!1,!a.config.disableObjectResizing);c.execCommand("enableInlineTableEditing",!1,!a.config.disableNativeTableHandles)}catch(d){}else CKEDITOR.env.ie&&(11>CKEDITOR.env.version&&a.config.disableObjectResizing)&&e(a)}function m(){var a=[];if(8<=CKEDITOR.document.$.documentMode){a.push("html.CSS1Compat [contenteditable=false]{min-height:0 !important}");var e=[],b;for(b in CKEDITOR.dtd.$removeEmpty)e.push("html.CSS1Compat "+b+"[contenteditable=false]");a.push(e.join(",")+"{display:inline-block}")}else CKEDITOR.env.gecko&&
+(a.push("html{height:100% !important}"),a.push("img:-moz-broken{-moz-force-broken-image-icon:1;min-width:24px;min-height:24px}"));a.push("html{cursor:text;*cursor:auto}");a.push("img,input,textarea{cursor:default}");return a.join("\n")}CKEDITOR.plugins.add("wysiwygarea",{init:function(a){a.config.fullPage&&a.addFeature({allowedContent:"html head title; style [media,type]; body (*)[id]; meta link [*]",requiredContent:"body"});a.addMode("wysiwyg",function(e){function b(b){b&&b.removeListener();a.editable(new j(a,
+d.$.contentWindow.document.body));a.setData(a.getData(1),e)}var c="document.open();"+(CKEDITOR.env.ie?"("+CKEDITOR.tools.fixDomain+")();":"")+"document.close();",c=CKEDITOR.env.air?"javascript:void(0)":CKEDITOR.env.ie?"javascript:void(function(){"+encodeURIComponent(c)+"}())":"",d=CKEDITOR.dom.element.createFromHtml('<iframe src="'+c+'" frameBorder="0"></iframe>');d.setStyles({width:"100%",height:"100%"});d.addClass("cke_wysiwyg_frame cke_reset");var g=a.ui.space("contents");g.append(d);if(c=CKEDITOR.env.ie||
+CKEDITOR.env.gecko)d.on("load",b);var f=a.title,h=a.fire("ariaEditorHelpLabel",{}).label;f&&(CKEDITOR.env.ie&&h&&(f+=", "+h),d.setAttribute("title",f));if(h){var f=CKEDITOR.tools.getNextId(),i=CKEDITOR.dom.element.createFromHtml('<span id="'+f+'" class="cke_voice_label">'+h+"</span>");g.append(i,1);d.setAttribute("aria-describedby",f)}a.on("beforeModeUnload",function(a){a.removeListener();i&&i.remove()});d.setAttributes({tabIndex:a.tabIndex,allowTransparency:"true"});!c&&b();CKEDITOR.env.webkit&&
+(c=function(){g.setStyle("width","100%");d.hide();d.setSize("width",g.getSize("width"));g.removeStyle("width");d.show()},d.setCustomData("onResize",c),CKEDITOR.document.getWindow().on("resize",c));a.fire("ariaWidget",d)})}});CKEDITOR.editor.prototype.addContentsCss=function(a){var e=this.config,b=e.contentsCss;CKEDITOR.tools.isArray(b)||(e.contentsCss=b?[b]:[]);e.contentsCss.push(a)};var j=CKEDITOR.tools.createClass({$:function(){this.base.apply(this,arguments);this._.frameLoadedHandler=CKEDITOR.tools.addFunction(function(a){CKEDITOR.tools.setTimeout(k,
+0,this,a)},this);this._.docTitle=this.getWindow().getFrame().getAttribute("title")},base:CKEDITOR.editable,proto:{setData:function(a,e){var b=this.editor;if(e)this.setHtml(a),this.fixInitialSelection(),b.fire("dataReady");else{this._.isLoadingData=!0;b._.dataStore={id:1};var c=b.config,d=c.fullPage,g=c.docType,f=CKEDITOR.tools.buildStyleHtml(m()).replace(/<style>/,'<style data-cke-temp="1">');d||(f+=CKEDITOR.tools.buildStyleHtml(b.config.contentsCss));var h=c.baseHref?'<base href="'+c.baseHref+'" data-cke-temp="1" />':
+"";d&&(a=a.replace(/<!DOCTYPE[^>]*>/i,function(a){b.docType=g=a;return""}).replace(/<\?xml\s[^\?]*\?>/i,function(a){b.xmlDeclaration=a;return""}));a=b.dataProcessor.toHtml(a);d?(/<body[\s|>]/.test(a)||(a="<body>"+a),/<html[\s|>]/.test(a)||(a="<html>"+a+"</html>"),/<head[\s|>]/.test(a)?/<title[\s|>]/.test(a)||(a=a.replace(/<head[^>]*>/,"$&<title></title>")):a=a.replace(/<html[^>]*>/,"$&<head><title></title></head>"),h&&(a=a.replace(/<head[^>]*?>/,"$&"+h)),a=a.replace(/<\/head\s*>/,f+"$&"),a=g+a):a=
+c.docType+'<html dir="'+c.contentsLangDirection+'" lang="'+(c.contentsLanguage||b.langCode)+'"><head><title>'+this._.docTitle+"</title>"+h+f+"</head><body"+(c.bodyId?' id="'+c.bodyId+'"':"")+(c.bodyClass?' class="'+c.bodyClass+'"':"")+">"+a+"</body></html>";CKEDITOR.env.gecko&&(a=a.replace(/<body/,'<body contenteditable="true" '),2E4>CKEDITOR.env.version&&(a=a.replace(/<body[^>]*>/,"$&<\!-- cke-content-start --\>")));c='<script id="cke_actscrpt" type="text/javascript"'+(CKEDITOR.env.ie?' defer="defer" ':
+"")+">var wasLoaded=0;function onload(){if(!wasLoaded)window.parent.CKEDITOR.tools.callFunction("+this._.frameLoadedHandler+",window);wasLoaded=1;}"+(CKEDITOR.env.ie?"onload();":'document.addEventListener("DOMContentLoaded", onload, false );')+"<\/script>";CKEDITOR.env.ie&&9>CKEDITOR.env.version&&(c+='<script id="cke_shimscrpt">window.parent.CKEDITOR.tools.enableHtml5Elements(document)<\/script>');h&&(CKEDITOR.env.ie&&10>CKEDITOR.env.version)&&(c+='<script id="cke_basetagscrpt">var baseTag = document.querySelector( "base" );baseTag.href = baseTag.href;<\/script>');
+a=a.replace(/(?=\s*<\/(:?head)>)/,c);this.clearCustomData();this.clearListeners();b.fire("contentDomUnload");var i=this.getDocument();try{i.write(a)}catch(j){setTimeout(function(){i.write(a)},0)}}},getData:function(a){if(a)return this.getHtml();var a=this.editor,e=a.config,b=e.fullPage,c=b&&a.docType,d=b&&a.xmlDeclaration,g=this.getDocument(),b=b?g.getDocumentElement().getOuterHtml():g.getBody().getHtml();CKEDITOR.env.gecko&&e.enterMode!=CKEDITOR.ENTER_BR&&(b=b.replace(/<br>(?=\s*(:?$|<\/body>))/,
+""));b=a.dataProcessor.toDataFormat(b);d&&(b=d+"\n"+b);c&&(b=c+"\n"+b);return b},focus:function(){this._.isLoadingData?this._.isPendingFocus=!0:j.baseProto.focus.call(this)},detach:function(){var a=this.editor,e=a.document,a=a.window.getFrame();j.baseProto.detach.call(this);this.clearCustomData();e.getDocumentElement().clearCustomData();a.clearCustomData();CKEDITOR.tools.removeFunction(this._.frameLoadedHandler);(e=a.removeCustomData("onResize"))&&e.removeListener();a.remove()}}})})();
+CKEDITOR.config.disableObjectResizing=!1;CKEDITOR.config.disableNativeTableHandles=!0;CKEDITOR.config.disableNativeSpellChecker=!0;CKEDITOR.config.contentsCss=CKEDITOR.getUrl("contents.css");(function(){function e(b,a){a||(a=b.getSelection().getSelectedElement());if(a&&a.is("img")&&!a.data("cke-realelement")&&!a.isReadOnly())return a}function f(b){var a=b.getStyle("float");if("inherit"==a||"none"==a)a=0;a||(a=b.getAttribute("align"));return a}CKEDITOR.plugins.add("image",{requires:"dialog",init:function(b){if(!b.plugins.image2){CKEDITOR.dialog.add("image",this.path+"dialogs/image.js");var a="img[alt,!src]{border-style,border-width,float,height,margin,margin-bottom,margin-left,margin-right,margin-top,width}";
+CKEDITOR.dialog.isTabEnabled(b,"image","advanced")&&(a="img[alt,dir,id,lang,longdesc,!src,title]{*}(*)");b.addCommand("image",new CKEDITOR.dialogCommand("image",{allowedContent:a,requiredContent:"img[alt,src]",contentTransformations:[["img{width}: sizeToStyle","img[width]: sizeToAttribute"],["img{float}: alignmentToStyle","img[align]: alignmentToAttribute"]]}));b.ui.addButton&&b.ui.addButton("Image",{label:b.lang.common.image,command:"image",toolbar:"insert,10"});b.on("doubleclick",function(b){var a=
+b.data.element;a.is("img")&&(!a.data("cke-realelement")&&!a.isReadOnly())&&(b.data.dialog="image")});b.addMenuItems&&b.addMenuItems({image:{label:b.lang.image.menu,command:"image",group:"image"}});b.contextMenu&&b.contextMenu.addListener(function(a){if(e(b,a))return{image:CKEDITOR.TRISTATE_OFF}})}},afterInit:function(b){function a(a){var d=b.getCommand("justify"+a);if(d){if("left"==a||"right"==a)d.on("exec",function(d){var c=e(b),g;c&&(g=f(c),g==a?(c.removeStyle("float"),a==f(c)&&c.removeAttribute("align")):
+c.setStyle("float",a),d.cancel())});d.on("refresh",function(d){var c=e(b);c&&(c=f(c),this.setState(c==a?CKEDITOR.TRISTATE_ON:"right"==a||"left"==a?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED),d.cancel())})}}b.plugins.image2||(a("left"),a("right"),a("center"),a("block"))}})})();CKEDITOR.config.image_removeLinkByEmptyURL=!0;(function(){function k(a,b){var e,f;b.on("refresh",function(a){var b=[i],c;for(c in a.data.states)b.push(a.data.states[c]);this.setState(CKEDITOR.tools.search(b,m)?m:i)},b,null,100);b.on("exec",function(b){e=a.getSelection();f=e.createBookmarks(1);b.data||(b.data={});b.data.done=!1},b,null,0);b.on("exec",function(){a.forceNextSelectionCheck();e.selectBookmarks(f)},b,null,100)}var i=CKEDITOR.TRISTATE_DISABLED,m=CKEDITOR.TRISTATE_OFF;CKEDITOR.plugins.add("indent",{init:function(a){var b=CKEDITOR.plugins.indent.genericDefinition;
+k(a,a.addCommand("indent",new b(!0)));k(a,a.addCommand("outdent",new b));a.ui.addButton&&(a.ui.addButton("Indent",{label:a.lang.indent.indent,command:"indent",directional:!0,toolbar:"indent,20"}),a.ui.addButton("Outdent",{label:a.lang.indent.outdent,command:"outdent",directional:!0,toolbar:"indent,10"}));a.on("dirChanged",function(b){var f=a.createRange(),j=b.data.node;f.setStartBefore(j);f.setEndAfter(j);for(var l=new CKEDITOR.dom.walker(f),c;c=l.next();)if(c.type==CKEDITOR.NODE_ELEMENT)if(!c.equals(j)&&
+c.getDirection()){f.setStartAfter(c);l=new CKEDITOR.dom.walker(f)}else{var d=a.config.indentClasses;if(d)for(var g=b.data.dir=="ltr"?["_rtl",""]:["","_rtl"],h=0;h<d.length;h++)if(c.hasClass(d[h]+g[0])){c.removeClass(d[h]+g[0]);c.addClass(d[h]+g[1])}d=c.getStyle("margin-right");g=c.getStyle("margin-left");d?c.setStyle("margin-left",d):c.removeStyle("margin-left");g?c.setStyle("margin-right",g):c.removeStyle("margin-right")}})}});CKEDITOR.plugins.indent={genericDefinition:function(a){this.isIndent=
+!!a;this.startDisabled=!this.isIndent},specificDefinition:function(a,b,e){this.name=b;this.editor=a;this.jobs={};this.enterBr=a.config.enterMode==CKEDITOR.ENTER_BR;this.isIndent=!!e;this.relatedGlobal=e?"indent":"outdent";this.indentKey=e?9:CKEDITOR.SHIFT+9;this.database={}},registerCommands:function(a,b){a.on("pluginsLoaded",function(){for(var a in b)(function(a,b){var e=a.getCommand(b.relatedGlobal),c;for(c in b.jobs)e.on("exec",function(d){d.data.done||(a.fire("lockSnapshot"),b.execJob(a,c)&&(d.data.done=
+!0),a.fire("unlockSnapshot"),CKEDITOR.dom.element.clearAllMarkers(b.database))},this,null,c),e.on("refresh",function(d){d.data.states||(d.data.states={});d.data.states[b.name+"@"+c]=b.refreshJob(a,c,d.data.path)},this,null,c);a.addFeature(b)})(this,b[a])})}};CKEDITOR.plugins.indent.genericDefinition.prototype={context:"p",exec:function(){}};CKEDITOR.plugins.indent.specificDefinition.prototype={execJob:function(a,b){var e=this.jobs[b];if(e.state!=i)return e.exec.call(this,a)},refreshJob:function(a,
+b,e){b=this.jobs[b];b.state=a.activeFilter.checkFeature(this)?b.refresh.call(this,a,e):i;return b.state},getContext:function(a){return a.contains(this.context)}}})();(function(){function s(c){function f(b){for(var e=d.startContainer,a=d.endContainer;e&&!e.getParent().equals(b);)e=e.getParent();for(;a&&!a.getParent().equals(b);)a=a.getParent();if(!e||!a)return!1;for(var g=e,e=[],i=!1;!i;)g.equals(a)&&(i=!0),e.push(g),g=g.getNext();if(1>e.length)return!1;g=b.getParents(!0);for(a=0;a<g.length;a++)if(g[a].getName&&m[g[a].getName()]){b=g[a];break}for(var g=j.isIndent?1:-1,a=e[0],e=e[e.length-1],i=CKEDITOR.plugins.list.listToArray(b,n),l=i[e.getCustomData("listarray_index")].indent,
+a=a.getCustomData("listarray_index");a<=e.getCustomData("listarray_index");a++)if(i[a].indent+=g,0<g){var h=i[a].parent;i[a].parent=new CKEDITOR.dom.element(h.getName(),h.getDocument())}for(a=e.getCustomData("listarray_index")+1;a<i.length&&i[a].indent>l;a++)i[a].indent+=g;e=CKEDITOR.plugins.list.arrayToList(i,n,null,c.config.enterMode,b.getDirection());if(!j.isIndent){var f;if((f=b.getParent())&&f.is("li"))for(var g=e.listNode.getChildren(),o=[],k,a=g.count()-1;0<=a;a--)(k=g.getItem(a))&&(k.is&&
+k.is("li"))&&o.push(k)}e&&e.listNode.replace(b);if(o&&o.length)for(a=0;a<o.length;a++){for(k=b=o[a];(k=k.getNext())&&k.is&&k.getName()in m;)CKEDITOR.env.needsNbspFiller&&!b.getFirst(t)&&b.append(d.document.createText(" ")),b.append(k);b.insertAfter(f)}e&&c.fire("contentDomInvalidated");return!0}for(var j=this,n=this.database,m=this.context,l=c.getSelection(),l=(l&&l.getRanges()).createIterator(),d;d=l.getNextRange();){for(var b=d.getCommonAncestor();b&&!(b.type==CKEDITOR.NODE_ELEMENT&&m[b.getName()]);)b=
+b.getParent();b||(b=d.startPath().contains(m))&&d.setEndAt(b,CKEDITOR.POSITION_BEFORE_END);if(!b){var h=d.getEnclosedNode();h&&(h.type==CKEDITOR.NODE_ELEMENT&&h.getName()in m)&&(d.setStartAt(h,CKEDITOR.POSITION_AFTER_START),d.setEndAt(h,CKEDITOR.POSITION_BEFORE_END),b=h)}b&&(d.startContainer.type==CKEDITOR.NODE_ELEMENT&&d.startContainer.getName()in m)&&(h=new CKEDITOR.dom.walker(d),h.evaluator=p,d.startContainer=h.next());b&&(d.endContainer.type==CKEDITOR.NODE_ELEMENT&&d.endContainer.getName()in m)&&
+(h=new CKEDITOR.dom.walker(d),h.evaluator=p,d.endContainer=h.previous());if(b)return f(b)}return 0}function p(c){return c.type==CKEDITOR.NODE_ELEMENT&&c.is("li")}function t(c){return u(c)&&v(c)}var u=CKEDITOR.dom.walker.whitespaces(!0),v=CKEDITOR.dom.walker.bookmark(!1,!0),q=CKEDITOR.TRISTATE_DISABLED,r=CKEDITOR.TRISTATE_OFF;CKEDITOR.plugins.add("indentlist",{requires:"indent",init:function(c){function f(c){j.specificDefinition.apply(this,arguments);this.requiredContent=["ul","ol"];c.on("key",function(f){if("wysiwyg"==
+c.mode&&f.data.keyCode==this.indentKey){var l=this.getContext(c.elementPath());if(l&&(!this.isIndent||!CKEDITOR.plugins.indentList.firstItemInPath(this.context,c.elementPath(),l)))c.execCommand(this.relatedGlobal),f.cancel()}},this);this.jobs[this.isIndent?10:30]={refresh:this.isIndent?function(c,f){var d=this.getContext(f),b=CKEDITOR.plugins.indentList.firstItemInPath(this.context,f,d);return!d||!this.isIndent||b?q:r}:function(c,f){return!this.getContext(f)||this.isIndent?q:r},exec:CKEDITOR.tools.bind(s,
+this)}}var j=CKEDITOR.plugins.indent;j.registerCommands(c,{indentlist:new f(c,"indentlist",!0),outdentlist:new f(c,"outdentlist")});CKEDITOR.tools.extend(f.prototype,j.specificDefinition.prototype,{context:{ol:1,ul:1}})}});CKEDITOR.plugins.indentList={};CKEDITOR.plugins.indentList.firstItemInPath=function(c,f,j){var n=f.contains(p);j||(j=f.contains(c));return j&&n&&n.equals(j.getFirst(p))}})();(function(){function g(a,b){var c=j.exec(a),d=j.exec(b);if(c){if(!c[2]&&"px"==d[2])return d[1];if("px"==c[2]&&!d[2])return d[1]+"px"}return b}var i=CKEDITOR.htmlParser.cssStyle,h=CKEDITOR.tools.cssLength,j=/^((?:\d*(?:\.\d+))|(?:\d+))(.*)?$/i,k={elements:{$:function(a){var b=a.attributes;if((b=(b=(b=b&&b["data-cke-realelement"])&&new CKEDITOR.htmlParser.fragment.fromHtml(decodeURIComponent(b)))&&b.children[0])&&a.attributes["data-cke-resizable"]){var c=(new i(a)).rules,a=b.attributes,d=c.width,c=
+c.height;d&&(a.width=g(a.width,d));c&&(a.height=g(a.height,c))}return b}}};CKEDITOR.plugins.add("fakeobjects",{init:function(a){a.filter.allow("img[!data-cke-realelement,src,alt,title](*){*}","fakeobjects")},afterInit:function(a){(a=(a=a.dataProcessor)&&a.htmlFilter)&&a.addRules(k,{applyToAll:!0})}});CKEDITOR.editor.prototype.createFakeElement=function(a,b,c,d){var e=this.lang.fakeobjects,e=e[c]||e.unknown,b={"class":b,"data-cke-realelement":encodeURIComponent(a.getOuterHtml()),"data-cke-real-node-type":a.type,
+alt:e,title:e,align:a.getAttribute("align")||""};CKEDITOR.env.hc||(b.src=CKEDITOR.tools.transparentImageData);c&&(b["data-cke-real-element-type"]=c);d&&(b["data-cke-resizable"]=d,c=new i,d=a.getAttribute("width"),a=a.getAttribute("height"),d&&(c.rules.width=h(d)),a&&(c.rules.height=h(a)),c.populate(b));return this.document.createElement("img",{attributes:b})};CKEDITOR.editor.prototype.createFakeParserElement=function(a,b,c,d){var e=this.lang.fakeobjects,e=e[c]||e.unknown,f;f=new CKEDITOR.htmlParser.basicWriter;
+a.writeHtml(f);f=f.getHtml();b={"class":b,"data-cke-realelement":encodeURIComponent(f),"data-cke-real-node-type":a.type,alt:e,title:e,align:a.attributes.align||""};CKEDITOR.env.hc||(b.src=CKEDITOR.tools.transparentImageData);c&&(b["data-cke-real-element-type"]=c);d&&(b["data-cke-resizable"]=d,d=a.attributes,a=new i,c=d.width,d=d.height,void 0!==c&&(a.rules.width=h(c)),void 0!==d&&(a.rules.height=h(d)),a.populate(b));return new CKEDITOR.htmlParser.element("img",b)};CKEDITOR.editor.prototype.restoreRealElement=
+function(a){if(a.data("cke-real-node-type")!=CKEDITOR.NODE_ELEMENT)return null;var b=CKEDITOR.dom.element.createFromHtml(decodeURIComponent(a.data("cke-realelement")),this.document);if(a.data("cke-resizable")){var c=a.getStyle("width"),a=a.getStyle("height");c&&b.setAttribute("width",g(b.getAttribute("width"),c));a&&b.setAttribute("height",g(b.getAttribute("height"),a))}return b}})();(function(){function m(c){return c.replace(/'/g,"\\$&")}function n(c){for(var b,a=c.length,f=[],e=0;e<a;e++)b=c.charCodeAt(e),f.push(b);return"String.fromCharCode("+f.join(",")+")"}function o(c,b){var a=c.plugins.link,f=a.compiledProtectionFunction.params,e,d;d=[a.compiledProtectionFunction.name,"("];for(var g=0;g<f.length;g++)a=f[g].toLowerCase(),e=b[a],0<g&&d.push(","),d.push("'",e?m(encodeURIComponent(b[a])):"","'");d.push(")");return d.join("")}function l(c){var c=c.config.emailProtection||"",
+b;c&&"encode"!=c&&(b={},c.replace(/^([^(]+)\(([^)]+)\)$/,function(a,c,e){b.name=c;b.params=[];e.replace(/[^,\s]+/g,function(a){b.params.push(a)})}));return b}CKEDITOR.plugins.add("link",{requires:"dialog,fakeobjects",onLoad:function(){function c(b){return a.replace(/%1/g,"rtl"==b?"right":"left").replace(/%2/g,"cke_contents_"+b)}var b="background:url("+CKEDITOR.getUrl(this.path+"images"+(CKEDITOR.env.hidpi?"/hidpi":"")+"/anchor.png")+") no-repeat %1 center;border:1px dotted #00f;background-size:16px;",
+a=".%2 a.cke_anchor,.%2 a.cke_anchor_empty,.cke_editable.%2 a[name],.cke_editable.%2 a[data-cke-saved-name]{"+b+"padding-%1:18px;cursor:auto;}.%2 img.cke_anchor{"+b+"width:16px;min-height:15px;height:1.15em;vertical-align:text-bottom;}";CKEDITOR.addCss(c("ltr")+c("rtl"))},init:function(c){var b="a[!href]";CKEDITOR.dialog.isTabEnabled(c,"link","advanced")&&(b=b.replace("]",",accesskey,charset,dir,id,lang,name,rel,tabindex,title,type]{*}(*)"));CKEDITOR.dialog.isTabEnabled(c,"link","target")&&(b=b.replace("]",
+",target,onclick]"));c.addCommand("link",new CKEDITOR.dialogCommand("link",{allowedContent:b,requiredContent:"a[href]"}));c.addCommand("anchor",new CKEDITOR.dialogCommand("anchor",{allowedContent:"a[!name,id]",requiredContent:"a[name]"}));c.addCommand("unlink",new CKEDITOR.unlinkCommand);c.addCommand("removeAnchor",new CKEDITOR.removeAnchorCommand);c.setKeystroke(CKEDITOR.CTRL+76,"link");c.ui.addButton&&(c.ui.addButton("Link",{label:c.lang.link.toolbar,command:"link",toolbar:"links,10"}),c.ui.addButton("Unlink",
+{label:c.lang.link.unlink,command:"unlink",toolbar:"links,20"}),c.ui.addButton("Anchor",{label:c.lang.link.anchor.toolbar,command:"anchor",toolbar:"links,30"}));CKEDITOR.dialog.add("link",this.path+"dialogs/link.js");CKEDITOR.dialog.add("anchor",this.path+"dialogs/anchor.js");c.on("doubleclick",function(a){var b=CKEDITOR.plugins.link.getSelectedLink(c)||a.data.element;if(!b.isReadOnly())if(b.is("a")){a.data.dialog=b.getAttribute("name")&&(!b.getAttribute("href")||!b.getChildCount())?"anchor":"link";
+a.data.link=b}else if(CKEDITOR.plugins.link.tryRestoreFakeAnchor(c,b))a.data.dialog="anchor"},null,null,0);c.on("doubleclick",function(a){a.data.dialog in{link:1,anchor:1}&&a.data.link&&c.getSelection().selectElement(a.data.link)},null,null,20);c.addMenuItems&&c.addMenuItems({anchor:{label:c.lang.link.anchor.menu,command:"anchor",group:"anchor",order:1},removeAnchor:{label:c.lang.link.anchor.remove,command:"removeAnchor",group:"anchor",order:5},link:{label:c.lang.link.menu,command:"link",group:"link",
+order:1},unlink:{label:c.lang.link.unlink,command:"unlink",group:"link",order:5}});c.contextMenu&&c.contextMenu.addListener(function(a){if(!a||a.isReadOnly())return null;a=CKEDITOR.plugins.link.tryRestoreFakeAnchor(c,a);if(!a&&!(a=CKEDITOR.plugins.link.getSelectedLink(c)))return null;var b={};a.getAttribute("href")&&a.getChildCount()&&(b={link:CKEDITOR.TRISTATE_OFF,unlink:CKEDITOR.TRISTATE_OFF});if(a&&a.hasAttribute("name"))b.anchor=b.removeAnchor=CKEDITOR.TRISTATE_OFF;return b});this.compiledProtectionFunction=
+l(c)},afterInit:function(c){c.dataProcessor.dataFilter.addRules({elements:{a:function(a){return!a.attributes.name?null:!a.children.length?c.createFakeParserElement(a,"cke_anchor","anchor"):null}}});var b=c._.elementsPath&&c._.elementsPath.filters;b&&b.push(function(a,b){if("a"==b&&(CKEDITOR.plugins.link.tryRestoreFakeAnchor(c,a)||a.getAttribute("name")&&(!a.getAttribute("href")||!a.getChildCount())))return"anchor"})}});var p=/^javascript:/,q=/^mailto:([^?]+)(?:\?(.+))?$/,r=/subject=([^;?:@&=$,\/]*)/,
+s=/body=([^;?:@&=$,\/]*)/,t=/^#(.*)$/,u=/^((?:http|https|ftp|news):\/\/)?(.*)$/,v=/^(_(?:self|top|parent|blank))$/,w=/^javascript:void\(location\.href='mailto:'\+String\.fromCharCode\(([^)]+)\)(?:\+'(.*)')?\)$/,x=/^javascript:([^(]+)\(([^)]+)\)$/,y=/\s*window.open\(\s*this\.href\s*,\s*(?:'([^']*)'|null)\s*,\s*'([^']*)'\s*\)\s*;\s*return\s*false;*\s*/,z=/(?:^|,)([^=]+)=(\d+|yes|no)/gi,j={id:"advId",dir:"advLangDir",accessKey:"advAccessKey",name:"advName",lang:"advLangCode",tabindex:"advTabIndex",title:"advTitle",
+type:"advContentType","class":"advCSSClasses",charset:"advCharset",style:"advStyles",rel:"advRel"};CKEDITOR.plugins.link={getSelectedLink:function(c){var b=c.getSelection(),a=b.getSelectedElement();return a&&a.is("a")?a:(b=b.getRanges()[0])?(b.shrink(CKEDITOR.SHRINK_TEXT),c.elementPath(b.getCommonAncestor()).contains("a",1)):null},getEditorAnchors:function(c){for(var b=c.editable(),a=b.isInline()&&!c.plugins.divarea?c.document:b,b=a.getElementsByTag("a"),a=a.getElementsByTag("img"),f=[],e=0,d;d=b.getItem(e++);)if(d.data("cke-saved-name")||
+d.hasAttribute("name"))f.push({name:d.data("cke-saved-name")||d.getAttribute("name"),id:d.getAttribute("id")});for(e=0;d=a.getItem(e++);)(d=this.tryRestoreFakeAnchor(c,d))&&f.push({name:d.getAttribute("name"),id:d.getAttribute("id")});return f},fakeAnchor:!0,tryRestoreFakeAnchor:function(c,b){if(b&&b.data("cke-real-element-type")&&"anchor"==b.data("cke-real-element-type")){var a=c.restoreRealElement(b);if(a.data("cke-saved-name"))return a}},parseLinkAttributes:function(c,b){var a=b&&(b.data("cke-saved-href")||
+b.getAttribute("href"))||"",f=c.plugins.link.compiledProtectionFunction,e=c.config.emailProtection,d,g={};a.match(p)&&("encode"==e?a=a.replace(w,function(a,b,c){return"mailto:"+String.fromCharCode.apply(String,b.split(","))+(c&&c.replace(/\\'/g,"'"))}):e&&a.replace(x,function(a,b,c){if(b==f.name){g.type="email";for(var a=g.email={},b=/(^')|('$)/g,c=c.match(/[^,\s]+/g),d=c.length,e,h,i=0;i<d;i++)e=decodeURIComponent,h=c[i].replace(b,"").replace(/\\'/g,"'"),h=e(h),e=f.params[i].toLowerCase(),a[e]=h;
+a.address=[a.name,a.domain].join("@")}}));if(!g.type)if(e=a.match(t))g.type="anchor",g.anchor={},g.anchor.name=g.anchor.id=e[1];else if(e=a.match(q)){d=a.match(r);a=a.match(s);g.type="email";var i=g.email={};i.address=e[1];d&&(i.subject=decodeURIComponent(d[1]));a&&(i.body=decodeURIComponent(a[1]))}else if(a&&(d=a.match(u)))g.type="url",g.url={},g.url.protocol=d[1],g.url.url=d[2];if(b){if(a=b.getAttribute("target"))g.target={type:a.match(v)?a:"frame",name:a};else if(a=(a=b.data("cke-pa-onclick")||
+b.getAttribute("onclick"))&&a.match(y))for(g.target={type:"popup",name:a[1]};e=z.exec(a[2]);)("yes"==e[2]||"1"==e[2])&&!(e[1]in{height:1,width:1,top:1,left:1})?g.target[e[1]]=!0:isFinite(e[2])&&(g.target[e[1]]=e[2]);var a={},h;for(h in j)(e=b.getAttribute(h))&&(a[j[h]]=e);if(h=b.data("cke-saved-name")||a.advName)a.advName=h;CKEDITOR.tools.isEmpty(a)||(g.advanced=a)}return g},getLinkAttributes:function(c,b){var a=c.config.emailProtection||"",f={};switch(b.type){case "url":var a=b.url&&void 0!==b.url.protocol?
+b.url.protocol:"http://",e=b.url&&CKEDITOR.tools.trim(b.url.url)||"";f["data-cke-saved-href"]=0===e.indexOf("/")?e:a+e;break;case "anchor":a=b.anchor&&b.anchor.id;f["data-cke-saved-href"]="#"+(b.anchor&&b.anchor.name||a||"");break;case "email":var d=b.email,e=d.address;switch(a){case "":case "encode":var g=encodeURIComponent(d.subject||""),i=encodeURIComponent(d.body||""),d=[];g&&d.push("subject="+g);i&&d.push("body="+i);d=d.length?"?"+d.join("&"):"";"encode"==a?(a=["javascript:void(location.href='mailto:'+",
+n(e)],d&&a.push("+'",m(d),"'"),a.push(")")):a=["mailto:",e,d];break;default:a=e.split("@",2),d.name=a[0],d.domain=a[1],a=["javascript:",o(c,d)]}f["data-cke-saved-href"]=a.join("")}if(b.target)if("popup"==b.target.type){for(var a=["window.open(this.href, '",b.target.name||"","', '"],h="resizable status location toolbar menubar fullscreen scrollbars dependent".split(" "),e=h.length,g=function(a){b.target[a]&&h.push(a+"="+b.target[a])},d=0;d<e;d++)h[d]+=b.target[h[d]]?"=yes":"=no";g("width");g("left");
+g("height");g("top");a.push(h.join(","),"'); return false;");f["data-cke-pa-onclick"]=a.join("")}else"notSet"!=b.target.type&&b.target.name&&(f.target=b.target.name);if(b.advanced){for(var k in j)(a=b.advanced[j[k]])&&(f[k]=a);f.name&&(f["data-cke-saved-name"]=f.name)}f["data-cke-saved-href"]&&(f.href=f["data-cke-saved-href"]);k=CKEDITOR.tools.extend({target:1,onclick:1,"data-cke-pa-onclick":1,"data-cke-saved-name":1},j);for(var l in f)delete k[l];return{set:f,removed:CKEDITOR.tools.objectKeys(k)}}};
+CKEDITOR.unlinkCommand=function(){};CKEDITOR.unlinkCommand.prototype={exec:function(c){var b=new CKEDITOR.style({element:"a",type:CKEDITOR.STYLE_INLINE,alwaysRemoveElement:1});c.removeStyle(b)},refresh:function(c,b){var a=b.lastElement&&b.lastElement.getAscendant("a",!0);a&&"a"==a.getName()&&a.getAttribute("href")&&a.getChildCount()?this.setState(CKEDITOR.TRISTATE_OFF):this.setState(CKEDITOR.TRISTATE_DISABLED)},contextSensitive:1,startDisabled:1,requiredContent:"a[href]"};CKEDITOR.removeAnchorCommand=
+function(){};CKEDITOR.removeAnchorCommand.prototype={exec:function(c){var b=c.getSelection(),a=b.createBookmarks(),f;if(b&&(f=b.getSelectedElement())&&(!f.getChildCount()?CKEDITOR.plugins.link.tryRestoreFakeAnchor(c,f):f.is("a")))f.remove(1);else if(f=CKEDITOR.plugins.link.getSelectedLink(c))f.hasAttribute("href")?(f.removeAttributes({name:1,"data-cke-saved-name":1}),f.removeClass("cke_anchor")):f.remove(1);b.selectBookmarks(a)},requiredContent:"a[name]"};CKEDITOR.tools.extend(CKEDITOR.config,{linkShowAdvancedTab:!0,
+linkShowTargetTab:!0})})();(function(){function E(b,k,e){function d(d){if((a=c[d?"getFirst":"getLast"]())&&(!a.is||!a.isBlockBoundary())&&(m=k.root[d?"getPrevious":"getNext"](CKEDITOR.dom.walker.invisible(!0)))&&(!m.is||!m.isBlockBoundary({br:1})))b.document.createElement("br")[d?"insertBefore":"insertAfter"](a)}for(var f=CKEDITOR.plugins.list.listToArray(k.root,e),g=[],i=0;i<k.contents.length;i++){var h=k.contents[i];if((h=h.getAscendant("li",!0))&&!h.getCustomData("list_item_processed"))g.push(h),CKEDITOR.dom.element.setMarker(e,
+h,"list_item_processed",!0)}h=null;for(i=0;i<g.length;i++)h=g[i].getCustomData("listarray_index"),f[h].indent=-1;for(i=h+1;i<f.length;i++)if(f[i].indent>f[i-1].indent+1){g=f[i-1].indent+1-f[i].indent;for(h=f[i].indent;f[i]&&f[i].indent>=h;)f[i].indent+=g,i++;i--}var c=CKEDITOR.plugins.list.arrayToList(f,e,null,b.config.enterMode,k.root.getAttribute("dir")).listNode,a,m;d(!0);d();c.replace(k.root);b.fire("contentDomInvalidated")}function x(b,k){this.name=b;this.context=this.type=k;this.allowedContent=
+k+" li";this.requiredContent=k}function A(b,k,e,d){for(var f,g;f=b[d?"getLast":"getFirst"](F);)(g=f.getDirection(1))!==k.getDirection(1)&&f.setAttribute("dir",g),f.remove(),e?f[d?"insertBefore":"insertAfter"](e):k.append(f,d)}function B(b){function k(e){var d=b[e?"getPrevious":"getNext"](q);d&&(d.type==CKEDITOR.NODE_ELEMENT&&d.is(b.getName()))&&(A(b,d,null,!e),b.remove(),b=d)}k();k(1)}function C(b){return b.type==CKEDITOR.NODE_ELEMENT&&(b.getName()in CKEDITOR.dtd.$block||b.getName()in CKEDITOR.dtd.$listItem)&&
+CKEDITOR.dtd[b.getName()]["#"]}function y(b,k,e){b.fire("saveSnapshot");e.enlarge(CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS);var d=e.extractContents();k.trim(!1,!0);var f=k.createBookmark(),g=new CKEDITOR.dom.elementPath(k.startContainer),i=g.block,g=g.lastElement.getAscendant("li",1)||i,h=new CKEDITOR.dom.elementPath(e.startContainer),c=h.contains(CKEDITOR.dtd.$listItem),h=h.contains(CKEDITOR.dtd.$list);i?(i=i.getBogus())&&i.remove():h&&(i=h.getPrevious(q))&&v(i)&&i.remove();(i=d.getLast())&&(i.type==
+CKEDITOR.NODE_ELEMENT&&i.is("br"))&&i.remove();(i=k.startContainer.getChild(k.startOffset))?d.insertBefore(i):k.startContainer.append(d);if(c&&(d=w(c)))g.contains(c)?(A(d,c.getParent(),c),d.remove()):g.append(d);for(;e.checkStartOfBlock()&&e.checkEndOfBlock();){h=e.startPath();d=h.block;if(!d)break;d.is("li")&&(g=d.getParent(),d.equals(g.getLast(q))&&d.equals(g.getFirst(q))&&(d=g));e.moveToPosition(d,CKEDITOR.POSITION_BEFORE_START);d.remove()}e=e.clone();d=b.editable();e.setEndAt(d,CKEDITOR.POSITION_BEFORE_END);
+e=new CKEDITOR.dom.walker(e);e.evaluator=function(a){return q(a)&&!v(a)};(e=e.next())&&(e.type==CKEDITOR.NODE_ELEMENT&&e.getName()in CKEDITOR.dtd.$list)&&B(e);k.moveToBookmark(f);k.select();b.fire("saveSnapshot")}function w(b){return(b=b.getLast(q))&&b.type==CKEDITOR.NODE_ELEMENT&&b.getName()in r?b:null}var r={ol:1,ul:1},G=CKEDITOR.dom.walker.whitespaces(),D=CKEDITOR.dom.walker.bookmark(),q=function(b){return!(G(b)||D(b))},v=CKEDITOR.dom.walker.bogus();CKEDITOR.plugins.list={listToArray:function(b,
+k,e,d,f){if(!r[b.getName()])return[];d||(d=0);e||(e=[]);for(var g=0,i=b.getChildCount();g<i;g++){var h=b.getChild(g);h.type==CKEDITOR.NODE_ELEMENT&&h.getName()in CKEDITOR.dtd.$list&&CKEDITOR.plugins.list.listToArray(h,k,e,d+1);if("li"==h.$.nodeName.toLowerCase()){var c={parent:b,indent:d,element:h,contents:[]};f?c.grandparent=f:(c.grandparent=b.getParent(),c.grandparent&&"li"==c.grandparent.$.nodeName.toLowerCase()&&(c.grandparent=c.grandparent.getParent()));k&&CKEDITOR.dom.element.setMarker(k,h,
+"listarray_index",e.length);e.push(c);for(var a=0,m=h.getChildCount(),j;a<m;a++)j=h.getChild(a),j.type==CKEDITOR.NODE_ELEMENT&&r[j.getName()]?CKEDITOR.plugins.list.listToArray(j,k,e,d+1,c.grandparent):c.contents.push(j)}}return e},arrayToList:function(b,k,e,d,f){e||(e=0);if(!b||b.length<e+1)return null;for(var g,i=b[e].parent.getDocument(),h=new CKEDITOR.dom.documentFragment(i),c=null,a=e,m=Math.max(b[e].indent,0),j=null,n,l,p=d==CKEDITOR.ENTER_P?"p":"div";;){var o=b[a];g=o.grandparent;n=o.element.getDirection(1);
+if(o.indent==m){if(!c||b[a].parent.getName()!=c.getName())c=b[a].parent.clone(!1,1),f&&c.setAttribute("dir",f),h.append(c);j=c.append(o.element.clone(0,1));n!=c.getDirection(1)&&j.setAttribute("dir",n);for(g=0;g<o.contents.length;g++)j.append(o.contents[g].clone(1,1));a++}else if(o.indent==Math.max(m,0)+1)o=b[a-1].element.getDirection(1),a=CKEDITOR.plugins.list.arrayToList(b,null,a,d,o!=n?n:null),!j.getChildCount()&&(CKEDITOR.env.needsNbspFiller&&7>=i.$.documentMode)&&j.append(i.createText(" ")),
+j.append(a.listNode),a=a.nextIndex;else if(-1==o.indent&&!e&&g){r[g.getName()]?(j=o.element.clone(!1,!0),n!=g.getDirection(1)&&j.setAttribute("dir",n)):j=new CKEDITOR.dom.documentFragment(i);var c=g.getDirection(1)!=n,u=o.element,z=u.getAttribute("class"),v=u.getAttribute("style"),w=j.type==CKEDITOR.NODE_DOCUMENT_FRAGMENT&&(d!=CKEDITOR.ENTER_BR||c||v||z),s,x=o.contents.length,t;for(g=0;g<x;g++)if(s=o.contents[g],D(s)&&1<x)w?t=s.clone(1,1):j.append(s.clone(1,1));else if(s.type==CKEDITOR.NODE_ELEMENT&&
+s.isBlockBoundary()){c&&!s.getDirection()&&s.setAttribute("dir",n);l=s;var y=u.getAttribute("style");y&&l.setAttribute("style",y.replace(/([^;])$/,"$1;")+(l.getAttribute("style")||""));z&&s.addClass(z);l=null;t&&(j.append(t),t=null);j.append(s.clone(1,1))}else w?(l||(l=i.createElement(p),j.append(l),c&&l.setAttribute("dir",n)),v&&l.setAttribute("style",v),z&&l.setAttribute("class",z),t&&(l.append(t),t=null),l.append(s.clone(1,1))):j.append(s.clone(1,1));t&&((l||j).append(t),t=null);j.type==CKEDITOR.NODE_DOCUMENT_FRAGMENT&&
+a!=b.length-1&&(CKEDITOR.env.needsBrFiller&&(n=j.getLast())&&(n.type==CKEDITOR.NODE_ELEMENT&&n.is("br"))&&n.remove(),n=j.getLast(q),(!n||!(n.type==CKEDITOR.NODE_ELEMENT&&n.is(CKEDITOR.dtd.$block)))&&j.append(i.createElement("br")));n=j.$.nodeName.toLowerCase();("div"==n||"p"==n)&&j.appendBogus();h.append(j);c=null;a++}else return null;l=null;if(b.length<=a||Math.max(b[a].indent,0)<m)break}if(k)for(b=h.getFirst();b;){if(b.type==CKEDITOR.NODE_ELEMENT&&(CKEDITOR.dom.element.clearMarkers(k,b),b.getName()in
+CKEDITOR.dtd.$listItem&&(e=b,i=f=d=void 0,d=e.getDirection()))){for(f=e.getParent();f&&!(i=f.getDirection());)f=f.getParent();d==i&&e.removeAttribute("dir")}b=b.getNextSourceNode()}return{listNode:h,nextIndex:a}}};var H=/^h[1-6]$/,F=CKEDITOR.dom.walker.nodeType(CKEDITOR.NODE_ELEMENT);x.prototype={exec:function(b){this.refresh(b,b.elementPath());var k=b.config,e=b.getSelection(),d=e&&e.getRanges();if(this.state==CKEDITOR.TRISTATE_OFF){var f=b.editable();if(f.getFirst(q)){var g=1==d.length&&d[0];(k=
+g&&g.getEnclosedNode())&&(k.is&&this.type==k.getName())&&this.setState(CKEDITOR.TRISTATE_ON)}else k.enterMode==CKEDITOR.ENTER_BR?f.appendBogus():d[0].fixBlock(1,k.enterMode==CKEDITOR.ENTER_P?"p":"div"),e.selectRanges(d)}for(var k=e.createBookmarks(!0),f=[],i={},d=d.createIterator(),h=0;(g=d.getNextRange())&&++h;){var c=g.getBoundaryNodes(),a=c.startNode,m=c.endNode;a.type==CKEDITOR.NODE_ELEMENT&&"td"==a.getName()&&g.setStartAt(c.startNode,CKEDITOR.POSITION_AFTER_START);m.type==CKEDITOR.NODE_ELEMENT&&
+"td"==m.getName()&&g.setEndAt(c.endNode,CKEDITOR.POSITION_BEFORE_END);g=g.createIterator();for(g.forceBrBreak=this.state==CKEDITOR.TRISTATE_OFF;c=g.getNextParagraph();)if(!c.getCustomData("list_block")){CKEDITOR.dom.element.setMarker(i,c,"list_block",1);for(var j=b.elementPath(c),a=j.elements,m=0,j=j.blockLimit,n,l=a.length-1;0<=l&&(n=a[l]);l--)if(r[n.getName()]&&j.contains(n)){j.removeCustomData("list_group_object_"+h);(a=n.getCustomData("list_group_object"))?a.contents.push(c):(a={root:n,contents:[c]},
+f.push(a),CKEDITOR.dom.element.setMarker(i,n,"list_group_object",a));m=1;break}m||(m=j,m.getCustomData("list_group_object_"+h)?m.getCustomData("list_group_object_"+h).contents.push(c):(a={root:m,contents:[c]},CKEDITOR.dom.element.setMarker(i,m,"list_group_object_"+h,a),f.push(a)))}}for(n=[];0<f.length;)if(a=f.shift(),this.state==CKEDITOR.TRISTATE_OFF)if(r[a.root.getName()]){d=b;h=a;a=i;g=n;m=CKEDITOR.plugins.list.listToArray(h.root,a);j=[];for(c=0;c<h.contents.length;c++)if(l=h.contents[c],(l=l.getAscendant("li",
+!0))&&!l.getCustomData("list_item_processed"))j.push(l),CKEDITOR.dom.element.setMarker(a,l,"list_item_processed",!0);for(var l=h.root.getDocument(),p=void 0,o=void 0,c=0;c<j.length;c++){var u=j[c].getCustomData("listarray_index"),p=m[u].parent;p.is(this.type)||(o=l.createElement(this.type),p.copyAttributes(o,{start:1,type:1}),o.removeStyle("list-style-type"),m[u].parent=o)}a=CKEDITOR.plugins.list.arrayToList(m,a,null,d.config.enterMode);m=void 0;j=a.listNode.getChildCount();for(c=0;c<j&&(m=a.listNode.getChild(c));c++)m.getName()==
+this.type&&g.push(m);a.listNode.replace(h.root);d.fire("contentDomInvalidated")}else{m=b;c=a;g=n;j=c.contents;d=c.root.getDocument();h=[];1==j.length&&j[0].equals(c.root)&&(a=d.createElement("div"),j[0].moveChildren&&j[0].moveChildren(a),j[0].append(a),j[0]=a);c=c.contents[0].getParent();for(l=0;l<j.length;l++)c=c.getCommonAncestor(j[l].getParent());p=m.config.useComputedState;m=a=void 0;p=void 0===p||p;for(l=0;l<j.length;l++)for(o=j[l];u=o.getParent();){if(u.equals(c)){h.push(o);!m&&o.getDirection()&&
+(m=1);o=o.getDirection(p);null!==a&&(a=a&&a!=o?null:o);break}o=u}if(!(1>h.length)){j=h[h.length-1].getNext();l=d.createElement(this.type);g.push(l);for(p=g=void 0;h.length;)g=h.shift(),p=d.createElement("li"),g.is("pre")||H.test(g.getName())||"false"==g.getAttribute("contenteditable")?g.appendTo(p):(g.copyAttributes(p),a&&g.getDirection()&&(p.removeStyle("direction"),p.removeAttribute("dir")),g.moveChildren(p),g.remove()),p.appendTo(l);a&&m&&l.setAttribute("dir",a);j?l.insertBefore(j):l.appendTo(c)}}else this.state==
+CKEDITOR.TRISTATE_ON&&r[a.root.getName()]&&E.call(this,b,a,i);for(l=0;l<n.length;l++)B(n[l]);CKEDITOR.dom.element.clearAllMarkers(i);e.selectBookmarks(k);b.focus()},refresh:function(b,k){var e=k.contains(r,1),d=k.blockLimit||k.root;e&&d.contains(e)?this.setState(e.is(this.type)?CKEDITOR.TRISTATE_ON:CKEDITOR.TRISTATE_OFF):this.setState(CKEDITOR.TRISTATE_OFF)}};CKEDITOR.plugins.add("list",{requires:"indentlist",init:function(b){b.blockless||(b.addCommand("numberedlist",new x("numberedlist","ol")),b.addCommand("bulletedlist",
+new x("bulletedlist","ul")),b.ui.addButton&&(b.ui.addButton("NumberedList",{label:b.lang.list.numberedlist,command:"numberedlist",directional:!0,toolbar:"list,10"}),b.ui.addButton("BulletedList",{label:b.lang.list.bulletedlist,command:"bulletedlist",directional:!0,toolbar:"list,20"})),b.on("key",function(k){var e=k.data.domEvent.getKey(),d;if(b.mode=="wysiwyg"&&e in{8:1,46:1}){var f=b.getSelection().getRanges()[0],g=f&&f.startPath();if(f&&f.collapsed){var i=e==8,h=b.editable(),c=new CKEDITOR.dom.walker(f.clone());
+c.evaluator=function(a){return q(a)&&!v(a)};c.guard=function(a,b){return!(b&&a.type==CKEDITOR.NODE_ELEMENT&&a.is("table"))};e=f.clone();if(i){var a;if((a=g.contains(r))&&f.checkBoundaryOfElement(a,CKEDITOR.START)&&(a=a.getParent())&&a.is("li")&&(a=w(a))){d=a;a=a.getPrevious(q);e.moveToPosition(a&&v(a)?a:d,CKEDITOR.POSITION_BEFORE_START)}else{c.range.setStartAt(h,CKEDITOR.POSITION_AFTER_START);c.range.setEnd(f.startContainer,f.startOffset);if((a=c.previous())&&a.type==CKEDITOR.NODE_ELEMENT&&(a.getName()in
+r||a.is("li"))){if(!a.is("li")){c.range.selectNodeContents(a);c.reset();c.evaluator=C;a=c.previous()}d=a;e.moveToElementEditEnd(d)}}if(d){y(b,e,f);k.cancel()}else if((e=g.contains(r))&&f.checkBoundaryOfElement(e,CKEDITOR.START)){d=e.getFirst(q);if(f.checkBoundaryOfElement(d,CKEDITOR.START)){a=e.getPrevious(q);if(w(d)){if(a){f.moveToElementEditEnd(a);f.select()}}else b.execCommand("outdent");k.cancel()}}}else if(d=g.contains("li")){c.range.setEndAt(h,CKEDITOR.POSITION_BEFORE_END);d=(g=d.getLast(q))&&
+C(g)?g:d;h=0;if((a=c.next())&&a.type==CKEDITOR.NODE_ELEMENT&&a.getName()in r&&a.equals(g)){h=1;a=c.next()}else f.checkBoundaryOfElement(d,CKEDITOR.END)&&(h=1);if(h&&a){f=f.clone();f.moveToElementEditStart(a);y(b,e,f);k.cancel()}}else{c.range.setEndAt(h,CKEDITOR.POSITION_BEFORE_END);if((a=c.next())&&a.type==CKEDITOR.NODE_ELEMENT&&a.is(r)){a=a.getFirst(q);if(g.block&&f.checkStartOfBlock()&&f.checkEndOfBlock()){g.block.remove();f.moveToElementEditStart(a);f.select()}else if(w(a)){f.moveToElementEditStart(a);
+f.select()}else{f=f.clone();f.moveToElementEditStart(a);y(b,e,f)}k.cancel()}}setTimeout(function(){b.selectionChange(1)})}}}))}})})();(function(){function Q(a,c,d){return m(c)&&m(d)&&d.equals(c.getNext(function(a){return!(z(a)||A(a)||p(a))}))}function u(a){this.upper=a[0];this.lower=a[1];this.set.apply(this,a.slice(2))}function J(a){var c=a.element;if(c&&m(c)&&(c=c.getAscendant(a.triggers,!0))&&a.editable.contains(c)){var d=K(c);if("true"==d.getAttribute("contenteditable"))return c;if(d.is(a.triggers))return d}return null}function ga(a,c,d){o(a,c);o(a,d);a=c.size.bottom;d=d.size.top;return a&&d?0|(a+d)/2:a||d}function r(a,c,d){return c=
+c[d?"getPrevious":"getNext"](function(b){return b&&b.type==CKEDITOR.NODE_TEXT&&!z(b)||m(b)&&!p(b)&&!v(a,b)})}function K(a,c){if(a.data("cke-editable"))return null;for(c||(a=a.getParent());a&&!a.data("cke-editable");){if(a.hasAttribute("contenteditable"))return a;a=a.getParent()}return null}function ha(a){var c=a.doc,d=B('<span contenteditable="false" style="'+L+"position:absolute;border-top:1px dashed "+a.boxColor+'"></span>',c),b=CKEDITOR.getUrl(this.path+"images/"+(n.hidpi?"hidpi/":"")+"icon"+(a.rtl?
+"-rtl":"")+".png");q(d,{attach:function(){this.wrap.getParent()||this.wrap.appendTo(a.editable,!0);return this},lineChildren:[q(B('<span title="'+a.editor.lang.magicline.title+'" contenteditable="false">&#8629;</span>',c),{base:L+"height:17px;width:17px;"+(a.rtl?"left":"right")+":17px;background:url("+b+") center no-repeat "+a.boxColor+";cursor:pointer;"+(n.hc?"font-size: 15px;line-height:14px;border:1px solid #fff;text-align:center;":"")+(n.hidpi?"background-size: 9px 10px;":""),looks:["top:-8px;"+
+CKEDITOR.tools.cssVendorPrefix("border-radius","2px",1),"top:-17px;"+CKEDITOR.tools.cssVendorPrefix("border-radius","2px 2px 0px 0px",1),"top:-1px;"+CKEDITOR.tools.cssVendorPrefix("border-radius","0px 0px 2px 2px",1)]}),q(B(R,c),{base:S+"left:0px;border-left-color:"+a.boxColor+";",looks:["border-width:8px 0 8px 8px;top:-8px","border-width:8px 0 0 8px;top:-8px","border-width:0 0 8px 8px;top:0px"]}),q(B(R,c),{base:S+"right:0px;border-right-color:"+a.boxColor+";",looks:["border-width:8px 8px 8px 0;top:-8px",
+"border-width:8px 8px 0 0;top:-8px","border-width:0 8px 8px 0;top:0px"]})],detach:function(){this.wrap.getParent()&&this.wrap.remove();return this},mouseNear:function(){o(a,this);var b=a.holdDistance,c=this.size;return c&&a.mouse.y>c.top-b&&a.mouse.y<c.bottom+b&&a.mouse.x>c.left-b&&a.mouse.x<c.right+b?!0:!1},place:function(){var b=a.view,c=a.editable,d=a.trigger,i=d.upper,h=d.lower,j=i||h,l=j.getParent(),k={};this.trigger=d;i&&o(a,i,!0);h&&o(a,h,!0);o(a,l,!0);a.inInlineMode&&C(a,!0);l.equals(c)?(k.left=
+b.scroll.x,k.right=-b.scroll.x,k.width=""):(k.left=j.size.left-j.size.margin.left+b.scroll.x-(a.inInlineMode?b.editable.left+b.editable.border.left:0),k.width=j.size.outerWidth+j.size.margin.left+j.size.margin.right+b.scroll.x,k.right="");i&&h?k.top=i.size.margin.bottom===h.size.margin.top?0|i.size.bottom+i.size.margin.bottom/2:i.size.margin.bottom<h.size.margin.top?i.size.bottom+i.size.margin.bottom:i.size.bottom+i.size.margin.bottom-h.size.margin.top:i?h||(k.top=i.size.bottom+i.size.margin.bottom):
+k.top=h.size.top-h.size.margin.top;d.is(x)||k.top>b.scroll.y-15&&k.top<b.scroll.y+5?(k.top=a.inInlineMode?0:b.scroll.y,this.look(x)):d.is(y)||k.top>b.pane.bottom-5&&k.top<b.pane.bottom+15?(k.top=a.inInlineMode?b.editable.height+b.editable.padding.top+b.editable.padding.bottom:b.pane.bottom-1,this.look(y)):(a.inInlineMode&&(k.top-=b.editable.top+b.editable.border.top),this.look(s));a.inInlineMode&&(k.top--,k.top+=b.editable.scroll.top,k.left+=b.editable.scroll.left);for(var T in k)k[T]=CKEDITOR.tools.cssLength(k[T]);
+this.setStyles(k)},look:function(a){if(this.oldLook!=a){for(var b=this.lineChildren.length,c;b--;)(c=this.lineChildren[b]).setAttribute("style",c.base+c.looks[0|a/2]);this.oldLook=a}},wrap:new M("span",a.doc)});for(c=d.lineChildren.length;c--;)d.lineChildren[c].appendTo(d);d.look(s);d.appendTo(d.wrap);d.unselectable();d.lineChildren[0].on("mouseup",function(b){d.detach();N(a,function(b){var c=a.line.trigger;b[c.is(D)?"insertBefore":"insertAfter"](c.is(D)?c.lower:c.upper)},!0);a.editor.focus();!n.ie&&
+a.enterMode!=CKEDITOR.ENTER_BR&&a.hotNode.scrollIntoView();b.data.preventDefault(!0)});d.on("mousedown",function(a){a.data.preventDefault(!0)});a.line=d}function N(a,c,d){var b=new CKEDITOR.dom.range(a.doc),e=a.editor,f;n.ie&&a.enterMode==CKEDITOR.ENTER_BR?f=a.doc.createText(E):(f=(f=K(a.element,!0))&&f.data("cke-enter-mode")||a.enterMode,f=new M(F[f],a.doc),f.is("br")||a.doc.createText(E).appendTo(f));d&&e.fire("saveSnapshot");c(f);b.moveToPosition(f,CKEDITOR.POSITION_AFTER_START);e.getSelection().selectRanges([b]);
+a.hotNode=f;d&&e.fire("saveSnapshot")}function U(a,c){return{canUndo:!0,modes:{wysiwyg:1},exec:function(){function d(b){var d=n.ie&&9>n.version?" ":E,f=a.hotNode&&a.hotNode.getText()==d&&a.element.equals(a.hotNode)&&a.lastCmdDirection===!!c;N(a,function(d){f&&a.hotNode&&a.hotNode.remove();d[c?"insertAfter":"insertBefore"](b);d.setAttributes({"data-cke-magicline-hot":1,"data-cke-magicline-dir":!!c});a.lastCmdDirection=!!c});!n.ie&&a.enterMode!=CKEDITOR.ENTER_BR&&a.hotNode.scrollIntoView();a.line.detach()}
+return function(b){var b=b.getSelection().getStartElement(),e,b=b.getAscendant(V,1);if(!W(a,b)&&b&&!b.equals(a.editable)&&!b.contains(a.editable)){if((e=K(b))&&"false"==e.getAttribute("contenteditable"))b=e;a.element=b;e=r(a,b,!c);var f;m(e)&&e.is(a.triggers)&&e.is(ia)&&(!r(a,e,!c)||(f=r(a,e,!c))&&m(f)&&f.is(a.triggers))?d(e):(f=J(a,b),m(f)&&(r(a,f,!c)?(b=r(a,f,!c))&&(m(b)&&b.is(a.triggers))&&d(f):d(f)))}}}()}}function v(a,c){if(!c||!(c.type==CKEDITOR.NODE_ELEMENT&&c.$))return!1;var d=a.line;return d.wrap.equals(c)||
+d.wrap.contains(c)}function m(a){return a&&a.type==CKEDITOR.NODE_ELEMENT&&a.$}function p(a){if(!m(a))return!1;var c;if(!(c=X(a)))m(a)?(c={left:1,right:1,center:1},c=!(!c[a.getComputedStyle("float")]&&!c[a.getAttribute("align")])):c=!1;return c}function X(a){return!!{absolute:1,fixed:1}[a.getComputedStyle("position")]}function G(a,c){return m(c)?c.is(a.triggers):null}function W(a,c){if(!c)return!1;for(var d=c.getParents(1),b=d.length;b--;)for(var e=a.tabuList.length;e--;)if(d[b].hasAttribute(a.tabuList[e]))return!0;
+return!1}function ja(a,c,d){c=c[d?"getLast":"getFirst"](function(b){return a.isRelevant(b)&&!b.is(ka)});if(!c)return!1;o(a,c);return d?c.size.top>a.mouse.y:c.size.bottom<a.mouse.y}function Y(a){var c=a.editable,d=a.mouse,b=a.view,e=a.triggerOffset;C(a);var f=d.y>(a.inInlineMode?b.editable.top+b.editable.height/2:Math.min(b.editable.height,b.pane.height)/2),c=c[f?"getLast":"getFirst"](function(a){return!(z(a)||A(a))});if(!c)return null;v(a,c)&&(c=a.line.wrap[f?"getPrevious":"getNext"](function(a){return!(z(a)||
+A(a))}));if(!m(c)||p(c)||!G(a,c))return null;o(a,c);return!f&&0<=c.size.top&&0<d.y&&d.y<c.size.top+e?(a=a.inInlineMode||0===b.scroll.y?x:s,new u([null,c,D,H,a])):f&&c.size.bottom<=b.pane.height&&d.y>c.size.bottom-e&&d.y<b.pane.height?(a=a.inInlineMode||c.size.bottom>b.pane.height-e&&c.size.bottom<b.pane.height?y:s,new u([c,null,Z,H,a])):null}function $(a){var c=a.mouse,d=a.view,b=a.triggerOffset,e=J(a);if(!e)return null;o(a,e);var b=Math.min(b,0|e.size.outerHeight/2),f=[],g,i;if(c.y>e.size.top-1&&
+c.y<e.size.top+b)i=!1;else if(c.y>e.size.bottom-b&&c.y<e.size.bottom+1)i=!0;else return null;if(p(e)||ja(a,e,i)||e.getParent().is(aa))return null;var h=r(a,e,!i);if(h){if(h&&h.type==CKEDITOR.NODE_TEXT)return null;if(m(h)){if(p(h)||!G(a,h)||h.getParent().is(aa))return null;f=[h,e][i?"reverse":"concat"]().concat([O,H])}}else e.equals(a.editable[i?"getLast":"getFirst"](a.isRelevant))?(C(a),i&&c.y>e.size.bottom-b&&c.y<d.pane.height&&e.size.bottom>d.pane.height-b&&e.size.bottom<d.pane.height?g=y:0<c.y&&
+c.y<e.size.top+b&&(g=x)):g=s,f=[null,e][i?"reverse":"concat"]().concat([i?Z:D,H,g,e.equals(a.editable[i?"getLast":"getFirst"](a.isRelevant))?i?y:x:s]);return 0 in f?new u(f):null}function P(a,c,d,b){for(var e=function(){var b=n.ie?c.$.currentStyle:a.win.$.getComputedStyle(c.$,"");return n.ie?function(a){return b[CKEDITOR.tools.cssStyleToDomStyle(a)]}:function(a){return b.getPropertyValue(a)}}(),f=c.getDocumentPosition(),g={},i={},h={},j={},l=t.length;l--;)g[t[l]]=parseInt(e("border-"+t[l]+"-width"),
+10)||0,h[t[l]]=parseInt(e("padding-"+t[l]),10)||0,i[t[l]]=parseInt(e("margin-"+t[l]),10)||0;(!d||b)&&I(a,b);j.top=f.y-(d?0:a.view.scroll.y);j.left=f.x-(d?0:a.view.scroll.x);j.outerWidth=c.$.offsetWidth;j.outerHeight=c.$.offsetHeight;j.height=j.outerHeight-(h.top+h.bottom+g.top+g.bottom);j.width=j.outerWidth-(h.left+h.right+g.left+g.right);j.bottom=j.top+j.outerHeight;j.right=j.left+j.outerWidth;a.inInlineMode&&(j.scroll={top:c.$.scrollTop,left:c.$.scrollLeft});return q({border:g,padding:h,margin:i,
+ignoreScroll:d},j,!0)}function o(a,c,d){if(!m(c))return c.size=null;if(c.size){if(c.size.ignoreScroll==d&&c.size.date>new Date-ba)return null}else c.size={};return q(c.size,P(a,c,d),{date:+new Date},!0)}function C(a,c){a.view.editable=P(a,a.editable,c,!0)}function I(a,c){a.view||(a.view={});var d=a.view;if(c||!(d&&d.date>new Date-ba)){var b=a.win,d=b.getScrollPosition(),b=b.getViewPaneSize();q(a.view,{scroll:{x:d.x,y:d.y,width:a.doc.$.documentElement.scrollWidth-b.width,height:a.doc.$.documentElement.scrollHeight-
+b.height},pane:{width:b.width,height:b.height,bottom:b.height+d.y},date:+new Date},!0)}}function la(a,c,d,b){for(var e=b,f=b,g=0,i=!1,h=!1,j=a.view.pane.height,l=a.mouse;l.y+g<j&&0<l.y-g;){i||(i=c(e,b));h||(h=c(f,b));!i&&0<l.y-g&&(e=d(a,{x:l.x,y:l.y-g}));!h&&l.y+g<j&&(f=d(a,{x:l.x,y:l.y+g}));if(i&&h)break;g+=2}return new u([e,f,null,null])}CKEDITOR.plugins.add("magicline",{init:function(a){var c=a.config,d=c.magicline_triggerOffset||30,b={editor:a,enterMode:c.enterMode,triggerOffset:d,holdDistance:0|
+d*(c.magicline_holdDistance||0.5),boxColor:c.magicline_color||"#ff0000",rtl:"rtl"==c.contentsLangDirection,tabuList:["data-cke-hidden-sel"].concat(c.magicline_tabuList||[]),triggers:c.magicline_everywhere?V:{table:1,hr:1,div:1,ul:1,ol:1,dl:1,form:1,blockquote:1}},e,f,g;b.isRelevant=function(a){return m(a)&&!v(b,a)&&!p(a)};a.on("contentDom",function(){var d=a.editable(),h=a.document,j=a.window;q(b,{editable:d,inInlineMode:d.isInline(),doc:h,win:j,hotNode:null},!0);b.boundary=b.inInlineMode?b.editable:
+b.doc.getDocumentElement();d.is(w.$inline)||(b.inInlineMode&&!X(d)&&d.setStyles({position:"relative",top:null,left:null}),ha.call(this,b),I(b),d.attachListener(a,"beforeUndoImage",function(){b.line.detach()}),d.attachListener(a,"beforeGetData",function(){b.line.wrap.getParent()&&(b.line.detach(),a.once("getData",function(){b.line.attach()},null,null,1E3))},null,null,0),d.attachListener(b.inInlineMode?h:h.getWindow().getFrame(),"mouseout",function(c){if("wysiwyg"==a.mode)if(b.inInlineMode){var d=c.data.$.clientX,
+c=c.data.$.clientY;I(b);C(b,!0);var e=b.view.editable,f=b.view.scroll;if(!(d>e.left-f.x&&d<e.right-f.x)||!(c>e.top-f.y&&c<e.bottom-f.y))clearTimeout(g),g=null,b.line.detach()}else clearTimeout(g),g=null,b.line.detach()}),d.attachListener(d,"keyup",function(){b.hiddenMode=0}),d.attachListener(d,"keydown",function(c){if("wysiwyg"==a.mode)switch(c.data.getKeystroke()){case 2228240:case 16:b.hiddenMode=1,b.line.detach()}}),d.attachListener(b.inInlineMode?d:h,"mousemove",function(c){f=!0;if(!("wysiwyg"!=
+a.mode||a.readOnly||g)){var d={x:c.data.$.clientX,y:c.data.$.clientY};g=setTimeout(function(){b.mouse=d;g=b.trigger=null;I(b);if(f&&!b.hiddenMode&&a.focusManager.hasFocus&&!b.line.mouseNear()&&(b.element=ca(b,!0)))(b.trigger=Y(b)||$(b)||da(b))&&!W(b,b.trigger.upper||b.trigger.lower)?b.line.attach().place():(b.trigger=null,b.line.detach()),f=!1},30)}}),d.attachListener(j,"scroll",function(){"wysiwyg"==a.mode&&(b.line.detach(),n.webkit&&(b.hiddenMode=1,clearTimeout(e),e=setTimeout(function(){b.mouseDown||
+(b.hiddenMode=0)},50)))}),d.attachListener(ea?h:j,"mousedown",function(){"wysiwyg"==a.mode&&(b.line.detach(),b.hiddenMode=1,b.mouseDown=1)}),d.attachListener(ea?h:j,"mouseup",function(){b.hiddenMode=0;b.mouseDown=0}),a.addCommand("accessPreviousSpace",U(b)),a.addCommand("accessNextSpace",U(b,!0)),a.setKeystroke([[c.magicline_keystrokePrevious,"accessPreviousSpace"],[c.magicline_keystrokeNext,"accessNextSpace"]]),a.on("loadSnapshot",function(){var c,d,e,f;for(f in{p:1,br:1,div:1}){c=a.document.getElementsByTag(f);
+for(e=c.count();e--;)if((d=c.getItem(e)).data("cke-magicline-hot")){b.hotNode=d;b.lastCmdDirection="true"===d.data("cke-magicline-dir")?!0:!1;return}}}),this.backdoor={accessFocusSpace:N,boxTrigger:u,isLine:v,getAscendantTrigger:J,getNonEmptyNeighbour:r,getSize:P,that:b,triggerEdge:$,triggerEditable:Y,triggerExpand:da})},this)}});var q=CKEDITOR.tools.extend,M=CKEDITOR.dom.element,B=M.createFromHtml,n=CKEDITOR.env,ea=CKEDITOR.env.ie&&9>CKEDITOR.env.version,w=CKEDITOR.dtd,F={},D=128,Z=64,O=32,H=16,
+fa=8,x=4,y=2,s=1,E=" ",aa=w.$listItem,ka=w.$tableContent,ia=q({},w.$nonEditable,w.$empty),V=w.$block,ba=100,L="width:0px;height:0px;padding:0px;margin:0px;display:block;z-index:9999;color:#fff;position:absolute;font-size: 0px;line-height:0px;",S=L+"border-color:transparent;display:block;border-style:solid;",R="<span>"+E+"</span>";F[CKEDITOR.ENTER_BR]="br";F[CKEDITOR.ENTER_P]="p";F[CKEDITOR.ENTER_DIV]="div";u.prototype={set:function(a,c,d){this.properties=a+c+(d||s);return this},is:function(a){return(this.properties&
+a)==a}};var ca=function(){function a(a,d){var b=a.$.elementFromPoint(d.x,d.y);return b&&b.nodeType?new CKEDITOR.dom.element(b):null}return function(c,d,b){if(!c.mouse)return null;var e=c.doc,f=c.line.wrap,b=b||c.mouse,g=a(e,b);d&&v(c,g)&&(f.hide(),g=a(e,b),f.show());return!g||!(g.type==CKEDITOR.NODE_ELEMENT&&g.$)||n.ie&&9>n.version&&!c.boundary.equals(g)&&!c.boundary.contains(g)?null:g}}(),z=CKEDITOR.dom.walker.whitespaces(),A=CKEDITOR.dom.walker.nodeType(CKEDITOR.NODE_COMMENT),da=function(){function a(a){var b=
+a.element,e,f,g;if(!m(b)||b.contains(a.editable)||b.isReadOnly())return null;g=la(a,function(a,b){return!b.equals(a)},function(a,b){return ca(a,!0,b)},b);e=g.upper;f=g.lower;if(Q(a,e,f))return g.set(O,fa);if(e&&b.contains(e))for(;!e.getParent().equals(b);)e=e.getParent();else e=b.getFirst(function(b){return c(a,b)});if(f&&b.contains(f))for(;!f.getParent().equals(b);)f=f.getParent();else f=b.getLast(function(b){return c(a,b)});if(!e||!f)return null;o(a,e);o(a,f);if(!(a.mouse.y>e.size.top&&a.mouse.y<
+f.size.bottom))return null;for(var b=Number.MAX_VALUE,i,h,j,l;f&&!f.equals(e)&&(h=e.getNext(a.isRelevant));)i=Math.abs(ga(a,e,h)-a.mouse.y),i<b&&(b=i,j=e,l=h),e=h,o(a,e);if(!j||!l||!(a.mouse.y>j.size.top&&a.mouse.y<l.size.bottom))return null;g.upper=j;g.lower=l;return g.set(O,fa)}function c(a,b){return!(b&&b.type==CKEDITOR.NODE_TEXT||A(b)||p(b)||v(a,b)||b.type==CKEDITOR.NODE_ELEMENT&&b.$&&b.is("br"))}return function(c){var b=a(c),e;if(e=b){e=b.upper;var f=b.lower;e=!e||!f||p(f)||p(e)||f.equals(e)||
+e.equals(f)||f.contains(e)||e.contains(f)?!1:G(c,e)&&G(c,f)&&Q(c,e,f)?!0:!1}return e?b:null}}(),t=["top","left","right","bottom"]})();CKEDITOR.config.magicline_keystrokePrevious=CKEDITOR.CTRL+CKEDITOR.SHIFT+51;CKEDITOR.config.magicline_keystrokeNext=CKEDITOR.CTRL+CKEDITOR.SHIFT+52;(function(){function l(a){if(!a||a.type!=CKEDITOR.NODE_ELEMENT||"form"!=a.getName())return[];for(var e=[],f=["style","className"],b=0;b<f.length;b++){var d=a.$.elements.namedItem(f[b]);d&&(d=new CKEDITOR.dom.element(d),e.push([d,d.nextSibling]),d.remove())}return e}function o(a,e){if(a&&!(a.type!=CKEDITOR.NODE_ELEMENT||"form"!=a.getName())&&0<e.length)for(var f=e.length-1;0<=f;f--){var b=e[f][0],d=e[f][1];d?b.insertBefore(d):b.appendTo(a)}}function n(a,e){var f=l(a),b={},d=a.$;e||(b["class"]=d.className||
+"",d.className="");b.inline=d.style.cssText||"";e||(d.style.cssText="position: static; overflow: visible");o(f);return b}function p(a,e){var f=l(a),b=a.$;"class"in e&&(b.className=e["class"]);"inline"in e&&(b.style.cssText=e.inline);o(f)}function q(a){if(!a.editable().isInline()){var e=CKEDITOR.instances,f;for(f in e){var b=e[f];"wysiwyg"==b.mode&&!b.readOnly&&(b=b.document.getBody(),b.setAttribute("contentEditable",!1),b.setAttribute("contentEditable",!0))}a.editable().hasFocus&&(a.toolbox.focus(),
+a.focus())}}CKEDITOR.plugins.add("maximize",{init:function(a){function e(){var b=d.getViewPaneSize();a.resize(b.width,b.height,null,!0)}if(a.elementMode!=CKEDITOR.ELEMENT_MODE_INLINE){var f=a.lang,b=CKEDITOR.document,d=b.getWindow(),j,k,m,l=CKEDITOR.TRISTATE_OFF;a.addCommand("maximize",{modes:{wysiwyg:!CKEDITOR.env.iOS,source:!CKEDITOR.env.iOS},readOnly:1,editorFocus:!1,exec:function(){var h=a.container.getFirst(function(a){return a.type==CKEDITOR.NODE_ELEMENT&&a.hasClass("cke_inner")}),g=a.ui.space("contents");
+if("wysiwyg"==a.mode){var c=a.getSelection();j=c&&c.getRanges();k=d.getScrollPosition()}else{var i=a.editable().$;j=!CKEDITOR.env.ie&&[i.selectionStart,i.selectionEnd];k=[i.scrollLeft,i.scrollTop]}if(this.state==CKEDITOR.TRISTATE_OFF){d.on("resize",e);m=d.getScrollPosition();for(c=a.container;c=c.getParent();)c.setCustomData("maximize_saved_styles",n(c)),c.setStyle("z-index",a.config.baseFloatZIndex-5);g.setCustomData("maximize_saved_styles",n(g,!0));h.setCustomData("maximize_saved_styles",n(h,!0));
+g={overflow:CKEDITOR.env.webkit?"":"hidden",width:0,height:0};b.getDocumentElement().setStyles(g);!CKEDITOR.env.gecko&&b.getDocumentElement().setStyle("position","fixed");(!CKEDITOR.env.gecko||!CKEDITOR.env.quirks)&&b.getBody().setStyles(g);CKEDITOR.env.ie?setTimeout(function(){d.$.scrollTo(0,0)},0):d.$.scrollTo(0,0);h.setStyle("position",CKEDITOR.env.gecko&&CKEDITOR.env.quirks?"fixed":"absolute");h.$.offsetLeft;h.setStyles({"z-index":a.config.baseFloatZIndex-5,left:"0px",top:"0px"});h.addClass("cke_maximized");
+e();g=h.getDocumentPosition();h.setStyles({left:-1*g.x+"px",top:-1*g.y+"px"});CKEDITOR.env.gecko&&q(a)}else if(this.state==CKEDITOR.TRISTATE_ON){d.removeListener("resize",e);g=[g,h];for(c=0;c<g.length;c++)p(g[c],g[c].getCustomData("maximize_saved_styles")),g[c].removeCustomData("maximize_saved_styles");for(c=a.container;c=c.getParent();)p(c,c.getCustomData("maximize_saved_styles")),c.removeCustomData("maximize_saved_styles");CKEDITOR.env.ie?setTimeout(function(){d.$.scrollTo(m.x,m.y)},0):d.$.scrollTo(m.x,
+m.y);h.removeClass("cke_maximized");CKEDITOR.env.webkit&&(h.setStyle("display","inline"),setTimeout(function(){h.setStyle("display","block")},0));a.fire("resize")}this.toggleState();if(c=this.uiItems[0])g=this.state==CKEDITOR.TRISTATE_OFF?f.maximize.maximize:f.maximize.minimize,c=CKEDITOR.document.getById(c._.id),c.getChild(1).setHtml(g),c.setAttribute("title",g),c.setAttribute("href",'javascript:void("'+g+'");');"wysiwyg"==a.mode?j?(CKEDITOR.env.gecko&&q(a),a.getSelection().selectRanges(j),(i=a.getSelection().getStartElement())&&
+i.scrollIntoView(!0)):d.$.scrollTo(k.x,k.y):(j&&(i.selectionStart=j[0],i.selectionEnd=j[1]),i.scrollLeft=k[0],i.scrollTop=k[1]);j=k=null;l=this.state;a.fire("maximize",this.state)},canUndo:!1});a.ui.addButton&&a.ui.addButton("Maximize",{label:f.maximize.maximize,command:"maximize",toolbar:"tools,10"});a.on("mode",function(){var b=a.getCommand("maximize");b.setState(b.state==CKEDITOR.TRISTATE_DISABLED?CKEDITOR.TRISTATE_DISABLED:l)},null,null,100)}}})})();(function(){var c={canUndo:!1,async:!0,exec:function(a){a.getClipboardData({title:a.lang.pastetext.title},function(b){b&&a.fire("paste",{type:"text",dataValue:b.dataValue});a.fire("afterCommandExec",{name:"pastetext",command:c,returnValue:!!b})})}};CKEDITOR.plugins.add("pastetext",{requires:"clipboard",init:function(a){a.addCommand("pastetext",c);a.ui.addButton&&a.ui.addButton("PasteText",{label:a.lang.pastetext.button,command:"pastetext",toolbar:"clipboard,40"});if(a.config.forcePasteAsPlainText)a.on("beforePaste",
+function(a){"html"!=a.data.type&&(a.data.type="text")});a.on("pasteState",function(b){a.getCommand("pastetext").setState(b.data)})}})})();(function(){function h(a,d,f){var b=CKEDITOR.cleanWord;b?f():(a=CKEDITOR.getUrl(a.config.pasteFromWordCleanupFile||d+"filter/default.js"),CKEDITOR.scriptLoader.load(a,f,null,!0));return!b}function i(a){a.data.type="html"}CKEDITOR.plugins.add("pastefromword",{requires:"clipboard",init:function(a){var d=0,f=this.path;a.addCommand("pastefromword",{canUndo:!1,async:!0,exec:function(a){var e=this;d=1;a.once("beforePaste",i);a.getClipboardData({title:a.lang.pastefromword.title},function(c){c&&a.fire("paste",
+{type:"html",dataValue:c.dataValue});a.fire("afterCommandExec",{name:"pastefromword",command:e,returnValue:!!c})})}});a.ui.addButton&&a.ui.addButton("PasteFromWord",{label:a.lang.pastefromword.toolbar,command:"pastefromword",toolbar:"clipboard,50"});a.on("pasteState",function(b){a.getCommand("pastefromword").setState(b.data)});a.on("paste",function(b){var e=b.data,c=e.dataValue;if(c&&(d||/(class=\"?Mso|style=\"[^\"]*\bmso\-|w:WordDocument)/.test(c))){var g=h(a,f,function(){if(g)a.fire("paste",e);
+else if(!a.config.pasteFromWordPromptCleanup||d||confirm(a.lang.pastefromword.confirmCleanup))e.dataValue=CKEDITOR.cleanWord(c,a);d=0});g&&b.cancel()}},null,null,3)}})})();CKEDITOR.plugins.add("removeformat",{init:function(a){a.addCommand("removeFormat",CKEDITOR.plugins.removeformat.commands.removeformat);a.ui.addButton&&a.ui.addButton("RemoveFormat",{label:a.lang.removeformat.toolbar,command:"removeFormat",toolbar:"cleanup,10"})}});
+CKEDITOR.plugins.removeformat={commands:{removeformat:{exec:function(a){for(var h=a._.removeFormatRegex||(a._.removeFormatRegex=RegExp("^(?:"+a.config.removeFormatTags.replace(/,/g,"|")+")$","i")),e=a._.removeAttributes||(a._.removeAttributes=a.config.removeFormatAttributes.split(",")),f=CKEDITOR.plugins.removeformat.filter,k=a.getSelection().getRanges(),l=k.createIterator(),m=function(a){return a.type==CKEDITOR.NODE_ELEMENT},c;c=l.getNextRange();){c.collapsed||c.enlarge(CKEDITOR.ENLARGE_ELEMENT);
+var j=c.createBookmark(),b=j.startNode,d=j.endNode,i=function(b){for(var c=a.elementPath(b),e=c.elements,d=1,g;(g=e[d])&&!g.equals(c.block)&&!g.equals(c.blockLimit);d++)h.test(g.getName())&&f(a,g)&&b.breakParent(g)};i(b);if(d){i(d);for(b=b.getNextSourceNode(!0,CKEDITOR.NODE_ELEMENT);b&&!b.equals(d);)if(b.isReadOnly()){if(b.getPosition(d)&CKEDITOR.POSITION_CONTAINS)break;b=b.getNext(m)}else i=b.getNextSourceNode(!1,CKEDITOR.NODE_ELEMENT),!("img"==b.getName()&&b.data("cke-realelement"))&&f(a,b)&&(h.test(b.getName())?
+b.remove(1):(b.removeAttributes(e),a.fire("removeFormatCleanup",b))),b=i}c.moveToBookmark(j)}a.forceNextSelectionCheck();a.getSelection().selectRanges(k)}}},filter:function(a,h){for(var e=a._.removeFormatFilters||[],f=0;f<e.length;f++)if(!1===e[f](h))return!1;return!0}};CKEDITOR.editor.prototype.addRemoveFormatFilter=function(a){this._.removeFormatFilters||(this._.removeFormatFilters=[]);this._.removeFormatFilters.push(a)};CKEDITOR.config.removeFormatTags="b,big,cite,code,del,dfn,em,font,i,ins,kbd,q,s,samp,small,span,strike,strong,sub,sup,tt,u,var";
+CKEDITOR.config.removeFormatAttributes="class,style,lang,width,height,align,hspace,valign";(function(){var f={preserveState:!0,editorFocus:!1,readOnly:1,exec:function(a){this.toggleState();this.refresh(a)},refresh:function(a){if(a.document){var b=this.state==CKEDITOR.TRISTATE_ON?"attachClass":"removeClass";a.editable()[b]("cke_show_borders")}}};CKEDITOR.plugins.add("showborders",{modes:{wysiwyg:1},onLoad:function(){var a;a=(CKEDITOR.env.ie6Compat?[".%1 table.%2,",".%1 table.%2 td, .%1 table.%2 th","{","border : #d3d3d3 1px dotted","}"]:".%1 table.%2,;.%1 table.%2 > tr > td, .%1 table.%2 > tr > th,;.%1 table.%2 > tbody > tr > td, .%1 table.%2 > tbody > tr > th,;.%1 table.%2 > thead > tr > td, .%1 table.%2 > thead > tr > th,;.%1 table.%2 > tfoot > tr > td, .%1 table.%2 > tfoot > tr > th;{;border : #d3d3d3 1px dotted;}".split(";")).join("").replace(/%2/g,
+"cke_show_border").replace(/%1/g,"cke_show_borders ");CKEDITOR.addCss(a)},init:function(a){var b=a.addCommand("showborders",f);b.canUndo=!1;!1!==a.config.startupShowBorders&&b.setState(CKEDITOR.TRISTATE_ON);a.on("mode",function(){b.state!=CKEDITOR.TRISTATE_DISABLED&&b.refresh(a)},null,null,100);a.on("contentDom",function(){b.state!=CKEDITOR.TRISTATE_DISABLED&&b.refresh(a)});a.on("removeFormatCleanup",function(d){d=d.data;a.getCommand("showborders").state==CKEDITOR.TRISTATE_ON&&(d.is("table")&&(!d.hasAttribute("border")||
+0>=parseInt(d.getAttribute("border"),10)))&&d.addClass("cke_show_border")})},afterInit:function(a){var b=a.dataProcessor,a=b&&b.dataFilter,b=b&&b.htmlFilter;a&&a.addRules({elements:{table:function(a){var a=a.attributes,b=a["class"],c=parseInt(a.border,10);if((!c||0>=c)&&(!b||-1==b.indexOf("cke_show_border")))a["class"]=(b||"")+" cke_show_border"}}});b&&b.addRules({elements:{table:function(a){var a=a.attributes,b=a["class"];b&&(a["class"]=b.replace("cke_show_border","").replace(/\s{2}/," ").replace(/^\s+|\s+$/,
+""))}}})}});CKEDITOR.on("dialogDefinition",function(a){var b=a.data.name;if("table"==b||"tableProperties"==b)if(a=a.data.definition,b=a.getContents("info").get("txtBorder"),b.commit=CKEDITOR.tools.override(b.commit,function(a){return function(b,c){a.apply(this,arguments);var e=parseInt(this.getValue(),10);c[!e||0>=e?"addClass":"removeClass"]("cke_show_border")}}),a=(a=a.getContents("advanced"))&&a.get("advCSSClasses"))a.setup=CKEDITOR.tools.override(a.setup,function(a){return function(){a.apply(this,
+arguments);this.setValue(this.getValue().replace(/cke_show_border/,""))}}),a.commit=CKEDITOR.tools.override(a.commit,function(a){return function(b,c){a.apply(this,arguments);parseInt(c.getAttribute("border"),10)||c.addClass("cke_show_border")}})})})();(function(){CKEDITOR.plugins.add("sourcearea",{init:function(a){function d(){var a=e&&this.equals(CKEDITOR.document.getActive());this.hide();this.setStyle("height",this.getParent().$.clientHeight+"px");this.setStyle("width",this.getParent().$.clientWidth+"px");this.show();a&&this.focus()}if(a.elementMode!=CKEDITOR.ELEMENT_MODE_INLINE){var f=CKEDITOR.plugins.sourcearea;a.addMode("source",function(e){var b=a.ui.space("contents").getDocument().createElement("textarea");b.setStyles(CKEDITOR.tools.extend({width:CKEDITOR.env.ie7Compat?
+"99%":"100%",height:"100%",resize:"none",outline:"none","text-align":"left"},CKEDITOR.tools.cssVendorPrefix("tab-size",a.config.sourceAreaTabSize||4)));b.setAttribute("dir","ltr");b.addClass("cke_source cke_reset cke_enable_context_menu");a.ui.space("contents").append(b);b=a.editable(new c(a,b));b.setData(a.getData(1));CKEDITOR.env.ie&&(b.attachListener(a,"resize",d,b),b.attachListener(CKEDITOR.document.getWindow(),"resize",d,b),CKEDITOR.tools.setTimeout(d,0,b));a.fire("ariaWidget",this);e()});a.addCommand("source",
+f.commands.source);a.ui.addButton&&a.ui.addButton("Source",{label:a.lang.sourcearea.toolbar,command:"source",toolbar:"mode,10"});a.on("mode",function(){a.getCommand("source").setState("source"==a.mode?CKEDITOR.TRISTATE_ON:CKEDITOR.TRISTATE_OFF)});var e=CKEDITOR.env.ie&&9==CKEDITOR.env.version}}});var c=CKEDITOR.tools.createClass({base:CKEDITOR.editable,proto:{setData:function(a){this.setValue(a);this.status="ready";this.editor.fire("dataReady")},getData:function(){return this.getValue()},insertHtml:function(){},
+insertElement:function(){},insertText:function(){},setReadOnly:function(a){this[(a?"set":"remove")+"Attribute"]("readOnly","readonly")},detach:function(){c.baseProto.detach.call(this);this.clearCustomData();this.remove()}}})})();CKEDITOR.plugins.sourcearea={commands:{source:{modes:{wysiwyg:1,source:1},editorFocus:!1,readOnly:1,exec:function(c){"wysiwyg"==c.mode&&c.fire("saveSnapshot");c.getCommand("source").setState(CKEDITOR.TRISTATE_DISABLED);c.setMode("source"==c.mode?"wysiwyg":"source")},canUndo:!1}}};CKEDITOR.plugins.add("specialchar",{availableLangs:{af:1,ar:1,bg:1,ca:1,cs:1,cy:1,da:1,de:1,el:1,en:1,"en-gb":1,eo:1,es:1,et:1,fa:1,fi:1,fr:1,"fr-ca":1,gl:1,he:1,hr:1,hu:1,id:1,it:1,ja:1,km:1,ku:1,lt:1,lv:1,nb:1,nl:1,no:1,pl:1,pt:1,"pt-br":1,ru:1,si:1,sk:1,sl:1,sq:1,sv:1,th:1,tr:1,tt:1,ug:1,uk:1,vi:1,zh:1,"zh-cn":1},requires:"dialog",init:function(a){var c=this;CKEDITOR.dialog.add("specialchar",this.path+"dialogs/specialchar.js");a.addCommand("specialchar",{exec:function(){var b=a.langCode,b=c.availableLangs[b]?
+b:c.availableLangs[b.replace(/-.*/,"")]?b.replace(/-.*/,""):"en";CKEDITOR.scriptLoader.load(CKEDITOR.getUrl(c.path+"dialogs/lang/"+b+".js"),function(){CKEDITOR.tools.extend(a.lang.specialchar,c.langEntries[b]);a.openDialog("specialchar")})},modes:{wysiwyg:1},canUndo:!1});a.ui.addButton&&a.ui.addButton("SpecialChar",{label:a.lang.specialchar.toolbar,command:"specialchar",toolbar:"insert,50"})}});CKEDITOR.config.specialChars="! &quot; # $ % &amp; ' ( ) * + - . / 0 1 2 3 4 5 6 7 8 9 : ; &lt; = &gt; ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ &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; &Aacute; &Acirc; &Atilde; &Auml; &Aring; &AElig; &Ccedil; &Egrave; &Eacute; &Ecirc; &Euml; &Igrave; &Iacute; &Icirc; &Iuml; &ETH; &Ntilde; &Ograve; &Oacute; &Ocirc; &Otilde; &Ouml; &times; &Oslash; &Ugrave; &Uacute; &Ucirc; &Uuml; &Yacute; &THORN; &szlig; &agrave; &aacute; &acirc; &atilde; &auml; &aring; &aelig; &ccedil; &egrave; &eacute; &ecirc; &euml; &igrave; &iacute; &icirc; &iuml; &eth; &ntilde; &ograve; &oacute; &ocirc; &otilde; &ouml; &divide; &oslash; &ugrave; &uacute; &ucirc; &uuml; &yacute; &thorn; &yuml; &OElig; &oelig; &#372; &#374 &#373 &#375; &sbquo; &#8219; &bdquo; &hellip; &trade; &#9658; &bull; &rarr; &rArr; &hArr; &diams; &asymp;".split(" ");CKEDITOR.plugins.add("menubutton",{requires:"button,menu",onLoad:function(){var d=function(c){var a=this._,b=a.menu;a.state!==CKEDITOR.TRISTATE_DISABLED&&(a.on&&b?b.hide():(a.previousState=a.state,b||(b=a.menu=new CKEDITOR.menu(c,{panel:{className:"cke_menu_panel",attributes:{"aria-label":c.lang.common.options}}}),b.onHide=CKEDITOR.tools.bind(function(){var b=this.command?c.getCommand(this.command).modes:this.modes;this.setState(!b||b[c.mode]?a.previousState:CKEDITOR.TRISTATE_DISABLED);a.on=0},this),
+this.onMenu&&b.addListener(this.onMenu)),this.setState(CKEDITOR.TRISTATE_ON),a.on=1,setTimeout(function(){b.show(CKEDITOR.document.getById(a.id),4)},0)))};CKEDITOR.ui.menuButton=CKEDITOR.tools.createClass({base:CKEDITOR.ui.button,$:function(c){delete c.panel;this.base(c);this.hasArrow=!0;this.click=d},statics:{handler:{create:function(c){return new CKEDITOR.ui.menuButton(c)}}}})},beforeInit:function(d){d.ui.addHandler(CKEDITOR.UI_MENUBUTTON,CKEDITOR.ui.menuButton.handler)}});
+CKEDITOR.UI_MENUBUTTON="menubutton";CKEDITOR.plugins.add("scayt",{requires:"menubutton,dialog",tabToOpen:null,dialogName:"scaytDialog",init:function(a){var c=this,d=CKEDITOR.plugins.scayt;this.bindEvents(a);this.parseConfig(a);this.addRule(a);CKEDITOR.dialog.add(this.dialogName,CKEDITOR.getUrl(this.path+"dialogs/options.js"));this.addMenuItems(a);var b=a.lang.scayt,e=CKEDITOR.env;a.ui.add("Scayt",CKEDITOR.UI_MENUBUTTON,{label:b.text_title,title:a.plugins.wsc?a.lang.wsc.title:b.text_title,modes:{wysiwyg:!(e.ie&&(8>e.version||e.quirks))},
+toolbar:"spellchecker,20",refresh:function(){var b=a.ui.instances.Scayt.getState();a.scayt&&(b=d.state[a.name]?CKEDITOR.TRISTATE_ON:CKEDITOR.TRISTATE_OFF);a.fire("scaytButtonState",b)},onRender:function(){var d=this;a.on("scaytButtonState",function(a){void 0!==typeof a.data&&d.setState(a.data)})},onMenu:function(){var b=a.scayt;a.getMenuItem("scaytToggle").label=a.lang.scayt[b&&d.state[a.name]?"btn_disable":"btn_enable"];b={scaytToggle:CKEDITOR.TRISTATE_OFF,scaytOptions:b?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,
+scaytLangs:b?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,scaytDict:b?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,scaytAbout:b?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,WSC:a.plugins.wsc?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED};a.config.scayt_uiTabs[0]||delete b.scaytOptions;a.config.scayt_uiTabs[1]||delete b.scaytLangs;a.config.scayt_uiTabs[2]||delete b.scaytDict;return b}});a.contextMenu&&a.addMenuItems&&(a.contextMenu.addListener(function(){var d=a.scayt,b;if(d){var e=
+d.getSelectionNode();if(e=e?e.getAttribute(d.getNodeAttribute()):e)b=c.menuGenerator(a,e,c),d.showBanner("."+a.contextMenu._.definition.panel.className.split(" ").join(" ."))}return b}),a.contextMenu._.onHide=CKEDITOR.tools.override(a.contextMenu._.onHide,function(d){return function(){var b=a.scayt;b&&b.hideBanner();return d.apply(this)}}))},addMenuItems:function(a){var c=this,d=CKEDITOR.plugins.scayt;a.addMenuGroup("scaytButton");var b=a.config.scayt_contextMenuItemsOrder.split("|");if(b&&b.length)for(var e=
+0;e<b.length;e++)a.addMenuGroup("scayt_"+b[e],e-10);b={scaytToggle:{label:a.lang.scayt.btn_enable,group:"scaytButton",onClick:function(){var b=a.scayt;d.state[a.name]=!d.state[a.name];!0===d.state[a.name]?b||d.createScayt(a):b&&d.destroy(a)}},scaytAbout:{label:a.lang.scayt.btn_about,group:"scaytButton",onClick:function(){a.scayt.tabToOpen="about";a.lockSelection();a.openDialog(c.dialogName)}},scaytOptions:{label:a.lang.scayt.btn_options,group:"scaytButton",onClick:function(){a.scayt.tabToOpen="options";
+a.lockSelection();a.openDialog(c.dialogName)}},scaytLangs:{label:a.lang.scayt.btn_langs,group:"scaytButton",onClick:function(){a.scayt.tabToOpen="langs";a.lockSelection();a.openDialog(c.dialogName)}},scaytDict:{label:a.lang.scayt.btn_dictionaries,group:"scaytButton",onClick:function(){a.scayt.tabToOpen="dictionaries";a.lockSelection();a.openDialog(c.dialogName)}}};a.plugins.wsc&&(b.WSC={label:a.lang.wsc.toolbar,group:"scaytButton",onClick:function(){var d=CKEDITOR.plugins.scayt,b=a.scayt,c=a.elementMode==
+CKEDITOR.ELEMENT_MODE_INLINE?a.container.getText():a.document.getBody().getText();(c=c.replace(/\s/g,""))?(b&&(d.state[a.name]&&b.setMarkupPaused)&&b.setMarkupPaused(!0),a.lockSelection(),a.execCommand("checkspell")):alert("Nothing to check!")}});a.addMenuItems(b)},bindEvents:function(a){function c(){var d=a.scayt;d&&(d.removeMarkupInSelectionNode(),d.fire("startSpellCheck"))}var d=CKEDITOR.plugins.scayt,b=a.elementMode==CKEDITOR.ELEMENT_MODE_INLINE;CKEDITOR.on("dialogDefinition",function(a){if("scaytDialog"===
+a.data.name)a.data.definition.dialog.on("cancel",function(){return!1},this,null,-1)});var e=function(){a.scayt&&d.destroy(a)},g=function(){d.state[a.name]&&!a.readOnly&&d.createScayt(a)},f=function(){var d=a.editable();d.attachListener(d,"focus",function(){var d=CKEDITOR.plugins.scayt&&CKEDITOR.plugins.scayt.state[a.name]&&a.scayt,c,e;if((b||d)&&a._.savedSelection)for(var d=a._.savedSelection.getSelectedElement(),d=!d&&a._.savedSelection.getRanges(),i=0;i<d.length;i++)e=d[i],c=e.startContainer.getText().length,
+(c<e.startOffset||c<e.endOffset)&&a.unlockSelection(!1)},this,null,-10)},h=function(){b?(a.on("blur",e),a.on("focus",g),a.focusManager.hasFocus&&g()):g();f()};a.on("contentDom",h);a.on("beforeCommandExec",function(b){var c;if(b.data.name in d.options.disablingCommandExec&&"wysiwyg"==a.mode){if(c=a.scayt)d.destroy(a),a.fire("scaytButtonState",CKEDITOR.TRISTATE_DISABLED)}else if("bold"===b.data.name||"italic"===b.data.name||"underline"===b.data.name||"strike"===b.data.name||"subscript"===b.data.name||
+"superscript"===b.data.name)if(c=a.scayt)c.removeMarkupInSelectionNode(),setTimeout(function(){c.fire("startSpellCheck")},0)});a.on("beforeSetMode",function(b){if("source"==b.data){if(b=a.scayt)d.destroy(a),a.fire("scaytButtonState",CKEDITOR.TRISTATE_DISABLED);a.document&&(a.document.getBody().removeAttribute("_jquid"),a.document.getBody().removeAttribute("dir"))}});a.on("afterCommandExec",function(d){var b;if("wysiwyg"==a.mode&&("undo"==d.data.name||"redo"==d.data.name))(b=a.scayt)&&setTimeout(function(){b.fire("startSpellCheck")},
+250)});a.on("readOnly",function(b){var c;b&&(c=a.scayt,!0===b.editor.readOnly?c&&c.fire("removeMarkupInDocument",{}):c?c.fire("startSpellCheck"):"wysiwyg"==b.editor.mode&&!0===d.state[b.editor.name]&&(d.createScayt(a),b.editor.fire("scaytButtonState",CKEDITOR.TRISTATE_ON)))});a.on("beforeDestroy",e);a.on("setData",function(){e();a.elementMode==CKEDITOR.ELEMENT_MODE_INLINE&&h()},this,null,50);a.on("insertElement",function(){CKEDITOR.env.ie?setTimeout(function(){c()},50):c()},this,null,50);a.on("insertHtml",
+function(){c()},this,null,50);a.on("insertText",function(){c()},this,null,50);a.on("scaytDialogShown",function(d){d.data.selectPage(a.scayt.tabToOpen)})},parseConfig:function(a){var c=CKEDITOR.plugins.scayt;c.replaceOldOptionsNames(a.config);"boolean"!==typeof a.config.scayt_autoStartup&&(a.config.scayt_autoStartup=!1);c.state[a.name]=a.config.scayt_autoStartup;a.config.scayt_contextCommands||(a.config.scayt_contextCommands="ignore|ignoreall|add");a.config.scayt_contextMenuItemsOrder||(a.config.scayt_contextMenuItemsOrder=
+"suggest|moresuggest|control");a.config.scayt_sLang||(a.config.scayt_sLang="en_US");if(void 0===a.config.scayt_maxSuggestions||"number"!=typeof a.config.scayt_maxSuggestions||0>a.config.scayt_maxSuggestions)a.config.scayt_maxSuggestions=5;if(void 0===a.config.scayt_customDictionaryIds||"string"!==typeof a.config.scayt_customDictionaryIds)a.config.scayt_customDictionaryIds="";if(void 0===a.config.scayt_userDictionaryName||"string"!==typeof a.config.scayt_userDictionaryName)a.config.scayt_userDictionaryName=
+null;if("string"===typeof a.config.scayt_uiTabs&&3===a.config.scayt_uiTabs.split(",").length){var d=[],b=[];a.config.scayt_uiTabs=a.config.scayt_uiTabs.split(",");CKEDITOR.tools.search(a.config.scayt_uiTabs,function(a){if(Number(a)===1||Number(a)===0){b.push(true);d.push(Number(a))}else b.push(false)});a.config.scayt_uiTabs=null===CKEDITOR.tools.search(b,!1)?d:[1,1,1]}else a.config.scayt_uiTabs=[1,1,1];"string"!=typeof a.config.scayt_serviceProtocol&&(a.config.scayt_serviceProtocol=null);"string"!=
+typeof a.config.scayt_serviceHost&&(a.config.scayt_serviceHost=null);"string"!=typeof a.config.scayt_servicePort&&(a.config.scayt_servicePort=null);"string"!=typeof a.config.scayt_servicePath&&(a.config.scayt_servicePath=null);a.config.scayt_moreSuggestions||(a.config.scayt_moreSuggestions="on");"string"!==typeof a.config.scayt_customerId&&(a.config.scayt_customerId="1:WvF0D4-UtPqN1-43nkD4-NKvUm2-daQqk3-LmNiI-z7Ysb4-mwry24-T8YrS3-Q2tpq2");"string"!==typeof a.config.scayt_srcUrl&&(c=document.location.protocol,
+c=-1!=c.search(/https?:/)?c:"http:",a.config.scayt_srcUrl=c+"//svc.webspellchecker.net/spellcheck31/lf/scayt3/ckscayt/ckscayt.js");"boolean"!==typeof CKEDITOR.config.scayt_handleCheckDirty&&(CKEDITOR.config.scayt_handleCheckDirty=!0);"boolean"!==typeof CKEDITOR.config.scayt_handleUndoRedo&&(CKEDITOR.config.scayt_handleUndoRedo=!0);if(a.config.scayt_disableOptionsStorage){var c=CKEDITOR.tools.isArray(a.config.scayt_disableOptionsStorage)?a.config.scayt_disableOptionsStorage:"string"===typeof a.config.scayt_disableOptionsStorage?
+[a.config.scayt_disableOptionsStorage]:void 0,e="all options lang ignore-all-caps-words ignore-domain-names ignore-words-with-mixed-cases ignore-words-with-numbers".split(" "),g=["lang","ignore-all-caps-words","ignore-domain-names","ignore-words-with-mixed-cases","ignore-words-with-numbers"],f=CKEDITOR.tools.search,h=CKEDITOR.tools.indexOf;a.config.scayt_disableOptionsStorage=function(a){for(var d=[],b=0;b<a.length;b++){var c=a[b],j=!!f(a,"options");if(!f(e,c)||j&&f(g,function(a){if(a==="lang")return false}))return;
+f(g,c)&&g.splice(h(g,c),1);if(c==="all"||j&&f(a,"lang"))return[];c==="options"&&(g=["lang"])}return d=d.concat(g)}(c)}},addRule:function(a){var c=a.dataProcessor,d=c&&c.htmlFilter,b=a._.elementsPath&&a._.elementsPath.filters,c=c&&c.dataFilter,e=a.addRemoveFormatFilter,g=function(d){var b=CKEDITOR.plugins.scayt;if(a.scayt&&d.hasAttribute(b.options.data_attribute_name))return!1},f=function(d){var b=CKEDITOR.plugins.scayt,c=!0;a.scayt&&d.hasAttribute(b.options.data_attribute_name)&&(c=!1);return c};
+b&&b.push(g);c&&c.addRules({elements:{span:function(d){var b=CKEDITOR.plugins.scayt;b&&(b.state[a.name]&&d.classes&&CKEDITOR.tools.search(d.classes,b.options.misspelled_word_class))&&(d.classes&&d.parent.type===CKEDITOR.NODE_DOCUMENT_FRAGMENT?(delete d.attributes.style,delete d.name):delete d.classes[CKEDITOR.tools.indexOf(d.classes,b.options.misspelled_word_class)]);return d}}});d&&d.addRules({elements:{span:function(d){var b=CKEDITOR.plugins.scayt;b&&(b.state[a.name]&&d.hasClass(b.options.misspelled_word_class)&&
+d.attributes[b.options.data_attribute_name])&&(d.removeClass(b.options.misspelled_word_class),delete d.attributes[b.options.data_attribute_name],delete d.name);return d}}});e&&e.call(a,f)},scaytMenuDefinition:function(a){var c=this,a=a.scayt;return{scayt_ignore:{label:a.getLocal("btn_ignore"),group:"scayt_control",order:1,exec:function(a){a.scayt.ignoreWord()}},scayt_ignoreall:{label:a.getLocal("btn_ignoreAll"),group:"scayt_control",order:2,exec:function(a){a.scayt.ignoreAllWords()}},scayt_add:{label:a.getLocal("btn_addWord"),
+group:"scayt_control",order:3,exec:function(a){var b=a.scayt;setTimeout(function(){b.addWordToUserDictionary()},10)}},option:{label:a.getLocal("btn_options"),group:"scayt_control",order:4,exec:function(a){a.scayt.tabToOpen="options";a.lockSelection();a.openDialog(c.dialogName)},verification:function(a){return 1==a.config.scayt_uiTabs[0]?!0:!1}},language:{label:a.getLocal("btn_langs"),group:"scayt_control",order:5,exec:function(a){a.scayt.tabToOpen="langs";a.lockSelection();a.openDialog(c.dialogName)},
+verification:function(a){return 1==a.config.scayt_uiTabs[1]?!0:!1}},dictionary:{label:a.getLocal("btn_dictionaries"),group:"scayt_control",order:6,exec:function(a){a.scayt.tabToOpen="dictionaries";a.lockSelection();a.openDialog(c.dialogName)},verification:function(a){return 1==a.config.scayt_uiTabs[2]?!0:!1}},about:{label:a.getLocal("btn_about"),group:"scayt_control",order:7,exec:function(a){a.scayt.tabToOpen="about";a.lockSelection();a.openDialog(c.dialogName)}}}},buildSuggestionMenuItems:function(a,
+c){var d={},b={},e=a.scayt;if(0<c.length&&"no_any_suggestions"!==c[0])for(var g=0;g<c.length;g++){var f="scayt_suggest_"+CKEDITOR.plugins.scayt.suggestions[g].replace(" ","_");a.addCommand(f,this.createCommand(CKEDITOR.plugins.scayt.suggestions[g]));g<a.config.scayt_maxSuggestions?(a.addMenuItem(f,{label:c[g],command:f,group:"scayt_suggest",order:g+1}),d[f]=CKEDITOR.TRISTATE_OFF):(a.addMenuItem(f,{label:c[g],command:f,group:"scayt_moresuggest",order:g+1}),b[f]=CKEDITOR.TRISTATE_OFF,"on"===a.config.scayt_moreSuggestions&&
+(a.addMenuItem("scayt_moresuggest",{label:e.getLocal("btn_moreSuggestions"),group:"scayt_moresuggest",order:10,getItems:function(){return b}}),d.scayt_moresuggest=CKEDITOR.TRISTATE_OFF))}else d.no_scayt_suggest=CKEDITOR.TRISTATE_DISABLED,a.addCommand("no_scayt_suggest",{exec:function(){}}),a.addMenuItem("no_scayt_suggest",{label:e.getLocal("btn_noSuggestions")||"no_scayt_suggest",command:"no_scayt_suggest",group:"scayt_suggest",order:0});return d},menuGenerator:function(a,c){var d=a.scayt,b=this.scaytMenuDefinition(a),
+e={},g=a.config.scayt_contextCommands.split("|");d.fire("getSuggestionsList",{lang:d.getLang(),word:c});e=this.buildSuggestionMenuItems(a,CKEDITOR.plugins.scayt.suggestions);if("off"==a.config.scayt_contextCommands)return e;for(var f in b)-1==CKEDITOR.tools.indexOf(g,f.replace("scayt_",""))&&"all"!=a.config.scayt_contextCommands||(e[f]=CKEDITOR.TRISTATE_OFF,"function"===typeof b[f].verification&&!b[f].verification(a)&&delete e[f],a.addCommand(f,{exec:b[f].exec}),a.addMenuItem(f,{label:a.lang.scayt[b[f].label]||
+b[f].label,command:f,group:b[f].group,order:b[f].order}));return e},createCommand:function(a){return{exec:function(c){c.scayt.replaceSelectionNode({word:a})}}}});
+CKEDITOR.plugins.scayt={state:{},suggestions:[],loadingHelper:{loadOrder:[]},isLoading:!1,options:{disablingCommandExec:{source:!0,newpage:!0,templates:!0},data_attribute_name:"data-scayt-word",misspelled_word_class:"scayt-misspell-word"},backCompatibilityMap:{scayt_service_protocol:"scayt_serviceProtocol",scayt_service_host:"scayt_serviceHost",scayt_service_port:"scayt_servicePort",scayt_service_path:"scayt_servicePath",scayt_customerid:"scayt_customerId"},replaceOldOptionsNames:function(a){for(var c in a)c in
+this.backCompatibilityMap&&(a[this.backCompatibilityMap[c]]=a[c],delete a[c])},createScayt:function(a){var c=this;this.loadScaytLibrary(a,function(a){var b={lang:a.config.scayt_sLang,container:"BODY"==a.editable().$.nodeName?a.document.getWindow().$.frameElement:a.editable().$,customDictionary:a.config.scayt_customDictionaryIds,userDictionaryName:a.config.scayt_userDictionaryName,localization:a.langCode,customer_id:a.config.scayt_customerId,debug:a.config.scayt_debug,data_attribute_name:c.options.data_attribute_name,
+misspelled_word_class:c.options.misspelled_word_class,"options-to-restore":a.config.scayt_disableOptionsStorage,focused:a.editable().hasFocus,ignoreElementsRegex:a.config.scayt_elementsToIgnore};a.config.scayt_serviceProtocol&&(b.service_protocol=a.config.scayt_serviceProtocol);a.config.scayt_serviceHost&&(b.service_host=a.config.scayt_serviceHost);a.config.scayt_servicePort&&(b.service_port=a.config.scayt_servicePort);a.config.scayt_servicePath&&(b.service_path=a.config.scayt_servicePath);b=new SCAYT.CKSCAYT(b,
+function(){},function(){});b.subscribe("suggestionListSend",function(a){for(var b={},d=[],c=0;c<a.suggestionList.length;c++)if(!b["word_"+a.suggestionList[c]]){b["word_"+a.suggestionList[c]]=a.suggestionList[c];d.push(a.suggestionList[c])}CKEDITOR.plugins.scayt.suggestions=d});a.scayt=b;a.fire("scaytButtonState",a.readOnly?CKEDITOR.TRISTATE_DISABLED:CKEDITOR.TRISTATE_ON)})},destroy:function(a){a.scayt&&a.scayt.destroy();delete a.scayt;a.fire("scaytButtonState",CKEDITOR.TRISTATE_OFF)},loadScaytLibrary:function(a,
+c){var d=this;"undefined"===typeof window.SCAYT||"function"!==typeof window.SCAYT.CKSCAYT?(this.loadingHelper[a.name]=c,this.loadingHelper.loadOrder.push(a.name),CKEDITOR.scriptLoader.load(a.config.scayt_srcUrl,function(){var a;CKEDITOR.fireOnce("scaytReady");for(var c=0;c<d.loadingHelper.loadOrder.length;c++){a=d.loadingHelper.loadOrder[c];if("function"===typeof d.loadingHelper[a])d.loadingHelper[a](CKEDITOR.instances[a]);delete d.loadingHelper[a]}d.loadingHelper.loadOrder=[]})):window.SCAYT&&"function"===
+typeof window.SCAYT.CKSCAYT&&(CKEDITOR.fireOnce("scaytReady"),a.scayt||"function"===typeof c&&c(a))}};
+CKEDITOR.on("scaytReady",function(){if(!0===CKEDITOR.config.scayt_handleCheckDirty){var a=CKEDITOR.editor.prototype;a.checkDirty=CKEDITOR.tools.override(a.checkDirty,function(a){return function(){var b=null,c=this.scayt;if(!CKEDITOR.plugins.scayt||!CKEDITOR.plugins.scayt.state[this.name]||!this.scayt)b=a.call(this);else if(b="ready"==this.status)var g=c.removeMarkupFromString(this.getSnapshot()),c=c.removeMarkupFromString(this._.previousValue),b=b&&c!==g;return b}});a.resetDirty=CKEDITOR.tools.override(a.resetDirty,
+function(a){return function(){var b=this.scayt;!CKEDITOR.plugins.scayt||!CKEDITOR.plugins.scayt.state[this.name]||!this.scayt?a.call(this):this._.previousValue=b.removeMarkupFromString(this.getSnapshot())}})}if(!0===CKEDITOR.config.scayt_handleUndoRedo){var a=CKEDITOR.plugins.undo.Image.prototype,c="function"==typeof a.equalsContent?"equalsContent":"equals";a[c]=CKEDITOR.tools.override(a[c],function(a){return function(b){var c=b.editor.scayt,g=this.contents,f=b.contents,h=null;CKEDITOR.plugins.scayt&&
+(CKEDITOR.plugins.scayt.state[b.editor.name]&&b.editor.scayt)&&(this.contents=c.removeMarkupFromString(g)||"",b.contents=c.removeMarkupFromString(f)||"");h=a.apply(this,arguments);this.contents=g;b.contents=f;return h}})}});(function(){CKEDITOR.plugins.add("stylescombo",{requires:"richcombo",init:function(c){var j=c.config,g=c.lang.stylescombo,f={},i=[],k=[];c.on("stylesSet",function(b){if(b=b.data.styles){for(var a,h,d,e=0,l=b.length;e<l;e++)if(a=b[e],!(c.blockless&&a.element in CKEDITOR.dtd.$block)&&(h=a.name,a=new CKEDITOR.style(a),!c.filter.customConfig||c.filter.check(a)))a._name=h,a._.enterMode=j.enterMode,a._.type=d=a.assignedTo||a.type,a._.weight=e+1E3*(d==CKEDITOR.STYLE_OBJECT?1:d==CKEDITOR.STYLE_BLOCK?2:3),
+f[h]=a,i.push(a),k.push(a);i.sort(function(a,b){return a._.weight-b._.weight})}});c.ui.addRichCombo("Styles",{label:g.label,title:g.panelTitle,toolbar:"styles,10",allowedContent:k,panel:{css:[CKEDITOR.skin.getPath("editor")].concat(j.contentsCss),multiSelect:!0,attributes:{"aria-label":g.panelTitle}},init:function(){var b,a,c,d,e,f;e=0;for(f=i.length;e<f;e++)b=i[e],a=b._name,d=b._.type,d!=c&&(this.startGroup(g["panelTitle"+d]),c=d),this.add(a,b.type==CKEDITOR.STYLE_OBJECT?a:b.buildPreview(),a);this.commit()},
+onClick:function(b){c.focus();c.fire("saveSnapshot");var b=f[b],a=c.elementPath();c[b.checkActive(a,c)?"removeStyle":"applyStyle"](b);c.fire("saveSnapshot")},onRender:function(){c.on("selectionChange",function(b){for(var a=this.getValue(),b=b.data.path.elements,h=0,d=b.length,e;h<d;h++){e=b[h];for(var g in f)if(f[g].checkElementRemovable(e,!0,c)){g!=a&&this.setValue(g);return}}this.setValue("")},this)},onOpen:function(){var b=c.getSelection().getSelectedElement(),b=c.elementPath(b),a=[0,0,0,0];this.showAll();
+this.unmarkAll();for(var h in f){var d=f[h],e=d._.type;d.checkApplicable(b,c,c.activeFilter)?a[e]++:this.hideItem(h);d.checkActive(b,c)&&this.mark(h)}a[CKEDITOR.STYLE_BLOCK]||this.hideGroup(g["panelTitle"+CKEDITOR.STYLE_BLOCK]);a[CKEDITOR.STYLE_INLINE]||this.hideGroup(g["panelTitle"+CKEDITOR.STYLE_INLINE]);a[CKEDITOR.STYLE_OBJECT]||this.hideGroup(g["panelTitle"+CKEDITOR.STYLE_OBJECT])},refresh:function(){var b=c.elementPath();if(b){for(var a in f)if(f[a].checkApplicable(b,c,c.activeFilter))return;
+this.setState(CKEDITOR.TRISTATE_DISABLED)}},reset:function(){f={};i=[]}})}})})();(function(){function i(c){return{editorFocus:!1,canUndo:!1,modes:{wysiwyg:1},exec:function(d){if(d.editable().hasFocus){var e=d.getSelection(),b;if(b=(new CKEDITOR.dom.elementPath(e.getCommonAncestor(),e.root)).contains({td:1,th:1},1)){var e=d.createRange(),a=CKEDITOR.tools.tryThese(function(){var a=b.getParent().$.cells[b.$.cellIndex+(c?-1:1)];a.parentNode.parentNode;return a},function(){var a=b.getParent(),a=a.getAscendant("table").$.rows[a.$.rowIndex+(c?-1:1)];return a.cells[c?a.cells.length-1:
+0]});if(!a&&!c){for(var f=b.getAscendant("table").$,a=b.getParent().$.cells,f=new CKEDITOR.dom.element(f.insertRow(-1),d.document),g=0,h=a.length;g<h;g++)f.append((new CKEDITOR.dom.element(a[g],d.document)).clone(!1,!1)).appendBogus();e.moveToElementEditStart(f)}else if(a)a=new CKEDITOR.dom.element(a),e.moveToElementEditStart(a),(!e.checkStartOfBlock()||!e.checkEndOfBlock())&&e.selectNodeContents(a);else return!0;e.select(!0);return!0}}return!1}}}var h={editorFocus:!1,modes:{wysiwyg:1,source:1}},
+g={exec:function(c){c.container.focusNext(!0,c.tabIndex)}},f={exec:function(c){c.container.focusPrevious(!0,c.tabIndex)}};CKEDITOR.plugins.add("tab",{init:function(c){for(var d=!1!==c.config.enableTabKeyTools,e=c.config.tabSpaces||0,b="";e--;)b+=" ";if(b)c.on("key",function(a){9==a.data.keyCode&&(c.insertText(b),a.cancel())});if(d)c.on("key",function(a){(9==a.data.keyCode&&c.execCommand("selectNextCell")||a.data.keyCode==CKEDITOR.SHIFT+9&&c.execCommand("selectPreviousCell"))&&a.cancel()});c.addCommand("blur",
+CKEDITOR.tools.extend(g,h));c.addCommand("blurBack",CKEDITOR.tools.extend(f,h));c.addCommand("selectNextCell",i());c.addCommand("selectPreviousCell",i(!0))}})})();
+CKEDITOR.dom.element.prototype.focusNext=function(i,h){var g=void 0===h?this.getTabIndex():h,f,c,d,e,b,a;if(0>=g)for(b=this.getNextSourceNode(i,CKEDITOR.NODE_ELEMENT);b;){if(b.isVisible()&&0===b.getTabIndex()){d=b;break}b=b.getNextSourceNode(!1,CKEDITOR.NODE_ELEMENT)}else for(b=this.getDocument().getBody().getFirst();b=b.getNextSourceNode(!1,CKEDITOR.NODE_ELEMENT);){if(!f)if(!c&&b.equals(this)){if(c=!0,i){if(!(b=b.getNextSourceNode(!0,CKEDITOR.NODE_ELEMENT)))break;f=1}}else c&&!this.contains(b)&&
+(f=1);if(b.isVisible()&&!(0>(a=b.getTabIndex()))){if(f&&a==g){d=b;break}a>g&&(!d||!e||a<e)?(d=b,e=a):!d&&0===a&&(d=b,e=a)}}d&&d.focus()};
+CKEDITOR.dom.element.prototype.focusPrevious=function(i,h){for(var g=void 0===h?this.getTabIndex():h,f,c,d,e=0,b,a=this.getDocument().getBody().getLast();a=a.getPreviousSourceNode(!1,CKEDITOR.NODE_ELEMENT);){if(!f)if(!c&&a.equals(this)){if(c=!0,i){if(!(a=a.getPreviousSourceNode(!0,CKEDITOR.NODE_ELEMENT)))break;f=1}}else c&&!this.contains(a)&&(f=1);if(a.isVisible()&&!(0>(b=a.getTabIndex())))if(0>=g){if(f&&0===b){d=a;break}b>e&&(d=a,e=b)}else{if(f&&b==g){d=a;break}if(b<g&&(!d||b>e))d=a,e=b}}d&&d.focus()};CKEDITOR.plugins.add("table",{requires:"dialog",init:function(a){function e(a){return CKEDITOR.tools.extend(a||{},{contextSensitive:1,refresh:function(a,f){this.setState(f.contains("table",1)?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED)}})}if(!a.blockless){var c=a.lang.table;a.addCommand("table",new CKEDITOR.dialogCommand("table",{context:"table",allowedContent:"table{width,height}[align,border,cellpadding,cellspacing,summary];caption tbody thead tfoot;th td tr[scope];"+(a.plugins.dialogadvtab?
+"table"+a.plugins.dialogadvtab.allowedContent():""),requiredContent:"table",contentTransformations:[["table{width}: sizeToStyle","table[width]: sizeToAttribute"]]}));a.addCommand("tableProperties",new CKEDITOR.dialogCommand("tableProperties",e()));a.addCommand("tableDelete",e({exec:function(a){var b=a.elementPath().contains("table",1);if(b){var d=b.getParent(),c=a.editable();1==d.getChildCount()&&(!d.is("td","th")&&!d.equals(c))&&(b=d);a=a.createRange();a.moveToPosition(b,CKEDITOR.POSITION_BEFORE_START);
+b.remove();a.select()}}}));a.ui.addButton&&a.ui.addButton("Table",{label:c.toolbar,command:"table",toolbar:"insert,30"});CKEDITOR.dialog.add("table",this.path+"dialogs/table.js");CKEDITOR.dialog.add("tableProperties",this.path+"dialogs/table.js");a.addMenuItems&&a.addMenuItems({table:{label:c.menu,command:"tableProperties",group:"table",order:5},tabledelete:{label:c.deleteTable,command:"tableDelete",group:"table",order:1}});a.on("doubleclick",function(a){a.data.element.is("table")&&(a.data.dialog=
+"tableProperties")});a.contextMenu&&a.contextMenu.addListener(function(){return{tabledelete:CKEDITOR.TRISTATE_OFF,table:CKEDITOR.TRISTATE_OFF}})}}});(function(){function p(e){function d(a){!(0<b.length)&&(a.type==CKEDITOR.NODE_ELEMENT&&y.test(a.getName())&&!a.getCustomData("selected_cell"))&&(CKEDITOR.dom.element.setMarker(c,a,"selected_cell",!0),b.push(a))}for(var e=e.getRanges(),b=[],c={},a=0;a<e.length;a++){var f=e[a];if(f.collapsed)f=f.getCommonAncestor(),(f=f.getAscendant("td",!0)||f.getAscendant("th",!0))&&b.push(f);else{var f=new CKEDITOR.dom.walker(f),g;for(f.guard=d;g=f.next();)if(g.type!=CKEDITOR.NODE_ELEMENT||!g.is(CKEDITOR.dtd.table))if((g=
+g.getAscendant("td",!0)||g.getAscendant("th",!0))&&!g.getCustomData("selected_cell"))CKEDITOR.dom.element.setMarker(c,g,"selected_cell",!0),b.push(g)}}CKEDITOR.dom.element.clearAllMarkers(c);return b}function o(e,d){for(var b=p(e),c=b[0],a=c.getAscendant("table"),c=c.getDocument(),f=b[0].getParent(),g=f.$.rowIndex,b=b[b.length-1],h=b.getParent().$.rowIndex+b.$.rowSpan-1,b=new CKEDITOR.dom.element(a.$.rows[h]),g=d?g:h,f=d?f:b,b=CKEDITOR.tools.buildTableMap(a),a=b[g],g=d?b[g-1]:b[g+1],b=b[0].length,
+c=c.createElement("tr"),h=0;a[h]&&h<b;h++){var i;1<a[h].rowSpan&&g&&a[h]==g[h]?(i=a[h],i.rowSpan+=1):(i=(new CKEDITOR.dom.element(a[h])).clone(),i.removeAttribute("rowSpan"),i.appendBogus(),c.append(i),i=i.$);h+=i.colSpan-1}d?c.insertBefore(f):c.insertAfter(f)}function q(e){if(e instanceof CKEDITOR.dom.selection){for(var d=p(e),b=d[0].getAscendant("table"),c=CKEDITOR.tools.buildTableMap(b),e=d[0].getParent().$.rowIndex,d=d[d.length-1],a=d.getParent().$.rowIndex+d.$.rowSpan-1,d=[],f=e;f<=a;f++){for(var g=
+c[f],h=new CKEDITOR.dom.element(b.$.rows[f]),i=0;i<g.length;i++){var j=new CKEDITOR.dom.element(g[i]),l=j.getParent().$.rowIndex;1==j.$.rowSpan?j.remove():(j.$.rowSpan-=1,l==f&&(l=c[f+1],l[i-1]?j.insertAfter(new CKEDITOR.dom.element(l[i-1])):(new CKEDITOR.dom.element(b.$.rows[f+1])).append(j,1)));i+=j.$.colSpan-1}d.push(h)}c=b.$.rows;b=new CKEDITOR.dom.element(c[a+1]||(0<e?c[e-1]:null)||b.$.parentNode);for(f=d.length;0<=f;f--)q(d[f]);return b}e instanceof CKEDITOR.dom.element&&(b=e.getAscendant("table"),
+1==b.$.rows.length?b.remove():e.remove());return null}function r(e,d){for(var b=d?Infinity:0,c=0;c<e.length;c++){var a;a=e[c];for(var f=d,g=a.getParent().$.cells,h=0,i=0;i<g.length;i++){var j=g[i],h=h+(f?1:j.colSpan);if(j==a.$)break}a=h-1;if(d?a<b:a>b)b=a}return b}function k(e,d){for(var b=p(e),c=b[0].getAscendant("table"),a=r(b,1),b=r(b),a=d?a:b,f=CKEDITOR.tools.buildTableMap(c),c=[],b=[],g=f.length,h=0;h<g;h++)c.push(f[h][a]),b.push(d?f[h][a-1]:f[h][a+1]);for(h=0;h<g;h++)c[h]&&(1<c[h].colSpan&&
+b[h]==c[h]?(a=c[h],a.colSpan+=1):(a=(new CKEDITOR.dom.element(c[h])).clone(),a.removeAttribute("colSpan"),a.appendBogus(),a[d?"insertBefore":"insertAfter"].call(a,new CKEDITOR.dom.element(c[h])),a=a.$),h+=a.rowSpan-1)}function u(e,d){var b=e.getStartElement();if(b=b.getAscendant("td",1)||b.getAscendant("th",1)){var c=b.clone();c.appendBogus();d?c.insertBefore(b):c.insertAfter(b)}}function t(e){if(e instanceof CKEDITOR.dom.selection){var e=p(e),d=e[0]&&e[0].getAscendant("table"),b;a:{var c=0;b=e.length-
+1;for(var a={},f,g;f=e[c++];)CKEDITOR.dom.element.setMarker(a,f,"delete_cell",!0);for(c=0;f=e[c++];)if((g=f.getPrevious())&&!g.getCustomData("delete_cell")||(g=f.getNext())&&!g.getCustomData("delete_cell")){CKEDITOR.dom.element.clearAllMarkers(a);b=g;break a}CKEDITOR.dom.element.clearAllMarkers(a);g=e[0].getParent();(g=g.getPrevious())?b=g.getLast():(g=e[b].getParent(),b=(g=g.getNext())?g.getChild(0):null)}for(g=e.length-1;0<=g;g--)t(e[g]);b?m(b,!0):d&&d.remove()}else e instanceof CKEDITOR.dom.element&&
+(d=e.getParent(),1==d.getChildCount()?d.remove():e.remove())}function m(e,d){var b=e.getDocument(),c=CKEDITOR.document;CKEDITOR.env.ie&&10==CKEDITOR.env.version&&(c.focus(),b.focus());b=new CKEDITOR.dom.range(b);if(!b["moveToElementEdit"+(d?"End":"Start")](e))b.selectNodeContents(e),b.collapse(d?!1:!0);b.select(!0)}function v(e,d,b){e=e[d];if("undefined"==typeof b)return e;for(d=0;e&&d<e.length;d++){if(b.is&&e[d]==b.$)return d;if(d==b)return new CKEDITOR.dom.element(e[d])}return b.is?-1:null}function s(e,
+d,b){var c=p(e),a;if((d?1!=c.length:2>c.length)||(a=e.getCommonAncestor())&&a.type==CKEDITOR.NODE_ELEMENT&&a.is("table"))return!1;var f,e=c[0];a=e.getAscendant("table");var g=CKEDITOR.tools.buildTableMap(a),h=g.length,i=g[0].length,j=e.getParent().$.rowIndex,l=v(g,j,e);if(d){var n;try{var m=parseInt(e.getAttribute("rowspan"),10)||1;f=parseInt(e.getAttribute("colspan"),10)||1;n=g["up"==d?j-m:"down"==d?j+m:j]["left"==d?l-f:"right"==d?l+f:l]}catch(z){return!1}if(!n||e.$==n)return!1;c["up"==d||"left"==
+d?"unshift":"push"](new CKEDITOR.dom.element(n))}for(var d=e.getDocument(),o=j,m=n=0,q=!b&&new CKEDITOR.dom.documentFragment(d),s=0,d=0;d<c.length;d++){f=c[d];var k=f.getParent(),t=f.getFirst(),r=f.$.colSpan,u=f.$.rowSpan,k=k.$.rowIndex,w=v(g,k,f),s=s+r*u,m=Math.max(m,w-l+r);n=Math.max(n,k-j+u);if(!b){r=f;(u=r.getBogus())&&u.remove();r.trim();if(f.getChildren().count()){if(k!=o&&t&&(!t.isBlockBoundary||!t.isBlockBoundary({br:1})))(o=q.getLast(CKEDITOR.dom.walker.whitespaces(!0)))&&(!o.is||!o.is("br"))&&
+q.append("br");f.moveChildren(q)}d?f.remove():f.setHtml("")}o=k}if(b)return n*m==s;q.moveChildren(e);e.appendBogus();m>=i?e.removeAttribute("rowSpan"):e.$.rowSpan=n;n>=h?e.removeAttribute("colSpan"):e.$.colSpan=m;b=new CKEDITOR.dom.nodeList(a.$.rows);c=b.count();for(d=c-1;0<=d;d--)a=b.getItem(d),a.$.cells.length||(a.remove(),c++);return e}function w(e,d){var b=p(e);if(1<b.length)return!1;if(d)return!0;var b=b[0],c=b.getParent(),a=c.getAscendant("table"),f=CKEDITOR.tools.buildTableMap(a),g=c.$.rowIndex,
+h=v(f,g,b),i=b.$.rowSpan,j;if(1<i){j=Math.ceil(i/2);for(var i=Math.floor(i/2),c=g+j,a=new CKEDITOR.dom.element(a.$.rows[c]),f=v(f,c),l,c=b.clone(),g=0;g<f.length;g++)if(l=f[g],l.parentNode==a.$&&g>h){c.insertBefore(new CKEDITOR.dom.element(l));break}else l=null;l||a.append(c)}else{i=j=1;a=c.clone();a.insertAfter(c);a.append(c=b.clone());l=v(f,g);for(h=0;h<l.length;h++)l[h].rowSpan++}c.appendBogus();b.$.rowSpan=j;c.$.rowSpan=i;1==j&&b.removeAttribute("rowSpan");1==i&&c.removeAttribute("rowSpan");return c}
+function x(e,d){var b=p(e);if(1<b.length)return!1;if(d)return!0;var b=b[0],c=b.getParent(),a=c.getAscendant("table"),a=CKEDITOR.tools.buildTableMap(a),f=v(a,c.$.rowIndex,b),g=b.$.colSpan;if(1<g)c=Math.ceil(g/2),g=Math.floor(g/2);else{for(var g=c=1,h=[],i=0;i<a.length;i++){var j=a[i];h.push(j[f]);1<j[f].rowSpan&&(i+=j[f].rowSpan-1)}for(a=0;a<h.length;a++)h[a].colSpan++}a=b.clone();a.insertAfter(b);a.appendBogus();b.$.colSpan=c;a.$.colSpan=g;1==c&&b.removeAttribute("colSpan");1==g&&a.removeAttribute("colSpan");
+return a}var y=/^(?:td|th)$/;CKEDITOR.plugins.tabletools={requires:"table,dialog,contextmenu",init:function(e){function d(a){return CKEDITOR.tools.extend(a||{},{contextSensitive:1,refresh:function(a,b){this.setState(b.contains({td:1,th:1},1)?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED)}})}function b(a,b){var c=e.addCommand(a,b);e.addFeature(c)}var c=e.lang.table;b("cellProperties",new CKEDITOR.dialogCommand("cellProperties",d({allowedContent:"td th{width,height,border-color,background-color,white-space,vertical-align,text-align}[colspan,rowspan]",
+requiredContent:"table"})));CKEDITOR.dialog.add("cellProperties",this.path+"dialogs/tableCell.js");b("rowDelete",d({requiredContent:"table",exec:function(a){a=a.getSelection();m(q(a))}}));b("rowInsertBefore",d({requiredContent:"table",exec:function(a){a=a.getSelection();o(a,!0)}}));b("rowInsertAfter",d({requiredContent:"table",exec:function(a){a=a.getSelection();o(a)}}));b("columnDelete",d({requiredContent:"table",exec:function(a){for(var a=a.getSelection(),a=p(a),b=a[0],c=a[a.length-1],a=b.getAscendant("table"),
+d=CKEDITOR.tools.buildTableMap(a),e,j,l=[],n=0,o=d.length;n<o;n++)for(var k=0,q=d[n].length;k<q;k++)d[n][k]==b.$&&(e=k),d[n][k]==c.$&&(j=k);for(n=e;n<=j;n++)for(k=0;k<d.length;k++)c=d[k],b=new CKEDITOR.dom.element(a.$.rows[k]),c=new CKEDITOR.dom.element(c[n]),c.$&&(1==c.$.colSpan?c.remove():c.$.colSpan-=1,k+=c.$.rowSpan-1,b.$.cells.length||l.push(b));j=a.$.rows[0]&&a.$.rows[0].cells;e=new CKEDITOR.dom.element(j[e]||(e?j[e-1]:a.$.parentNode));l.length==o&&a.remove();e&&m(e,!0)}}));b("columnInsertBefore",
+d({requiredContent:"table",exec:function(a){a=a.getSelection();k(a,!0)}}));b("columnInsertAfter",d({requiredContent:"table",exec:function(a){a=a.getSelection();k(a)}}));b("cellDelete",d({requiredContent:"table",exec:function(a){a=a.getSelection();t(a)}}));b("cellMerge",d({allowedContent:"td[colspan,rowspan]",requiredContent:"td[colspan,rowspan]",exec:function(a){m(s(a.getSelection()),!0)}}));b("cellMergeRight",d({allowedContent:"td[colspan]",requiredContent:"td[colspan]",exec:function(a){m(s(a.getSelection(),
+"right"),!0)}}));b("cellMergeDown",d({allowedContent:"td[rowspan]",requiredContent:"td[rowspan]",exec:function(a){m(s(a.getSelection(),"down"),!0)}}));b("cellVerticalSplit",d({allowedContent:"td[rowspan]",requiredContent:"td[rowspan]",exec:function(a){m(w(a.getSelection()))}}));b("cellHorizontalSplit",d({allowedContent:"td[colspan]",requiredContent:"td[colspan]",exec:function(a){m(x(a.getSelection()))}}));b("cellInsertBefore",d({requiredContent:"table",exec:function(a){a=a.getSelection();u(a,!0)}}));
+b("cellInsertAfter",d({requiredContent:"table",exec:function(a){a=a.getSelection();u(a)}}));e.addMenuItems&&e.addMenuItems({tablecell:{label:c.cell.menu,group:"tablecell",order:1,getItems:function(){var a=e.getSelection(),b=p(a);return{tablecell_insertBefore:CKEDITOR.TRISTATE_OFF,tablecell_insertAfter:CKEDITOR.TRISTATE_OFF,tablecell_delete:CKEDITOR.TRISTATE_OFF,tablecell_merge:s(a,null,!0)?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,tablecell_merge_right:s(a,"right",!0)?CKEDITOR.TRISTATE_OFF:
+CKEDITOR.TRISTATE_DISABLED,tablecell_merge_down:s(a,"down",!0)?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,tablecell_split_vertical:w(a,!0)?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,tablecell_split_horizontal:x(a,!0)?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,tablecell_properties:0<b.length?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED}}},tablecell_insertBefore:{label:c.cell.insertBefore,group:"tablecell",command:"cellInsertBefore",order:5},tablecell_insertAfter:{label:c.cell.insertAfter,
+group:"tablecell",command:"cellInsertAfter",order:10},tablecell_delete:{label:c.cell.deleteCell,group:"tablecell",command:"cellDelete",order:15},tablecell_merge:{label:c.cell.merge,group:"tablecell",command:"cellMerge",order:16},tablecell_merge_right:{label:c.cell.mergeRight,group:"tablecell",command:"cellMergeRight",order:17},tablecell_merge_down:{label:c.cell.mergeDown,group:"tablecell",command:"cellMergeDown",order:18},tablecell_split_horizontal:{label:c.cell.splitHorizontal,group:"tablecell",
+command:"cellHorizontalSplit",order:19},tablecell_split_vertical:{label:c.cell.splitVertical,group:"tablecell",command:"cellVerticalSplit",order:20},tablecell_properties:{label:c.cell.title,group:"tablecellproperties",command:"cellProperties",order:21},tablerow:{label:c.row.menu,group:"tablerow",order:1,getItems:function(){return{tablerow_insertBefore:CKEDITOR.TRISTATE_OFF,tablerow_insertAfter:CKEDITOR.TRISTATE_OFF,tablerow_delete:CKEDITOR.TRISTATE_OFF}}},tablerow_insertBefore:{label:c.row.insertBefore,
+group:"tablerow",command:"rowInsertBefore",order:5},tablerow_insertAfter:{label:c.row.insertAfter,group:"tablerow",command:"rowInsertAfter",order:10},tablerow_delete:{label:c.row.deleteRow,group:"tablerow",command:"rowDelete",order:15},tablecolumn:{label:c.column.menu,group:"tablecolumn",order:1,getItems:function(){return{tablecolumn_insertBefore:CKEDITOR.TRISTATE_OFF,tablecolumn_insertAfter:CKEDITOR.TRISTATE_OFF,tablecolumn_delete:CKEDITOR.TRISTATE_OFF}}},tablecolumn_insertBefore:{label:c.column.insertBefore,
+group:"tablecolumn",command:"columnInsertBefore",order:5},tablecolumn_insertAfter:{label:c.column.insertAfter,group:"tablecolumn",command:"columnInsertAfter",order:10},tablecolumn_delete:{label:c.column.deleteColumn,group:"tablecolumn",command:"columnDelete",order:15}});e.contextMenu&&e.contextMenu.addListener(function(a,b,c){return(a=c.contains({td:1,th:1},1))&&!a.isReadOnly()?{tablecell:CKEDITOR.TRISTATE_OFF,tablerow:CKEDITOR.TRISTATE_OFF,tablecolumn:CKEDITOR.TRISTATE_OFF}:null})},getSelectedCells:p};
+CKEDITOR.plugins.add("tabletools",CKEDITOR.plugins.tabletools)})();CKEDITOR.tools.buildTableMap=function(p){for(var p=p.$.rows,o=-1,q=[],r=0;r<p.length;r++){o++;!q[o]&&(q[o]=[]);for(var k=-1,u=0;u<p[r].cells.length;u++){var t=p[r].cells[u];for(k++;q[o][k];)k++;for(var m=isNaN(t.colSpan)?1:t.colSpan,t=isNaN(t.rowSpan)?1:t.rowSpan,v=0;v<t;v++){q[o+v]||(q[o+v]=[]);for(var s=0;s<m;s++)q[o+v][k+s]=p[r].cells[u]}k+=m-1}}return q};(function(){var g=[CKEDITOR.CTRL+90,CKEDITOR.CTRL+89,CKEDITOR.CTRL+CKEDITOR.SHIFT+90],l={8:1,46:1};CKEDITOR.plugins.add("undo",{init:function(a){function b(a){d.enabled&&!1!==a.data.command.canUndo&&d.save()}function c(){d.enabled=a.readOnly?!1:"wysiwyg"==a.mode;d.onChange()}var d=a.undoManager=new e(a),j=d.editingHandler=new i(d),f=a.addCommand("undo",{exec:function(){d.undo()&&(a.selectionChange(),this.fire("afterUndo"))},startDisabled:!0,canUndo:!1}),h=a.addCommand("redo",{exec:function(){d.redo()&&
+(a.selectionChange(),this.fire("afterRedo"))},startDisabled:!0,canUndo:!1});a.setKeystroke([[g[0],"undo"],[g[1],"redo"],[g[2],"redo"]]);d.onChange=function(){f.setState(d.undoable()?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED);h.setState(d.redoable()?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED)};a.on("beforeCommandExec",b);a.on("afterCommandExec",b);a.on("saveSnapshot",function(a){d.save(a.data&&a.data.contentOnly)});a.on("contentDom",j.attachListeners,j);a.on("instanceReady",function(){a.fire("saveSnapshot")});
+a.on("beforeModeUnload",function(){"wysiwyg"==a.mode&&d.save(!0)});a.on("mode",c);a.on("readOnly",c);a.ui.addButton&&(a.ui.addButton("Undo",{label:a.lang.undo.undo,command:"undo",toolbar:"undo,10"}),a.ui.addButton("Redo",{label:a.lang.undo.redo,command:"redo",toolbar:"undo,20"}));a.resetUndo=function(){d.reset();a.fire("saveSnapshot")};a.on("updateSnapshot",function(){d.currentImage&&d.update()});a.on("lockSnapshot",function(a){a=a.data;d.lock(a&&a.dontUpdate,a&&a.forceUpdate)});a.on("unlockSnapshot",
+d.unlock,d)}});CKEDITOR.plugins.undo={};var e=CKEDITOR.plugins.undo.UndoManager=function(a){this.strokesRecorded=[0,0];this.locked=null;this.previousKeyGroup=-1;this.limit=a.config.undoStackSize||20;this.strokesLimit=25;this.editor=a;this.reset()};e.prototype={type:function(a,b){var c=e.getKeyGroup(a),d=this.strokesRecorded[c]+1,b=b||d>=this.strokesLimit;this.typing||(this.hasUndo=this.typing=!0,this.hasRedo=!1,this.onChange());b?(d=0,this.editor.fire("saveSnapshot")):this.editor.fire("change");this.strokesRecorded[c]=
+d;this.previousKeyGroup=c},keyGroupChanged:function(a){return e.getKeyGroup(a)!=this.previousKeyGroup},reset:function(){this.snapshots=[];this.index=-1;this.currentImage=null;this.hasRedo=this.hasUndo=!1;this.locked=null;this.resetType()},resetType:function(){this.strokesRecorded=[0,0];this.typing=!1;this.previousKeyGroup=-1},refreshState:function(){this.hasUndo=!!this.getNextImage(!0);this.hasRedo=!!this.getNextImage(!1);this.resetType();this.onChange()},save:function(a,b,c){var d=this.editor;if(this.locked||
+"ready"!=d.status||"wysiwyg"!=d.mode)return!1;var e=d.editable();if(!e||"ready"!=e.status)return!1;e=this.snapshots;b||(b=new f(d));if(!1===b.contents)return!1;if(this.currentImage)if(b.equalsContent(this.currentImage)){if(a||b.equalsSelection(this.currentImage))return!1}else!1!==c&&d.fire("change");e.splice(this.index+1,e.length-this.index-1);e.length==this.limit&&e.shift();this.index=e.push(b)-1;this.currentImage=b;!1!==c&&this.refreshState();return!0},restoreImage:function(a){var b=this.editor,
+c;a.bookmarks&&(b.focus(),c=b.getSelection());this.locked={level:999};this.editor.loadSnapshot(a.contents);a.bookmarks?c.selectBookmarks(a.bookmarks):CKEDITOR.env.ie&&(c=this.editor.document.getBody().$.createTextRange(),c.collapse(!0),c.select());this.locked=null;this.index=a.index;this.currentImage=this.snapshots[this.index];this.update();this.refreshState();b.fire("change")},getNextImage:function(a){var b=this.snapshots,c=this.currentImage,d;if(c)if(a)for(d=this.index-1;0<=d;d--){if(a=b[d],!c.equalsContent(a))return a.index=
+d,a}else for(d=this.index+1;d<b.length;d++)if(a=b[d],!c.equalsContent(a))return a.index=d,a;return null},redoable:function(){return this.enabled&&this.hasRedo},undoable:function(){return this.enabled&&this.hasUndo},undo:function(){if(this.undoable()){this.save(!0);var a=this.getNextImage(!0);if(a)return this.restoreImage(a),!0}return!1},redo:function(){if(this.redoable()&&(this.save(!0),this.redoable())){var a=this.getNextImage(!1);if(a)return this.restoreImage(a),!0}return!1},update:function(a){if(!this.locked){a||
+(a=new f(this.editor));for(var b=this.index,c=this.snapshots;0<b&&this.currentImage.equalsContent(c[b-1]);)b-=1;c.splice(b,this.index-b+1,a);this.index=b;this.currentImage=a}},updateSelection:function(a){if(!this.snapshots.length)return!1;var b=this.snapshots,c=b[b.length-1];return c.equalsContent(a)&&!c.equalsSelection(a)?(this.currentImage=b[b.length-1]=a,!0):!1},lock:function(a,b){if(this.locked)this.locked.level++;else if(a)this.locked={level:1};else{var c=null;if(b)c=!0;else{var d=new f(this.editor,
+!0);this.currentImage&&this.currentImage.equalsContent(d)&&(c=d)}this.locked={update:c,level:1}}},unlock:function(){if(this.locked&&!--this.locked.level){var a=this.locked.update;this.locked=null;if(!0===a)this.update();else if(a){var b=new f(this.editor,!0);a.equalsContent(b)||this.update()}}}};e.navigationKeyCodes={37:1,38:1,39:1,40:1,36:1,35:1,33:1,34:1};e.keyGroups={PRINTABLE:0,FUNCTIONAL:1};e.isNavigationKey=function(a){return!!e.navigationKeyCodes[a]};e.getKeyGroup=function(a){var b=e.keyGroups;
+return l[a]?b.FUNCTIONAL:b.PRINTABLE};e.getOppositeKeyGroup=function(a){var b=e.keyGroups;return a==b.FUNCTIONAL?b.PRINTABLE:b.FUNCTIONAL};e.ieFunctionalKeysBug=function(a){return CKEDITOR.env.ie&&e.getKeyGroup(a)==e.keyGroups.FUNCTIONAL};var f=CKEDITOR.plugins.undo.Image=function(a,b){this.editor=a;a.fire("beforeUndoImage");var c=a.getSnapshot();CKEDITOR.env.ie&&c&&(c=c.replace(/\s+data-cke-expando=".*?"/g,""));this.contents=c;b||(this.bookmarks=(c=c&&a.getSelection())&&c.createBookmarks2(!0));a.fire("afterUndoImage")},
+h=/\b(?:href|src|name)="[^"]*?"/gi;f.prototype={equalsContent:function(a){var b=this.contents,a=a.contents;if(CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.quirks))b=b.replace(h,""),a=a.replace(h,"");return b!=a?!1:!0},equalsSelection:function(a){var b=this.bookmarks,a=a.bookmarks;if(b||a){if(!b||!a||b.length!=a.length)return!1;for(var c=0;c<b.length;c++){var d=b[c],e=a[c];if(d.startOffset!=e.startOffset||d.endOffset!=e.endOffset||!CKEDITOR.tools.arrayCompare(d.start,e.start)||!CKEDITOR.tools.arrayCompare(d.end,
+e.end))return!1}}return!0}};var i=CKEDITOR.plugins.undo.NativeEditingHandler=function(a){this.undoManager=a;this.ignoreInputEvent=!1;this.keyEventsStack=new k;this.lastKeydownImage=null};i.prototype={onKeydown:function(a){var b=a.data.getKey();if(229!==b)if(-1<CKEDITOR.tools.indexOf(g,a.data.getKeystroke()))a.data.preventDefault();else if(this.keyEventsStack.cleanUp(a),a=this.undoManager,this.keyEventsStack.getLast(b)||this.keyEventsStack.push(b),this.lastKeydownImage=new f(a.editor),e.isNavigationKey(b)||
+this.undoManager.keyGroupChanged(b))if(a.strokesRecorded[0]||a.strokesRecorded[1])a.save(!1,this.lastKeydownImage,!1),a.resetType()},onInput:function(){if(this.ignoreInputEvent)this.ignoreInputEvent=!1;else{var a=this.keyEventsStack.getLast();a||(a=this.keyEventsStack.push(0));this.keyEventsStack.increment(a.keyCode);this.keyEventsStack.getTotalInputs()>=this.undoManager.strokesLimit&&(this.undoManager.type(a.keyCode,!0),this.keyEventsStack.resetInputs())}},onKeyup:function(a){var b=this.undoManager,
+a=a.data.getKey(),c=this.keyEventsStack.getTotalInputs();this.keyEventsStack.remove(a);if(!e.ieFunctionalKeysBug(a)||!this.lastKeydownImage||!this.lastKeydownImage.equalsContent(new f(b.editor,!0)))if(0<c)b.type(a);else if(e.isNavigationKey(a))this.onNavigationKey(!0)},onNavigationKey:function(a){var b=this.undoManager;(a||!b.save(!0,null,!1))&&b.updateSelection(new f(b.editor));b.resetType()},ignoreInputEventListener:function(){this.ignoreInputEvent=!0},attachListeners:function(){var a=this.undoManager.editor,
+b=a.editable(),c=this;b.attachListener(b,"keydown",function(a){c.onKeydown(a);if(e.ieFunctionalKeysBug(a.data.getKey()))c.onInput()},null,null,999);b.attachListener(b,CKEDITOR.env.ie?"keypress":"input",c.onInput,c,null,999);b.attachListener(b,"keyup",c.onKeyup,c,null,999);b.attachListener(b,"paste",c.ignoreInputEventListener,c,null,999);b.attachListener(b,"drop",c.ignoreInputEventListener,c,null,999);b.attachListener(b.isInline()?b:a.document.getDocumentElement(),"click",function(){c.onNavigationKey()},
+null,null,999);b.attachListener(this.undoManager.editor,"blur",function(){c.keyEventsStack.remove(9)},null,null,999)}};var k=CKEDITOR.plugins.undo.KeyEventsStack=function(){this.stack=[]};k.prototype={push:function(a){return this.stack[this.stack.push({keyCode:a,inputs:0})-1]},getLastIndex:function(a){if("number"!=typeof a)return this.stack.length-1;for(var b=this.stack.length;b--;)if(this.stack[b].keyCode==a)return b;return-1},getLast:function(a){a=this.getLastIndex(a);return-1!=a?this.stack[a]:
+null},increment:function(a){this.getLast(a).inputs++},remove:function(a){a=this.getLastIndex(a);-1!=a&&this.stack.splice(a,1)},resetInputs:function(a){if("number"==typeof a)this.getLast(a).inputs=0;else for(a=this.stack.length;a--;)this.stack[a].inputs=0},getTotalInputs:function(){for(var a=this.stack.length,b=0;a--;)b+=this.stack[a].inputs;return b},cleanUp:function(a){a=a.data.$;!a.ctrlKey&&!a.metaKey&&this.remove(17);a.shiftKey||this.remove(16);a.altKey||this.remove(18)}}})();CKEDITOR.plugins.add("wsc",{requires:"dialog",parseApi:function(a){a.config.wsc_onFinish="function"===typeof a.config.wsc_onFinish?a.config.wsc_onFinish:function(){};a.config.wsc_onClose="function"===typeof a.config.wsc_onClose?a.config.wsc_onClose:function(){}},parseConfig:function(a){a.config.wsc_customerId=a.config.wsc_customerId||CKEDITOR.config.wsc_customerId||"1:ua3xw1-2XyGJ3-GWruD3-6OFNT1-oXcuB1-nR6Bp4-hgQHc-EcYng3-sdRXG3-NOfFk";a.config.wsc_customDictionaryIds=a.config.wsc_customDictionaryIds||
+CKEDITOR.config.wsc_customDictionaryIds||"";a.config.wsc_userDictionaryName=a.config.wsc_userDictionaryName||CKEDITOR.config.wsc_userDictionaryName||"";a.config.wsc_customLoaderScript=a.config.wsc_customLoaderScript||CKEDITOR.config.wsc_customLoaderScript;CKEDITOR.config.wsc_cmd=a.config.wsc_cmd||CKEDITOR.config.wsc_cmd||"spell";CKEDITOR.config.wsc_version="v4.3.0-26-g5bcf855";CKEDITOR.config.wsc_removeGlobalVariable=!0},init:function(a){var b=CKEDITOR.env;this.parseConfig(a);this.parseApi(a);a.addCommand("checkspell",
+new CKEDITOR.dialogCommand("checkspell")).modes={wysiwyg:!CKEDITOR.env.opera&&!CKEDITOR.env.air&&document.domain==window.location.hostname&&!(b.ie&&(8>b.version||b.quirks))};"undefined"==typeof a.plugins.scayt&&a.ui.addButton&&a.ui.addButton("SpellChecker",{label:a.lang.wsc.toolbar,click:function(a){var b=a.elementMode==CKEDITOR.ELEMENT_MODE_INLINE?a.container.getText():a.document.getBody().getText();(b=b.replace(/\s/g,""))?a.execCommand("checkspell"):alert("Nothing to check!")},toolbar:"spellchecker,10"});
+CKEDITOR.dialog.add("checkspell",this.path+(CKEDITOR.env.ie&&7>=CKEDITOR.env.version?"dialogs/wsc_ie.js":window.postMessage?"dialogs/wsc.js":"dialogs/wsc_ie.js"))}});CKEDITOR.config.plugins='dialogui,dialog,about,a11yhelp,basicstyles,blockquote,clipboard,panel,floatpanel,menu,contextmenu,resize,button,toolbar,elementspath,enterkey,entities,popup,filebrowser,floatingspace,listblock,richcombo,format,horizontalrule,htmlwriter,wysiwygarea,image,indent,indentlist,fakeobjects,link,list,magicline,maximize,pastetext,pastefromword,removeformat,showborders,sourcearea,specialchar,menubutton,scayt,stylescombo,tab,table,tabletools,undo,wsc';CKEDITOR.config.skin='moono';(function() {var setIcons = function(icons, strip) {var path = CKEDITOR.getUrl( 'plugins/' + strip );icons = icons.split( ',' );for ( var i = 0; i < icons.length; i++ )CKEDITOR.skin.icons[ icons[ i ] ] = { path: path, offset: -icons[ ++i ], bgsize : icons[ ++i ] };};if (CKEDITOR.env.hidpi) setIcons('about,0,,bold,24,,italic,48,,strike,72,,subscript,96,,superscript,120,,underline,144,,blockquote,168,,copy-rtl,192,,copy,216,,cut-rtl,240,,cut,264,,paste-rtl,288,,paste,312,,horizontalrule,336,,image,360,,indent-rtl,384,,indent,408,,outdent-rtl,432,,outdent,456,,anchor-rtl,480,,anchor,504,,link,528,,unlink,552,,bulletedlist-rtl,576,,bulletedlist,600,,numberedlist-rtl,624,,numberedlist,648,,maximize,672,,pastetext-rtl,696,,pastetext,720,,pastefromword-rtl,744,,pastefromword,768,,removeformat,792,,source-rtl,816,,source,840,,specialchar,864,,scayt,888,,table,912,,redo-rtl,936,,redo,960,,undo-rtl,984,,undo,1008,,spellchecker,1032,','icons_hidpi.png');else setIcons('about,0,auto,bold,24,auto,italic,48,auto,strike,72,auto,subscript,96,auto,superscript,120,auto,underline,144,auto,blockquote,168,auto,copy-rtl,192,auto,copy,216,auto,cut-rtl,240,auto,cut,264,auto,paste-rtl,288,auto,paste,312,auto,horizontalrule,336,auto,image,360,auto,indent-rtl,384,auto,indent,408,auto,outdent-rtl,432,auto,outdent,456,auto,anchor-rtl,480,auto,anchor,504,auto,link,528,auto,unlink,552,auto,bulletedlist-rtl,576,auto,bulletedlist,600,auto,numberedlist-rtl,624,auto,numberedlist,648,auto,maximize,672,auto,pastetext-rtl,696,auto,pastetext,720,auto,pastefromword-rtl,744,auto,pastefromword,768,auto,removeformat,792,auto,source-rtl,816,auto,source,840,auto,specialchar,864,auto,scayt,888,auto,table,912,auto,redo-rtl,936,auto,redo,960,auto,undo-rtl,984,auto,undo,1008,auto,spellchecker,1032,auto','icons.png');})();CKEDITOR.lang.languages={"af":1,"sq":1,"ar":1,"eu":1,"bn":1,"bs":1,"bg":1,"ca":1,"zh-cn":1,"zh":1,"hr":1,"cs":1,"da":1,"nl":1,"en":1,"en-au":1,"en-ca":1,"en-gb":1,"eo":1,"et":1,"fo":1,"fi":1,"fr":1,"fr-ca":1,"gl":1,"ka":1,"de":1,"el":1,"gu":1,"he":1,"hi":1,"hu":1,"is":1,"id":1,"it":1,"ja":1,"km":1,"ko":1,"ku":1,"lv":1,"lt":1,"mk":1,"ms":1,"mn":1,"no":1,"nb":1,"fa":1,"pl":1,"pt-br":1,"pt":1,"ro":1,"ru":1,"sr":1,"sr-latn":1,"si":1,"sk":1,"sl":1,"es":1,"sv":1,"tt":1,"th":1,"tr":1,"ug":1,"uk":1,"vi":1,"cy":1};}()); \ No newline at end of file
diff --git a/js/ckeditor/config.js b/js/ckeditor/config.js
new file mode 100644
index 0000000..9de2f1a
--- /dev/null
+++ b/js/ckeditor/config.js
@@ -0,0 +1,38 @@
+/**
+ * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md or http://ckeditor.com/license
+ */
+
+CKEDITOR.editorConfig = function( config ) {
+ // Define changes to default configuration here.
+ // For complete reference see:
+ // http://docs.ckeditor.com/#!/api/CKEDITOR.config
+
+ // The toolbar groups arrangement, optimized for two toolbar rows.
+ config.toolbarGroups = [
+ { name: 'clipboard', groups: [ 'clipboard', 'undo' ] },
+ { name: 'editing', groups: [ 'find', 'selection', 'spellchecker' ] },
+ { name: 'links' },
+ { name: 'insert' },
+ { name: 'forms' },
+ { name: 'tools' },
+ { name: 'document', groups: [ 'mode', 'document', 'doctools' ] },
+ { name: 'others' },
+ '/',
+ { name: 'basicstyles', groups: [ 'basicstyles', 'cleanup' ] },
+ { name: 'paragraph', groups: [ 'list', 'indent', 'blocks', 'align', 'bidi' ] },
+ { name: 'styles' },
+ { name: 'colors' },
+ { name: 'about' }
+ ];
+
+ // Remove some buttons provided by the standard plugins, which are
+ // not needed in the Standard(s) toolbar.
+ config.removeButtons = 'Underline,Subscript,Superscript';
+
+ // Set the most common block elements.
+ config.format_tags = 'p;h1;h2;h3;pre';
+
+ // Simplify the dialog windows.
+ config.removeDialogTabs = 'image:advanced;link:advanced';
+};
diff --git a/js/ckeditor/contents.css b/js/ckeditor/contents.css
new file mode 100644
index 0000000..b0efb0c
--- /dev/null
+++ b/js/ckeditor/contents.css
@@ -0,0 +1,134 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+
+body
+{
+ /* Font */
+ font-family: sans-serif, Arial, Verdana, "Trebuchet MS";
+ font-size: 12px;
+
+ /* Text color */
+ color: #333;
+
+ /* Remove the background color to make it transparent */
+ background-color: #fff;
+
+ margin: 20px;
+}
+
+.cke_editable
+{
+ font-size: 13px;
+ line-height: 1.6;
+}
+
+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;
+}
+
+a
+{
+ color: #0782C1;
+}
+
+ol,ul,dl
+{
+ /* IE7: reset rtl list margin. (#7334) */
+ *margin-right: 0px;
+ /* preserved spaces for list items with text direction other than the list. (#6249,#8049)*/
+ padding: 0 40px;
+}
+
+h1,h2,h3,h4,h5,h6
+{
+ font-weight: normal;
+ line-height: 1.2;
+}
+
+hr
+{
+ border: 0px;
+ border-top: 1px solid #ccc;
+}
+
+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;
+}
+
+pre
+{
+ white-space: pre-wrap; /* CSS 2.1 */
+ word-wrap: break-word; /* IE7 */
+ -moz-tab-size: 4;
+ -o-tab-size: 4;
+ -webkit-tab-size: 4;
+ tab-size: 4;
+}
+
+.marker
+{
+ background-color: Yellow;
+}
+
+span[lang]
+{
+ font-style: italic;
+}
+
+figure
+{
+ text-align: center;
+ border: solid 1px #ccc;
+ border-radius: 2px;
+ background: rgba(0,0,0,0.05);
+ padding: 10px;
+ margin: 10px 20px;
+ display: inline-block;
+}
+
+figure > figcaption
+{
+ text-align: center;
+ display: block; /* For IE8 */
+}
+
+a > img {
+ padding: 1px;
+ margin: 1px;
+ border: none;
+ outline: 1px solid #0782C1;
+}
diff --git a/js/ckeditor/lang/af.js b/js/ckeditor/lang/af.js
new file mode 100644
index 0000000..c04d6d8
--- /dev/null
+++ b/js/ckeditor/lang/af.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['af']={"editor":"Woordverwerker","editorPanel":"Woordverwerkerpaneel","common":{"editorHelp":"Druk op ALT 0 vir hulp","browseServer":"Blaai op bediener","url":"URL","protocol":"Protokol","upload":"Oplaai","uploadSubmit":"Stuur aan die bediener","image":"Beeld","flash":"Flash","form":"Vorm","checkbox":"Merkhokkie","radio":"Radioknoppie","textField":"Teksveld","textarea":"Teksarea","hiddenField":"Versteekteveld","button":"Knop","select":"Keuseveld","imageButton":"Beeldknop","notSet":"<geen instelling>","id":"Id","name":"Naam","langDir":"Skryfrigting","langDirLtr":"Links na regs (LTR)","langDirRtl":"Regs na links (RTL)","langCode":"Taalkode","longDescr":"Lang beskrywing URL","cssClass":"CSS klasse","advisoryTitle":"Aanbevole titel","cssStyle":"Styl","ok":"OK","cancel":"Kanselleer","close":"Sluit","preview":"Voorbeeld","resize":"Skalierung","generalTab":"Algemeen","advancedTab":"Gevorderd","validateNumberFailed":"Hierdie waarde is nie 'n nommer nie.","confirmNewPage":"Alle wysiginge sal verlore gaan. Is jy seker dat jy 'n nuwe bladsy wil laai?","confirmCancel":"Sommige opsies is gewysig. Is jy seker dat jy hierdie dialoogvenster wil sluit?","options":"Opsies","target":"Teiken","targetNew":"Nuwe venster (_blank)","targetTop":"Boonste venster (_top)","targetSelf":"Selfde venster (_self)","targetParent":"Oorspronklike venster (_parent)","langDirLTR":"Links na Regs (LTR)","langDirRTL":"Regs na Links (RTL)","styles":"Styl","cssClasses":"CSS klasse","width":"Breedte","height":"Hoogte","align":"Orienteerung","alignLeft":"Links","alignRight":"Regs","alignCenter":"Middel","alignJustify":"Eweredig","alignTop":"Bo","alignMiddle":"Middel","alignBottom":"Onder","alignNone":"Geen","invalidValue":"Ongeldige waarde","invalidHeight":"Hoogte moet 'n getal wees","invalidWidth":"Breedte moet 'n getal wees.","invalidCssLength":"Die waarde vir die \"%1\" veld moet 'n posetiewe getal wees met of sonder 'n geldige CSS eenheid (px, %, in, cm, mm, em, ex, pt, of pc).","invalidHtmlLength":"Die waarde vir die \"%1\" veld moet 'n posetiewe getal wees met of sonder 'n geldige HTML eenheid (px of %).","invalidInlineStyle":"Ongeldige CSS. Formaat is een of meer sleutel-wert paare, \"naam : wert\" met kommapunte gesky.","cssLengthTooltip":"Voeg 'n getal wert in pixel in, of 'n waarde met geldige CSS eenheid (px, %, in, cm, mm, em, ex, pt, of pc).","unavailable":"%1<span class=\"cke_accessibility\">, nie beskikbaar nie</span>"},"about":{"copy":"Kopiereg &copy; $1. Alle regte voorbehou.","dlgTitle":"Meer oor CKEditor","help":"Slaan $1 na vir hulp.","moreInfo":"Vir lisensie-informasie, besoek asb. ons webwerf:","title":"Meer oor CKEditor","userGuide":"CKEditor Gebruikers gits"},"basicstyles":{"bold":"Vet","italic":"Skuins","strike":"Deurgestreep","subscript":"Onderskrif","superscript":"Bo-skrif","underline":"Onderstreep"},"blockquote":{"toolbar":"Sitaatblok"},"clipboard":{"copy":"KopiĂ«er","copyError":"U blaaier se sekuriteitsinstelling belet die kopiĂ«ringsaksie. Gebruik die sleutelbordkombinasie (Ctrl/Cmd+C).","cut":"Knip","cutError":"U blaaier se sekuriteitsinstelling belet die outomatiese knip-aksie. Gebruik die sleutelbordkombinasie (Ctrl/Cmd+X).","paste":"Plak","pasteArea":"Plak-area","pasteMsg":"Plak die teks in die volgende teks-area met die sleutelbordkombinasie (<STRONG>Ctrl/Cmd+V</STRONG>) en druk <STRONG>OK</STRONG>.","securityMsg":"Weens u blaaier se sekuriteitsinstelling is data op die knipbord nie toeganklik nie. U kan dit eers weer in hierdie venster plak.","title":"Byvoeg"},"contextmenu":{"options":"Konteks Spyskaart-opsies"},"button":{"selectedLabel":"%1 uitgekies"},"toolbar":{"toolbarCollapse":"Verklein werkbalk","toolbarExpand":"Vergroot werkbalk","toolbarGroups":{"document":"Dokument","clipboard":"Knipbord/Undo","editing":"Verander","forms":"Vorms","basicstyles":"Eenvoudige Styl","paragraph":"Paragraaf","links":"Skakels","insert":"Toevoeg","styles":"Style","colors":"Kleure","tools":"Gereedskap"},"toolbars":"Werkbalke"},"elementspath":{"eleLabel":"Elemente-pad","eleTitle":"%1 element"},"format":{"label":"Opmaak","panelTitle":"Opmaak","tag_address":"Adres","tag_div":"Normaal (DIV)","tag_h1":"Opskrif 1","tag_h2":"Opskrif 2","tag_h3":"Opskrif 3","tag_h4":"Opskrif 4","tag_h5":"Opskrif 5","tag_h6":"Opskrif 6","tag_p":"Normaal","tag_pre":"Opgemaak"},"horizontalrule":{"toolbar":"Horisontale lyn invoeg"},"image":{"alertUrl":"Gee URL van afbeelding.","alt":"Alternatiewe teks","border":"Rand","btnUpload":"Stuur na bediener","button2Img":"Wil u die geselekteerde afbeeldingsknop vervang met 'n eenvoudige afbeelding?","hSpace":"HSpasie","img2Button":"Wil u die geselekteerde afbeelding vervang met 'n afbeeldingsknop?","infoTab":"Afbeelding informasie","linkTab":"Skakel","lockRatio":"Vaste proporsie","menu":"Afbeelding eienskappe","resetSize":"Herstel grootte","title":"Afbeelding eienskappe","titleButton":"Afbeeldingsknop eienskappe","upload":"Oplaai","urlMissing":"Die URL na die afbeelding ontbreek.","vSpace":"VSpasie","validateBorder":"Rand moet 'n heelgetal wees.","validateHSpace":"HSpasie moet 'n heelgetal wees.","validateVSpace":"VSpasie moet 'n heelgetal wees."},"indent":{"indent":"Vergroot inspring","outdent":"Verklein inspring"},"fakeobjects":{"anchor":"Anker","flash":"Flash animasie","hiddenfield":"Verborge veld","iframe":"IFrame","unknown":"Onbekende objek"},"link":{"acccessKey":"Toegangsleutel","advanced":"Gevorderd","advisoryContentType":"Aanbevole inhoudstipe","advisoryTitle":"Aanbevole titel","anchor":{"toolbar":"Anker byvoeg/verander","menu":"Anker-eienskappe","title":"Anker-eienskappe","name":"Ankernaam","errorName":"Voltooi die ankernaam asseblief","remove":"Remove Anchor"},"anchorId":"Op element Id","anchorName":"Op ankernaam","charset":"Karakterstel van geskakelde bron","cssClasses":"CSS klasse","emailAddress":"E-posadres","emailBody":"Berig-inhoud","emailSubject":"Berig-onderwerp","id":"Id","info":"Skakel informasie","langCode":"Taalkode","langDir":"Skryfrigting","langDirLTR":"Links na regs (LTR)","langDirRTL":"Regs na links (RTL)","menu":"Wysig skakel","name":"Naam","noAnchors":"(Geen ankers beskikbaar in dokument)","noEmail":"Gee die e-posadres","noUrl":"Gee die skakel se URL","other":"<ander>","popupDependent":"Afhanklik (Netscape)","popupFeatures":"Eienskappe van opspringvenster","popupFullScreen":"Volskerm (IE)","popupLeft":"Posisie links","popupLocationBar":"Adresbalk","popupMenuBar":"Spyskaartbalk","popupResizable":"Herskaalbaar","popupScrollBars":"Skuifbalke","popupStatusBar":"Statusbalk","popupToolbar":"Werkbalk","popupTop":"Posisie bo","rel":"Relationship","selectAnchor":"Kies 'n anker","styles":"Styl","tabIndex":"Tab indeks","target":"Doel","targetFrame":"<raam>","targetFrameName":"Naam van doelraam","targetPopup":"<opspringvenster>","targetPopupName":"Naam van opspringvenster","title":"Skakel","toAnchor":"Anker in bladsy","toEmail":"E-pos","toUrl":"URL","toolbar":"Skakel invoeg/wysig","type":"Skakelsoort","unlink":"Verwyder skakel","upload":"Oplaai"},"list":{"bulletedlist":"Ongenommerde lys","numberedlist":"Genommerde lys"},"magicline":{"title":"Voeg paragraaf hier in"},"maximize":{"maximize":"Maksimaliseer","minimize":"Minimaliseer"},"pastetext":{"button":"Plak as eenvoudige teks","title":"Plak as eenvoudige teks"},"pastefromword":{"confirmCleanup":"Die teks wat u wil plak lyk asof dit uit Word gekopiĂ«er is. Wil u dit eers skoonmaak voordat dit geplak word?","error":"Die geplakte teks kon nie skoongemaak word nie, weens 'n interne fout","title":"Plak vanuit Word","toolbar":"Plak vanuit Word"},"removeformat":{"toolbar":"Verwyder opmaak"},"sourcearea":{"toolbar":"Bron"},"specialchar":{"options":"Spesiale karakter-opsies","title":"Kies spesiale karakter","toolbar":"Voeg spesiaale karakter in"},"scayt":{"btn_about":"SCAYT info","btn_dictionaries":"Woordeboeke","btn_disable":"SCAYT af","btn_enable":"SCAYT aan","btn_langs":"Tale","btn_options":"Opsies","text_title":"Speltoets terwyl u tik"},"stylescombo":{"label":"Styl","panelTitle":"Vormaat style","panelTitle1":"Blok style","panelTitle2":"Inlyn style","panelTitle3":"Objek style"},"table":{"border":"Randbreedte","caption":"Naam","cell":{"menu":"Sel","insertBefore":"Voeg sel in voor","insertAfter":"Voeg sel in na","deleteCell":"Verwyder sel","merge":"Voeg selle saam","mergeRight":"Voeg saam na regs","mergeDown":"Voeg saam ondertoe","splitHorizontal":"Splits sel horisontaal","splitVertical":"Splits sel vertikaal","title":"Sel eienskappe","cellType":"Sel tipe","rowSpan":"Omspan rye","colSpan":"Omspan kolomme","wordWrap":"Woord terugloop","hAlign":"Horisontale oplyning","vAlign":"Vertikale oplyning","alignBaseline":"Basislyn","bgColor":"Agtergrondkleur","borderColor":"Randkleur","data":"Inhoud","header":"Opskrif","yes":"Ja","no":"Nee","invalidWidth":"Selbreedte moet 'n getal wees.","invalidHeight":"Selhoogte moet 'n getal wees.","invalidRowSpan":"Omspan rye moet 'n heelgetal wees.","invalidColSpan":"Omspan kolomme moet 'n heelgetal wees.","chooseColor":"Kies"},"cellPad":"Sel-spasie","cellSpace":"Sel-afstand","column":{"menu":"Kolom","insertBefore":"Voeg kolom in voor","insertAfter":"Voeg kolom in na","deleteColumn":"Verwyder kolom"},"columns":"Kolomme","deleteTable":"Verwyder tabel","headers":"Opskrifte","headersBoth":"Beide ","headersColumn":"Eerste kolom","headersNone":"Geen","headersRow":"Eerste ry","invalidBorder":"Randbreedte moet 'n getal wees.","invalidCellPadding":"Sel-spasie moet 'n getal wees.","invalidCellSpacing":"Sel-afstand moet 'n getal wees.","invalidCols":"Aantal kolomme moet 'n getal groter as 0 wees.","invalidHeight":"Tabelhoogte moet 'n getal wees.","invalidRows":"Aantal rye moet 'n getal groter as 0 wees.","invalidWidth":"Tabelbreedte moet 'n getal wees.","menu":"Tabel eienskappe","row":{"menu":"Ry","insertBefore":"Voeg ry in voor","insertAfter":"Voeg ry in na","deleteRow":"Verwyder ry"},"rows":"Rye","summary":"Opsomming","title":"Tabel eienskappe","toolbar":"Tabel","widthPc":"persent","widthPx":"piksels","widthUnit":"breedte-eenheid"},"undo":{"redo":"Oordoen","undo":"Ontdoen"},"wsc":{"btnIgnore":"Ignoreer","btnIgnoreAll":"Ignoreer alles","btnReplace":"Vervang","btnReplaceAll":"vervang alles","btnUndo":"Ontdoen","changeTo":"Verander na","errorLoading":"Fout by inlaai van diens: %s.","ieSpellDownload":"Speltoetser is nie geĂ¯nstalleer nie. Wil u dit nou aflaai?","manyChanges":"Klaar met speltoets: %1 woorde verander","noChanges":"Klaar met speltoets: Geen woorde verander nie","noMispell":"Klaar met speltoets: Geen foute nie","noSuggestions":"- Geen voorstel -","notAvailable":"Jammer, hierdie diens is nie nou beskikbaar nie.","notInDic":"Nie in woordeboek nie","oneChange":"Klaar met speltoets: Een woord verander","progress":"Spelling word getoets...","title":"Speltoetser","toolbar":"Speltoets"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/ar.js b/js/ckeditor/lang/ar.js
new file mode 100644
index 0000000..62d097c
--- /dev/null
+++ b/js/ckeditor/lang/ar.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['ar']={"editor":"محرر النص الغنÙ","editorPanel":"لائحة محرر النص المنسق","common":{"editorHelp":"إضغط على ALT + 0 للحصول على المساعدة.","browseServer":"تصÙØ­","url":"الرابط","protocol":"البروتوكول","upload":"رÙع","uploadSubmit":"أرسل","image":"صورة","flash":"Ùلاش","form":"نموذج","checkbox":"خانة إختÙار","radio":"زر اختÙار","textField":"مربع نص","textarea":"مساحة نصÙØ©","hiddenField":"إدراج حقل Ø®ÙÙ","button":"زر ضغط","select":"اختار","imageButton":"زر صورة","notSet":"<بدون تحدÙد>","id":"الرقم","name":"إسم","langDir":"إتجاه النص","langDirLtr":"الÙسار للÙÙ…ÙÙ† (LTR)","langDirRtl":"الÙÙ…ÙÙ† للÙسار (RTL)","langCode":"رمز اللغة","longDescr":"الوص٠التÙصÙلى","cssClass":"Ùئات التنسÙÙ‚","advisoryTitle":"عنوان التقرÙر","cssStyle":"نمط","ok":"مواÙÙ‚","cancel":"إلغاء الأمر","close":"أغلق","preview":"استعراض","resize":"تغÙÙر الحجم","generalTab":"عام","advancedTab":"متقدم","validateNumberFailed":"لاÙوجد نتÙجة","confirmNewPage":"ستÙقد أ٠متغÙÙرات اذا لم تقم بحÙظها اولا. هل أنت متأكد أنك ترÙد صÙحة جدÙدة؟","confirmCancel":"بعض الخÙارات قد تغÙرت. هل أنت متأكد من إغلاق مربع النص؟","options":"Ø®Ùارات","target":"هد٠الرابط","targetNew":"ناÙذة جدÙدة","targetTop":"الناÙذة الأعلى","targetSelf":"داخل الناÙذة","targetParent":"الناÙذة الأم","langDirLTR":"الÙسار للÙÙ…ÙÙ† (LTR)","langDirRTL":"الÙÙ…ÙÙ† للÙسار (RTL)","styles":"نمط","cssClasses":"Ùئات التنسÙÙ‚","width":"العرض","height":"الإرتÙاع","align":"محاذاة","alignLeft":"Ùسار","alignRight":"ÙÙ…ÙÙ†","alignCenter":"وسط","alignJustify":"ضبط","alignTop":"أعلى","alignMiddle":"وسط","alignBottom":"أسÙÙ„","alignNone":"None","invalidValue":"Ù‚Ùمة غÙر Ù…Ùبولة.","invalidHeight":"الارتÙاع Ùجب أن Ùكون عدداً.","invalidWidth":"العرض Ùجب أن Ùكون عدداً.","invalidCssLength":"Ù‚Ùمة الخانة المخصصة لـ \"%1\" Ùجب أن تكون رقما موجبا، باستخدام أو من غÙر استخدام وحدة CSS Ù‚Ùاس مقبولة (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Ù‚Ùمة الخانة المخصصة لـ \"%1\" Ùجب أن تكون رقما موجبا، باستخدام أو من غÙر استخدام وحدة HTML Ù‚Ùاس مقبولة (px or %).","invalidInlineStyle":"Ù‚Ùمة الخانة المخصصة لـ Inline Style Ùجب أن تختو٠على مجموع واحد أو أكثر بالشكل التالÙ: \"name : value\", Ù…Ùصولة بÙاصلة منقزطة.","cssLengthTooltip":"أدخل رقما للقÙمة بالبكسل أو رقما بوحدة CSS مقبولة (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, غÙر متاح</span>"},"about":{"copy":"حقوق النشر &copy; $1. جمÙع الحقوق محÙوظة.","dlgTitle":"عن CKEditor","help":"راجع $1 من أجل المساعدة","moreInfo":"للحصول على معلومات الترخÙص ØŒ Ùرجى زÙارة موقعنا:","title":"عن CKEditor","userGuide":"دلÙÙ„ مستخدم CKEditor."},"basicstyles":{"bold":"عرÙض","italic":"مائل","strike":"Ùتوسطه خط","subscript":"منخÙض","superscript":"مرتÙع","underline":"تسطÙر"},"blockquote":{"toolbar":"اقتباس"},"clipboard":{"copy":"نسخ","copyError":"الإعدادات الأمنÙØ© للمتصÙØ­ الذ٠تستخدمه تمنع عملÙات النسخ التلقائÙ. Ùضلاً إستخدم لوحة المÙاتÙØ­ Ù„Ùعل ذلك (Ctrl/Cmd+C).","cut":"قص","cutError":"الإعدادات الأمنÙØ© للمتصÙØ­ الذ٠تستخدمه تمنع القص التلقائÙ. Ùضلاً إستخدم لوحة المÙاتÙØ­ Ù„Ùعل ذلك (Ctrl/Cmd+X).","paste":"لصق","pasteArea":"منطقة اللصق","pasteMsg":"الصق داخل الصندوق بإستخدام زرائر (<STRONG>Ctrl/Cmd+V</STRONG>) Ù٠لوحة المÙاتÙØ­ØŒ ثم اضغط زر <STRONG>مواÙÙ‚</STRONG>.","securityMsg":"نظراً لإعدادات الأمان الخاصة بمتصÙحك، لن Ùتمكن هذا المحرر من الوصول لمحتوى حاÙظتك، لذلك Ùجب علÙÙƒ لصق المحتوى مرة أخرى Ù٠هذه الناÙذة.","title":"لصق"},"contextmenu":{"options":"خصائص قائمة السÙاق"},"button":{"selectedLabel":"%1 (Selected)"},"toolbar":{"toolbarCollapse":"تقلÙص شرÙØ· الأدوت","toolbarExpand":"تمدÙد شرÙØ· الأدوات","toolbarGroups":{"document":"مستند","clipboard":"الحاÙظة/الرجوع","editing":"تحرÙر","forms":"نماذج","basicstyles":"نمط بسÙØ·","paragraph":"Ùقرة","links":"روابط","insert":"إدراج","styles":"أنماط","colors":"ألوان","tools":"أدوات"},"toolbars":"أشرطة أدوات المحرر"},"elementspath":{"eleLabel":"مسار العنصر","eleTitle":"عنصر 1%"},"format":{"label":"تنسÙÙ‚","panelTitle":"تنسÙÙ‚ الÙقرة","tag_address":"عنوان","tag_div":"عاد٠(DIV)","tag_h1":"العنوان 1","tag_h2":"العنوان 2","tag_h3":"العنوان 3","tag_h4":"العنوان 4","tag_h5":"العنوان 5","tag_h6":"العنوان 6","tag_p":"عادÙ","tag_pre":"منسّق"},"horizontalrule":{"toolbar":"خط Ùاصل"},"image":{"alertUrl":"Ùضلاً أكتب الموقع الذ٠توجد علÙÙ‡ هذه الصورة.","alt":"عنوان الصورة","border":"سمك الحدود","btnUpload":"أرسلها للخادم","button2Img":"هل ترÙد تحوÙÙ„ زر الصورة المختار إلى صورة بسÙطة؟","hSpace":"تباعد Ø£ÙÙ‚Ù","img2Button":"هل ترÙد تحوÙÙ„ الصورة المختارة إلى زر صورة؟","infoTab":"معلومات الصورة","linkTab":"الرابط","lockRatio":"تناسق الحجم","menu":"خصائص الصورة","resetSize":"إستعادة الحجم الأصلÙ","title":"خصائص الصورة","titleButton":"خصائص زر الصورة","upload":"رÙع","urlMissing":"عنوان مصدر الصورة Ù…Ùقود","vSpace":"تباعد عمودÙ","validateBorder":"الإطار Ùجب أن Ùكون عددا","validateHSpace":"HSpace Ùجب أن Ùكون عدداً.","validateVSpace":"VSpace Ùجب أن Ùكون عدداً."},"indent":{"indent":"زÙادة المساÙØ© البادئة","outdent":"إنقاص المساÙØ© البادئة"},"fakeobjects":{"anchor":"إرساء","flash":"رسم متحرك بالÙلاش","hiddenfield":"إدراج حقل Ø®ÙÙ","iframe":"iframe","unknown":"عنصر غÙر معروÙ"},"link":{"acccessKey":"Ù…ÙاتÙØ­ الإختصار","advanced":"متقدم","advisoryContentType":"نوع التقرÙر","advisoryTitle":"عنوان التقرÙر","anchor":{"toolbar":"إشارة مرجعÙØ©","menu":"تحرÙر الإشارة المرجعÙØ©","title":"خصائص الإشارة المرجعÙØ©","name":"اسم الإشارة المرجعÙØ©","errorName":"الرجاء كتابة اسم الإشارة المرجعÙØ©","remove":"إزالة الإشارة المرجعÙØ©"},"anchorId":"حسب رقم العنصر","anchorName":"حسب إسم الإشارة المرجعÙØ©","charset":"ترمÙز المادة المطلوبة","cssClasses":"Ùئات التنسÙÙ‚","emailAddress":"البرÙد الإلكترونÙ","emailBody":"محتوى الرسالة","emailSubject":"موضوع الرسالة","id":"هوÙØ©","info":"معلومات الرابط","langCode":"رمز اللغة","langDir":"إتجاه نص اللغة","langDirLTR":"الÙسار للÙÙ…ÙÙ† (LTR)","langDirRTL":"الÙÙ…ÙÙ† للÙسار (RTL)","menu":"تحرÙر الرابط","name":"إسم","noAnchors":"(لا توجد علامات مرجعÙØ© Ù٠هذا المستند)","noEmail":"الرجاء كتابة الرÙد الإلكترونÙ","noUrl":"الرجاء كتابة رابط الموقع","other":"<أخرى>","popupDependent":"تابع (Netscape)","popupFeatures":"خصائص الناÙذة المنبثقة","popupFullScreen":"ملئ الشاشة (IE)","popupLeft":"التمركز للÙسار","popupLocationBar":"شرÙØ· العنوان","popupMenuBar":"القوائم الرئÙسÙØ©","popupResizable":"قابلة التشكÙÙ„","popupScrollBars":"أشرطة التمرÙر","popupStatusBar":"شرÙØ· الحالة","popupToolbar":"شرÙØ· الأدوات","popupTop":"التمركز للأعلى","rel":"العلاقة","selectAnchor":"اختر علامة مرجعÙØ©","styles":"نمط","tabIndex":"الترتÙب","target":"هد٠الرابط","targetFrame":"<إطار>","targetFrameName":"اسم الإطار المستهدÙ","targetPopup":"<ناÙذة منبثقة>","targetPopupName":"اسم الناÙذة المنبثقة","title":"رابط","toAnchor":"مكان Ù٠هذا المستند","toEmail":"برÙد إلكترونÙ","toUrl":"الرابط","toolbar":"رابط","type":"نوع الربط","unlink":"إزالة رابط","upload":"رÙع"},"list":{"bulletedlist":"ادخال/حذ٠تعداد نقطÙ","numberedlist":"ادخال/حذ٠تعداد رقمÙ"},"magicline":{"title":"إدراج Ùقرة هنا"},"maximize":{"maximize":"تكبÙر","minimize":"تصغÙر"},"pastetext":{"button":"لصق كنص بسÙØ·","title":"لصق كنص بسÙØ·"},"pastefromword":{"confirmCleanup":"Ùبدو أن النص المراد لصقه منسوخ من برنامج وورد. هل تود تنظÙÙÙ‡ قبل الشروع Ù٠عملÙØ© اللصق؟","error":"لم Ùتم مسح المعلومات الملصقة لخلل داخلÙ","title":"لصق من وورد","toolbar":"لصق من وورد"},"removeformat":{"toolbar":"إزالة التنسÙقات"},"sourcearea":{"toolbar":"المصدر"},"specialchar":{"options":"Ø®Ùارات الأحر٠الخاصة","title":"اختر حر٠خاص","toolbar":"إدراج حر٠خاص"},"scayt":{"btn_about":"عن SCAYT","btn_dictionaries":"قوامÙس","btn_disable":"تعطÙÙ„ SCAYT","btn_enable":"تÙعÙÙ„ SCAYT","btn_langs":"لغات","btn_options":"Ø®Ùارات","text_title":"تدقÙÙ‚ إملائ٠أثناء الكتابة"},"stylescombo":{"label":"أنماط","panelTitle":"أنماط التنسÙÙ‚","panelTitle1":"أنماط الÙقرة","panelTitle2":"أنماط مضمنة","panelTitle3":"أنماط الكائن"},"table":{"border":"الحدود","caption":"الوصÙ","cell":{"menu":"خلÙØ©","insertBefore":"إدراج خلÙØ© قبل","insertAfter":"إدراج خلÙØ© بعد","deleteCell":"حذ٠خلÙØ©","merge":"دمج خلاÙا","mergeRight":"دمج للÙÙ…ÙÙ†","mergeDown":"دمج للأسÙÙ„","splitHorizontal":"تقسÙÙ… الخلÙØ© Ø£ÙÙ‚Ùاً","splitVertical":"تقسÙÙ… الخلÙØ© عمودÙاً","title":"خصائص الخلÙØ©","cellType":"نوع الخلÙØ©","rowSpan":"امتداد الصÙÙˆÙ","colSpan":"امتداد الأعمدة","wordWrap":"التÙا٠النص","hAlign":"محاذاة Ø£ÙÙ‚ÙØ©","vAlign":"محاذاة رأسÙØ©","alignBaseline":"خط القاعدة","bgColor":"لون الخلÙÙØ©","borderColor":"لون الحدود","data":"بÙانات","header":"عنوان","yes":"نعم","no":"لا","invalidWidth":"عرض الخلÙØ© Ùجب أن Ùكون عدداً.","invalidHeight":"ارتÙاع الخلÙØ© Ùجب أن Ùكون عدداً.","invalidRowSpan":"امتداد الصÙÙˆÙ Ùجب أن Ùكون عدداً صحÙحاً.","invalidColSpan":"امتداد الأعمدة Ùجب أن Ùكون عدداً صحÙحاً.","chooseColor":"اختر"},"cellPad":"المساÙØ© البادئة","cellSpace":"تباعد الخلاÙا","column":{"menu":"عمود","insertBefore":"إدراج عمود قبل","insertAfter":"إدراج عمود بعد","deleteColumn":"حذ٠أعمدة"},"columns":"أعمدة","deleteTable":"حذ٠الجدول","headers":"العناوÙÙ†","headersBoth":"كلاهما","headersColumn":"العمود الأول","headersNone":"بدون","headersRow":"الص٠الأول","invalidBorder":"حجم الحد Ùجب أن Ùكون عدداً.","invalidCellPadding":"المساÙØ© البادئة Ùجب أن تكون عدداً","invalidCellSpacing":"المساÙØ© بÙÙ† الخلاÙا Ùجب أن تكون عدداً.","invalidCols":"عدد الأعمدة Ùجب أن Ùكون عدداً أكبر من صÙر.","invalidHeight":"ارتÙاع الجدول Ùجب أن Ùكون عدداً.","invalidRows":"عدد الصÙÙˆÙ Ùجب أن Ùكون عدداً أكبر من صÙر.","invalidWidth":"عرض الجدول Ùجب أن Ùكون عدداً.","menu":"خصائص الجدول","row":{"menu":"صÙ","insertBefore":"إدراج ص٠قبل","insertAfter":"إدراج ص٠بعد","deleteRow":"حذ٠صÙÙˆÙ"},"rows":"صÙÙˆÙ","summary":"الخلاصة","title":"خصائص الجدول","toolbar":"جدول","widthPc":"بالمئة","widthPx":"بكسل","widthUnit":"وحدة العرض"},"undo":{"redo":"إعادة","undo":"تراجع"},"wsc":{"btnIgnore":"تجاهل","btnIgnoreAll":"تجاهل الكل","btnReplace":"تغÙÙر","btnReplaceAll":"تغÙÙر الكل","btnUndo":"تراجع","changeTo":"التغÙÙر إلى","errorLoading":"خطأ Ù٠تحمÙÙ„ تطبÙÙ‚ خدمة الاستضاÙØ©: %s.","ieSpellDownload":"المدقق الإملائ٠(الإنجلÙزÙ) غÙر مثبّت. هل تود تحمÙله الآن؟","manyChanges":"تم إكمال التدقÙÙ‚ الإملائÙ: تم تغÙÙر %1 من كلمات","noChanges":"تم التدقÙÙ‚ الإملائÙ: لم Ùتم تغÙÙر أ٠كلمة","noMispell":"تم التدقÙÙ‚ الإملائÙ: لم Ùتم العثور على أ٠أخطاء إملائÙØ©","noSuggestions":"- لا توجد إقتراحات -","notAvailable":"عÙواً، ولكن هذه الخدمة غÙر متاحة الان","notInDic":"Ù„Ùست Ù٠القاموس","oneChange":"تم التدقÙÙ‚ الإملائÙ: تم تغÙÙر كلمة واحدة Ùقط","progress":"جار٠التدقÙÙ‚ الاملائى","title":"التدقÙÙ‚ الإملائÙ","toolbar":"تدقÙÙ‚ إملائÙ"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/bg.js b/js/ckeditor/lang/bg.js
new file mode 100644
index 0000000..e5aaff2
--- /dev/null
+++ b/js/ckeditor/lang/bg.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['bg']={"editor":"Đ¢ĐµĐºÑÑ‚Đ¾Đ² Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€ Đ·Đ° Ñ„Đ¾Ñ€Đ¼Đ°Ñ‚Đ¸Ñ€Đ°Đ½ Ñ‚ĐµĐºÑÑ‚","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Đ½Đ°Ñ‚Đ¸ÑĐ½ĐµÑ‚Đµ ALT 0 Đ·Đ° Đ¿Đ¾Đ¼Đ¾Ñ‰","browseServer":"Đ˜Đ·Đ±Đ¾Ñ€ Đ¾Ñ‚ ÑÑÑ€Đ²ÑÑ€Đ°","url":"URL","protocol":"ĐŸÑ€Đ¾Ñ‚Đ¾ĐºĐ¾Đ»","upload":"ĐĐ°Ñ‡Đ²Đ°Đ½Đµ","uploadSubmit":"Đ˜Đ·Đ¿Ñ€Đ°Ñ‰Đ°Đ½Đµ ĐºÑĐ¼ ÑÑÑ€Đ²ÑÑ€Đ°","image":"Đ¡Đ½Đ¸Đ¼ĐºĐ°","flash":"Đ¤Đ»Đ°Ñˆ","form":"Đ¤Đ¾Ñ€Đ¼Đ°","checkbox":"ĐŸĐ¾Đ»Đµ Đ·Đ° Đ¸Đ·Đ±Đ¾Ñ€","radio":"Đ Đ°Đ´Đ¸Đ¾ Đ±ÑƒÑ‚Đ¾Đ½","textField":"Đ¢ĐµĐºÑÑ‚Đ¾Đ²Đ¾ Đ¿Đ¾Đ»Đµ","textarea":"Đ¢ĐµĐºÑÑ‚Đ¾Đ²Đ° Đ·Đ¾Đ½Đ°","hiddenField":"Đ¡ĐºÑ€Đ¸Ñ‚Đ¾ Đ¿Đ¾Đ»Đµ","button":"Đ‘ÑƒÑ‚Đ¾Đ½","select":"ĐŸĐ¾Đ»Đµ Đ·Đ° Đ¸Đ·Đ±Đ¾Ñ€","imageButton":"Đ‘ÑƒÑ‚Đ¾Đ½ Đ·Đ° ÑĐ½Đ¸Đ¼ĐºĐ°","notSet":"<Đ½Đµ е Đ¸Đ·Đ±Ñ€Đ°Đ½Đ¾>","id":"ID","name":"Đ˜Đ¼Đµ","langDir":"ĐŸĐ¾ÑĐ¾ĐºĐ° Đ½Đ° ĐµĐ·Đ¸ĐºĐ°","langDirLtr":"Đ›ÑĐ²Đ¾ Đ½Đ° Đ´ÑÑĐ½Đ¾ (Đ›Đ½Đ”)","langDirRtl":"Đ”ÑÑĐ½Đ¾ Đ½Đ° Đ»ÑĐ²Đ¾ (Đ”Đ½Đ›)","langCode":"ĐĐ¾Đ´ Đ½Đ° ĐµĐ·Đ¸ĐºĐ°","longDescr":"Đ£ĐµĐ± Đ°Đ´Ñ€ĐµÑ Đ·Đ° Đ´ÑĐ»Đ³Đ¾ Đ¾Đ¿Đ¸ÑĐ°Đ½Đ¸Đµ","cssClass":"ĐлаÑĐ¾Đ²Đµ Đ·Đ° CSS","advisoryTitle":"ĐŸÑ€ĐµĐ¿Đ¾Ñ€ÑÑ‡Đ¸Ñ‚ĐµĐ»Đ½Đ¾ Đ·Đ°Đ³Đ»Đ°Đ²Đ¸Đµ","cssStyle":"Đ¡Ñ‚Đ¸Đ»","ok":"ĐĐ","cancel":"ĐÑ‚ĐºĐ°Đ·","close":"Đ—Đ°Ñ‚Đ²Đ¾Ñ€Đ¸","preview":"ĐŸÑ€ĐµĐ³Đ»ĐµĐ´","resize":"Đ’Đ»Đ°Ñ‡ĐµÑ‚Đµ Đ·Đ° Đ´Đ° Đ¾Ñ€Đ°Đ·Đ¼ĐµÑ€Đ¸Ñ‚Đµ","generalTab":"ĐĐ±Ñ‰Đ¸","advancedTab":"Đ Đ°Đ·ÑˆĐ¸Ñ€ĐµĐ½Đ¾","validateNumberFailed":"Đ¢Đ°Đ·Đ¸ ÑÑ‚Đ¾Đ¹Đ½Đ¾ÑÑ‚ Đ½Đµ е Ñ‡Đ¸ÑĐ»Đ¾","confirmNewPage":"Đ’ÑĐ¸Ñ‡ĐºĐ¸ Đ½ĐµĐ·Đ°Đ¿Đ°Đ·ĐµĐ½Đ¸ Đ¿Ñ€Đ¾Đ¼ĐµĐ½Đ¸ Ñ‰Đµ бÑĐ´Đ°Ñ‚ Đ¸Đ·Đ³ÑƒĐ±ĐµĐ½Đ¸. Đ¡Đ¸Đ³ÑƒÑ€Đ½Đ¸ ли ÑÑ‚Đµ, Ñ‡Đµ Đ¶ĐµĐ»Đ°ĐµÑ‚Đµ Đ´Đ° Đ·Đ°Ñ€ĐµĐ´Đ¸Ñ‚Đµ Đ½Đ¾Đ²Đ° ÑÑ‚Ñ€Đ°Đ½Đ¸Ñ†Đ°?","confirmCancel":"ĐÑĐºĐ¾Đ¸ Đ¾Ñ‚ Đ¾Đ¿Ñ†Đ¸Đ¸Ñ‚Đµ ÑĐ° Đ¿Ñ€Đ¾Đ¼ĐµĐ½ĐµĐ½Đ¸. Đ¡Đ¸Đ³ÑƒÑ€Đ½Đ¸ ли ÑÑ‚Đµ, Ñ‡Đµ Đ¶ĐµĐ»Đ°ĐµÑ‚Đµ Đ´Đ° Đ·Đ°Ñ‚Đ²Đ¾Ñ€Đ¸Ñ‚Đµ Đ¿Ñ€Đ¾Đ·Đ¾Ñ€ĐµÑ†Đ°?","options":"ĐĐ¿Ñ†Đ¸Đ¸","target":"Цел","targetNew":"ĐĐ¾Đ² Đ¿Ñ€Đ¾Đ·Đ¾Ñ€ĐµÑ† (_blank)","targetTop":"Đ“Đ¾Ñ€Đ½Đ° Đ¿Đ¾Đ·Đ¸Ñ†Đ¸Ñ (_top)","targetSelf":"Đ¢ĐµĐºÑƒÑ‰Đ¸Ñ Đ¿Ñ€Đ¾Đ·Đ¾Ñ€ĐµÑ† (_self)","targetParent":"ĐÑĐ½Đ¾Đ²ĐµĐ½ Đ¿Ñ€Đ¾Đ·Đ¾Ñ€ĐµÑ† (_parent)","langDirLTR":"Đ›ÑĐ²Đ¾ Đ½Đ° Đ´ÑÑĐ½Đ¾ (Đ›Đ½Đ”)","langDirRTL":"Đ”ÑÑĐ½Đ¾ Đ½Đ° Đ»ÑĐ²Đ¾ (Đ”Đ½Đ›)","styles":"Đ¡Ñ‚Đ¸Đ»","cssClasses":"ĐлаÑĐ¾Đ²Đµ Đ·Đ° CSS","width":"Đ¨Đ¸Ñ€Đ¸Đ½Đ°","height":"ВиÑĐ¾Ñ‡Đ¸Đ½Đ°","align":"ĐŸĐ¾Đ´Ñ€Đ°Đ²Đ½ÑĐ²Đ°Đ½Đµ","alignLeft":"Đ›ÑĐ²Đ¾","alignRight":"Đ”ÑÑĐ½Đ¾","alignCenter":"Đ¦ĐµĐ½Ñ‚ÑÑ€","alignJustify":"Đ”Đ²ÑƒÑÑ‚Ñ€Đ°Đ½Đ½Đ¾ Đ¿Đ¾Đ´Ñ€Đ°Đ²Đ½ÑĐ²Đ°Đ½Đµ","alignTop":"Đ“Đ¾Ñ€Đµ","alignMiddle":"ĐŸĐ¾ ÑÑ€ĐµĐ´Đ°Ñ‚Đ°","alignBottom":"Đ”Đ¾Đ»Ñƒ","alignNone":"None","invalidValue":"ĐĐµĐ²Đ°Đ»Đ¸Đ´Đ½Đ° ÑÑ‚Đ¾Đ¹Đ½Đ¾ÑÑ‚.","invalidHeight":"ВиÑĐ¾Ñ‡Đ¸Đ½Đ°Ñ‚Đ° Ñ‚Ñ€ÑĐ±Đ²Đ° Đ´Đ° е Ñ‡Đ¸ÑĐ»Đ¾.","invalidWidth":"Đ¨Đ¸Ñ€Đ¸Đ½Đ° Ñ‚Ñ€ĐµĐ±Đµ Đ´Đ° е Ñ‡Đ¸ÑĐ»Đ¾.","invalidCssLength":"Đ¡Ñ‚Đ¾Đ¹Đ½Đ¾ÑÑ‚Ñ‚Đ° Đ½Đ° Đ¿Đ¾Đ»ĐµÑ‚Đ¾ \"%1\" Ñ‚Ñ€ÑĐ±Đ²Đ° Đ´Đ° бÑде Đ¿Đ¾Đ»Đ¾Đ¶Đ¸Ñ‚ĐµĐ»Đ½Đ¾ Ñ‡Đ¸ÑĐ»Đ¾ Ñ Đ¸Đ»Đ¸ без Đ²Đ°Đ»Đ¸Đ´Đ½Đ° CSS Đ¸Đ·Đ¼ĐµÑ€Đ²Đ°Ñ‚ĐµĐ»Đ½Đ° ĐµĐ´Đ¸Đ½Đ¸Ñ†Đ° (px, %, in, cm, mm, em, ex, pt, или pc).","invalidHtmlLength":"Đ¡Ñ‚Đ¾Đ¹Đ½Đ¾ÑÑ‚Ñ‚Đ° Đ½Đ° Đ¿Đ¾Đ»ĐµÑ‚Đ¾ \"%1\" Ñ‚Ñ€ÑĐ±Đ²Đ° Đ´Đ° бÑде Đ¿Đ¾Đ»Đ¾Đ¶Đ¸Ñ‚ĐµĐ»Đ½Đ¾ Ñ‡Đ¸ÑĐ»Đ¾ Ñ Đ¸Đ»Đ¸ без Đ²Đ°Đ»Đ¸Đ´Đ½Đ° HTML Đ¸Đ·Đ¼ĐµÑ€Đ²Đ°Ñ‚ĐµĐ»Đ½Đ° ĐµĐ´Đ¸Đ½Đ¸Ñ†Đ° (px или %).","invalidInlineStyle":"Đ¡Ñ‚Đ¾Đ¹Đ½Đ¾ÑÑ‚Ñ‚Đ° Đ½Đ° ÑÑ‚Đ¸Đ»a Ñ‚Ñ€ÑĐ±Đ²Đ° Đ´Đ° ÑÑĐ´ÑÑ€Đ¶Đ°Ñ‚ ĐµĐ´Đ½Đ° или Đ¿Đ¾Đ²ĐµÑ‡Đµ Đ´Đ²Đ¾Đ¹ĐºĐ¸ Đ²ÑĐ² Ñ„Đ¾Ñ€Đ¼Đ°Ñ‚ \"name : value\", Ñ€Đ°Đ·Đ´ĐµĐ»ĐµĐ½Đ¸ Ñ Đ´Đ²Đ¾ĐµÑ‚Đ¾Ñ‡Đ¸Đµ.","cssLengthTooltip":"Đ’ÑĐ²ĐµĐ´ĐµÑ‚Đµ Ñ‡Đ¸ÑĐ»ĐµĐ½Đ° ÑÑ‚Đ¾Đ¹Đ½Đ¾ÑÑ‚ Đ² Đ¿Đ¸ĐºÑели или Đ´Ñ€ÑƒĐ³Đ° Đ²Đ°Đ»Đ¸Đ´Đ½Đ° CSS ĐµĐ´Đ¸Đ½Đ¸Ñ†Đ° (px, %, in, cm, mm, em, ex, pt, или pc).","unavailable":"%1<span class=\"cke_accessibility\">, Đ½ĐµĐ´Đ¾ÑÑ‚ÑĐ¿Đ½Đ¾</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"ĐÑ‚Đ½Đ¾ÑĐ½Đ¾ CKEditor","help":"ĐŸÑ€Đ¾Đ²ĐµÑ€ĐµÑ‚Đµ $1 Đ·Đ° Đ¿Đ¾Đ¼Đ¾Ñ‰.","moreInfo":"Đ—Đ° Đ»Đ¸Ñ†ĐµĐ½Đ·Đ¸Đ¾Đ½Đ½Đ° Đ¸Đ½Ñ„Đ¾Ñ€Đ¼Đ°Ñ†Đ¸Ñ Đ¼Đ¾Đ»Ñ Đ¿Đ¾ÑĐµÑ‚ĐµÑ‚Đµ ÑĐ°Đ¹Ñ‚Đ° Đ½Đ¸:","title":"ĐÑ‚Đ½Đ¾ÑĐ½Đ¾ CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Đ£Đ´ĐµĐ±ĐµĐ»ĐµĐ½","italic":"ĐĐ°ĐºĐ»Đ¾Đ½ĐµĐ½","strike":"Đ—Đ°Ñ‡ĐµÑ€Ñ‚Đ°Đ½ Ñ‚ĐµĐºÑÑ‚","subscript":"Đ˜Đ½Đ´ĐµĐºÑĐ¸Ñ€Đ°Đ½ Ñ‚ĐµĐºÑÑ‚","superscript":"Đ¡ÑƒĐ¿ĐµÑ€ÑĐºÑ€Đ¸Đ¿Ñ‚","underline":"ĐŸĐ¾Đ´Ñ‡ĐµÑ€Ñ‚Đ°Đ½"},"blockquote":{"toolbar":"Đ‘Đ»Đ¾Đº Đ·Đ° Ñ†Đ¸Ñ‚Đ°Ñ‚"},"clipboard":{"copy":"ĐĐ¾Đ¿Đ¸Ñ€Đ°Đ¹","copyError":"ĐĐ°ÑÑ‚Ñ€Đ¾Đ¹ĐºĐ¸Ñ‚Đµ Đ·Đ° ÑĐ¸Đ³ÑƒÑ€Đ½Đ¾ÑÑ‚ Đ½Đ° Đ²Đ°ÑˆĐ¸Ñ Đ±Ñ€Đ°Đ·ÑƒÑÑ€ Đ½Đµ Ñ€Đ°Đ·Ñ€ĐµÑˆĐ°Đ²Đ°Ñ‚ Đ½Đ° Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€Đ° Đ´Đ° Đ¸Đ·Đ¿ÑĐ»Đ½Đ¸ Đ·Đ°Đ¿Đ°Đ¼ĐµÑ‚ÑĐ²Đ°Đ½ĐµÑ‚Đ¾. Đ—Đ° Ñ†ĐµĐ»Ñ‚Đ° Đ¸Đ·Đ¿Đ¾Đ»Đ·Đ²Đ°Đ¹Ñ‚Đµ ĐºĐ»Đ°Đ²Đ¸Đ°Ñ‚ÑƒÑ€Đ°Ñ‚Đ° (Ctrl/Cmd+C).","cut":"ĐÑ‚Ñ€ĐµĐ¶Đ¸","cutError":"ĐĐ°ÑÑ‚Ñ€Đ¾Đ¹ĐºĐ¸Ñ‚Đµ Đ·Đ° ÑĐ¸Đ³ÑƒÑ€Đ½Đ¾ÑÑ‚ Đ½Đ° Đ’Đ°ÑˆĐ¸Ñ Đ±Ñ€Đ°ÑƒĐ·ÑÑ€ Đ½Đµ Đ¿Đ¾Đ·Đ²Đ¾Đ»ÑĐ²Đ°Ñ‚ Đ½Đ° Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€Đ° Đ°Đ²Ñ‚Đ¾Đ¼Đ°Ñ‚Đ¸Ñ‡Đ½Đ¾ Đ´Đ° изÑĐ¿Đ»Đ½Đ¸ Đ´ĐµĐ¹ÑÑ‚Đ²Đ¸ÑÑ‚Đ° Đ·Đ° Đ¾Ñ‚Ñ€ÑĐ·Đ²Đ°Đ½Đµ. ĐœĐ¾Đ»Ñ Đ¿Đ¾Đ»Đ·Đ²Đ°Đ¹Ñ‚Đµ ĐºĐ»Đ°Đ²Đ¸Đ°Ñ‚ÑƒÑ€Đ½Đ¸Ñ‚Đµ ĐºĐ¾Đ¼Đ°Đ½Đ´Đ¸ Đ·Đ° Ñ†ĐµĐ»Ñ‚Đ° (ctrl+x).","paste":"Đ’Đ¼ÑĐºĐ½Đ¸","pasteArea":"Đ—Đ¾Đ½Đ° Đ·Đ° Đ²Đ¼ÑĐºĐ²Đ°Đ½Đµ","pasteMsg":"Đ’Đ¼ÑĐºĐ½ĐµÑ‚Đµ Ñ‚ÑƒĐº ÑÑĐ´ÑĐ¶Đ°Đ½Đ¸ĐµÑ‚Đ¾ Ñ ĐºĐ»Đ°Đ²Đ¸Đ°Ñ‚ÑƒĐ°Ñ€Đ°Ñ‚Đ° (<STRONG>Ctrl/Cmd+V</STRONG>) и Đ½Đ°Ñ‚Đ¸ÑĐ½ĐµÑ‚Đµ <STRONG>OK</STRONG>.","securityMsg":"Đ—Đ°Ñ€Đ°Đ´Đ¸ Đ½Đ°ÑÑ‚Ñ€Đ¾Đ¹ĐºĐ¸Ñ‚Đµ Đ·Đ° ÑĐ¸Đ³ÑƒÑ€Đ½Đ¾ÑÑ‚ Đ½Đ° Đ’Đ°ÑˆĐ¸Ñ Đ±Ñ€Đ°ÑƒĐ·ÑÑ€, Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€ÑÑ‚ Đ½Đµ Đ¼Đ¾Đ¶Đµ Đ´Đ° Đ¿Ñ€Đ¾Ñ‡ĐµÑ‚Đµ Đ´Đ°Đ½Đ½Đ¸Ñ‚Đµ Đ¾Ñ‚ ĐºĐ»Đ¸Đ¿Đ±Đ¾Ñ€Đ´Đ° ĐºĐ¾Ñ€ĐµĐºÑ‚Đ½Đ¾.","title":"Đ’Đ¼ÑĐºĐ½Đ¸"},"contextmenu":{"options":"ĐĐ¿Ñ†Đ¸Đ¸ Đ½Đ° ĐºĐ¾Đ½Ñ‚ĐµĐºÑÑ‚Đ½Đ¾Ñ‚Đ¾ Đ¼ĐµĐ½Ñ"},"button":{"selectedLabel":"%1 (Selected)"},"toolbar":{"toolbarCollapse":"Đ¡Đ²Đ¸Đ²Đ°Đ½Đµ Đ½Đ° Đ»ĐµĐ½Ñ‚Đ°Ñ‚Đ° Ñ Đ¸Đ½ÑÑ‚Ñ€ÑƒĐ¼ĐµĐ½Ñ‚Đ¸","toolbarExpand":"Đ Đ°Đ·ÑˆĐ¸Ñ€ÑĐ²Đ°Đ½Đµ Đ½Đ° Đ»ĐµĐ½Ñ‚Đ°Ñ‚Đ° Ñ Đ¸Đ½ÑÑ‚Ñ€ÑƒĐ¼ĐµĐ½Ñ‚Đ¸","toolbarGroups":{"document":"Đ”Đ¾ĐºÑƒĐ¼ĐµĐ½Ñ‚","clipboard":"Clipboard/Undo","editing":"ĐŸÑ€Đ¾Đ¼ÑĐ½Đ°","forms":"Đ¤Đ¾Ñ€Đ¼Đ¸","basicstyles":"Đ‘Đ°Đ·Đ¾Đ²Đ¸ ÑÑ‚Đ¸Đ»Đ¾Đ²Đµ","paragraph":"ĐŸĐ°Ñ€Đ°Đ³Ñ€Đ°Ñ„","links":"Đ’Ñ€ÑĐ·ĐºĐ¸","insert":"Đ’Đ¼ÑĐºĐ²Đ°Đ½Đµ","styles":"Đ¡Ñ‚Đ¸Đ»Đ¾Đ²Đµ","colors":"Đ¦Đ²ĐµÑ‚Đ¾Đ²Đµ","tools":"Đ˜Đ½ÑÑ‚Ñ€ÑƒĐ¼ĐµĐ½Ñ‚Đ¸"},"toolbars":"Đ›ĐµĐ½Ñ‚Đ¸ Ñ Đ¸Đ½ÑÑ‚Ñ€ÑƒĐ¼ĐµĐ½Ñ‚Đ¸"},"elementspath":{"eleLabel":"ĐŸÑÑ‚ Đ·Đ° ĐµĐ»ĐµĐ¼ĐµĐ½Ñ‚Đ¸Ñ‚Đµ","eleTitle":"%1 ĐµĐ»ĐµĐ¼ĐµĐ½Ñ‚"},"format":{"label":"Đ¤Đ¾Ñ€Đ¼Đ°Ñ‚","panelTitle":"Đ¤Đ¾Ñ€Đ¼Đ°Ñ‚","tag_address":"ĐĐ´Ñ€ĐµÑ","tag_div":"ĐŸĐ°Ñ€Đ°Đ³Ñ€Đ°Ñ„ (DIV)","tag_h1":"Đ—Đ°Đ³Đ»Đ°Đ²Đ¸Đµ 1","tag_h2":"Đ—Đ°Đ³Đ»Đ°Đ²Đ¸Đµ 2","tag_h3":"Đ—Đ°Đ³Đ»Đ°Đ²Đ¸Đµ 3","tag_h4":"Đ—Đ°Đ³Đ»Đ°Đ²Đ¸Đµ 4","tag_h5":"Đ—Đ°Đ³Đ»Đ°Đ²Đ¸Đµ 5","tag_h6":"Đ—Đ°Đ³Đ»Đ°Đ²Đ¸Đµ 6","tag_p":"ĐĐ¾Ñ€Đ¼Đ°Đ»ĐµĐ½","tag_pre":"Đ¤Đ¾Ñ€Đ¼Đ°Ñ‚Đ¸Ñ€Đ°Đ½"},"horizontalrule":{"toolbar":"Đ’Đ¼ÑĐºĐ²Đ°Đ½Đµ Đ½Đ° Ñ…Đ¾Ñ€Đ¸Đ·Đ¾Đ½Ñ‚Đ°Đ»Đ½Đ° Đ»Đ¸Đ½Đ¸Ñ"},"image":{"alertUrl":"ĐœĐ¾Đ»Ñ, Đ²ÑĐ²ĐµĐ´ĐµÑ‚Đµ Đ¿ÑĐ»Đ½Đ¸Ñ Đ¿ÑÑ‚ Đ´Đ¾ Đ¸Đ·Đ¾Đ±Ñ€Đ°Đ¶ĐµĐ½Đ¸ĐµÑ‚Đ¾","alt":"ĐĐ»Ñ‚ĐµÑ€Đ½Đ°Ñ‚Đ¸Đ²ĐµĐ½ Ñ‚ĐµĐºÑÑ‚","border":"Đ Đ°Đ¼ĐºĐ°","btnUpload":"Đ˜Đ·Đ¿Ñ€Đ°Ñ‚Đ¸ Ñ Đ½Đ° ÑÑÑ€Đ²ÑÑ€Đ°","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"Đ¥Đ¾Ñ€Đ¸Đ·Đ¾Đ½Ñ‚Đ°Đ»ĐµĐ½ Đ¾Ñ‚ÑÑ‚ÑĐ¿","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"Đ˜Đ½Ñ„Đ¾ Đ·Đ° ÑĐ½Đ¸Đ¼ĐºĐ°","linkTab":"Đ’Ñ€ÑĐ·ĐºĐ°","lockRatio":"Đ—Đ°ĐºĐ»ÑÑ‡Đ²Đ°Đ½Đµ Đ½Đ° ÑÑĐ¾Ñ‚Đ½Đ¾ÑˆĐµĐ½Đ¸ĐµÑ‚Đ¾","menu":"ĐĐ°ÑÑ‚Ñ€Đ¾Đ¹ĐºĐ¸ Đ·Đ° ÑĐ½Đ¸Đ¼ĐºĐ°","resetSize":"ĐÑƒĐ»Đ¸Ñ€Đ°Đ½Đµ Đ½Đ° Ñ€Đ°Đ·Đ¼ĐµÑ€","title":"ĐĐ°ÑÑ‚Ñ€Đ¾Đ¹ĐºĐ¸ Đ·Đ° ÑĐ½Đ¸Đ¼ĐºĐ°","titleButton":"ĐĐ°ÑÑ‚Đ¾Đ¹ĐºĐ¸ Đ·Đ° Đ±ÑƒÑ‚Đ¾Đ½ Đ·Đ° ÑĐ½Đ¸Đ¼ĐºĐ°","upload":"ĐĐ°Ñ‡Đ²Đ°Đ½Đµ","urlMissing":"Image source URL is missing.","vSpace":"Đ’ĐµÑ€Ñ‚Đ¸ĐºĐ°Đ»ĐµĐ½ Đ¾Ñ‚ÑÑ‚ÑĐ¿","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"indent":{"indent":"Đ£Đ²ĐµĐ»Đ¸Ñ‡Đ°Đ²Đ°Đ½Đµ Đ½Đ° Đ¾Ñ‚ÑÑ‚ÑĐ¿Đ°","outdent":"ĐĐ°Đ¼Đ°Đ»ÑĐ²Đ°Đ½Đµ Đ½Đ° Đ¾Ñ‚ÑÑ‚ÑĐ¿Đ°"},"fakeobjects":{"anchor":"ĐÑƒĐºĐ°","flash":"Đ¤Đ»Đ°Ñˆ Đ°Đ½Đ¸Đ¼Đ°Ñ†Đ¸Ñ","hiddenfield":"Đ¡ĐºÑ€Đ¸Ñ‚Đ¾ Đ¿Đ¾Đ»Đµ","iframe":"IFrame","unknown":"ĐĐµĐ¸Đ·Đ²ĐµÑÑ‚ĐµĐ½ Đ¾Đ±ĐµĐºÑ‚"},"link":{"acccessKey":"ĐĐ»Ñч Đ·Đ° Đ´Đ¾ÑÑ‚ÑĐ¿","advanced":"Đ Đ°Đ·ÑˆĐ¸Ñ€ĐµĐ½Đ¾","advisoryContentType":"ĐŸÑ€ĐµĐ¿Đ¾Ñ€ÑÑ‡Đ¸Ñ‚ĐµĐ»ĐµĐ½ Ñ‚Đ¸Đ¿ Đ½Đ° ÑÑĐ´ÑÑ€Đ¶Đ°Đ½Đ¸ĐµÑ‚Đ¾","advisoryTitle":"ĐŸÑ€ĐµĐ¿Đ¾Ñ€ÑÑ‡Đ¸Ñ‚ĐµĐ»Đ½Đ¾ Đ·Đ°Đ³Đ»Đ°Đ²Đ¸Đµ","anchor":{"toolbar":"ĐĐ¾Ñ‚Đ²Đ°","menu":"ĐŸÑ€Đ¾Đ¼ÑĐ½Đ° Đ½Đ° ĐºĐ¾Ñ‚Đ²Đ°","title":"ĐĐ°ÑÑ‚Ñ€Đ¾Đ¹ĐºĐ¸ Đ½Đ° ĐºĐ¾Ñ‚Đ²Đ°","name":"Đ˜Đ¼Đµ Đ½Đ° ĐºĐ¾Ñ‚Đ²Đ°","errorName":"ĐœĐ¾Đ»Ñ Đ²ÑĐ²ĐµĐ´ĐµÑ‚Đµ Đ¸Đ¼Đµ Đ½Đ° ĐºĐ¾Ñ‚Đ²Đ°Ñ‚Đ°","remove":"ĐŸÑ€ĐµĐ¼Đ°Ñ…Đ²Đ°Đ½Đµ Đ½Đ° ĐºĐ¾Ñ‚Đ²Đ°"},"anchorId":"ĐŸĐ¾ ID Đ½Đ° ĐµĐ»ĐµĐ¼ĐµĐ½Ñ‚","anchorName":"ĐŸĐ¾ Đ¸Đ¼Đµ Đ½Đ° ĐºĐ¾Ñ‚Đ²Đ°","charset":"Đ¢Đ¸Đ¿ Đ½Đ° ÑĐ²ÑÑ€Đ·Đ°Đ½Đ¸Ñ Ñ€ĐµÑурÑ","cssClasses":"ĐлаÑĐ¾Đ²Đµ Đ·Đ° CSS","emailAddress":"E-mail aĐ´Ñ€ĐµÑ","emailBody":"Đ¡ÑĐ´ÑÑ€Đ¶Đ°Đ½Đ¸Đµ","emailSubject":"Đ¢ĐµĐ¼Đ°","id":"ID","info":"Đ˜Đ½Ñ„Đ¾ Đ·Đ° Đ²Ñ€ÑĐ·ĐºĐ°Ñ‚Đ°","langCode":"ĐĐ¾Đ´ Đ·Đ° ĐµĐ·Đ¸ĐºĐ°","langDir":"ĐŸĐ¾ÑĐ¾ĐºĐ° Đ½Đ° ĐµĐ·Đ¸ĐºĐ°","langDirLTR":"Đ›ÑĐ²Đ¾ Đ½Đ° Đ”ÑÑĐ½Đ¾ (Đ›Đ½Đ”)","langDirRTL":"Đ”ÑÑĐ½Đ¾ Đ½Đ° Đ›ÑĐ²Đ¾ (Đ”Đ½Đ›)","menu":"ĐŸÑ€Đ¾Đ¼ÑĐ½Đ° Đ½Đ° Đ²Ñ€ÑĐ·ĐºĐ°","name":"Đ˜Đ¼Đµ","noAnchors":"(ĐÑĐ¼Đ° ĐºĐ¾Ñ‚Đ²Đ¸ Đ² Ñ‚ĐµĐºÑƒÑ‰Đ¸Ñ Đ´Đ¾ĐºÑƒĐ¼ĐµĐ½Ñ‚)","noEmail":"ĐœĐ¾Đ»Ñ Đ²ÑĐ²ĐµĐ´ĐµÑ‚Đµ e-mail aĐ´Ñ€ĐµÑ","noUrl":"ĐœĐ¾Đ»Ñ Đ²ÑĐ²ĐµĐ´ĐµÑ‚Đµ URL Đ°Đ´Ñ€ĐµÑĐ°","other":"<Đ´Ñ€ÑƒĐ³Đ¾>","popupDependent":"Đ—Đ°Đ²Đ¸ÑĐ¸Đ¼Đ¾ÑÑ‚ (Netscape)","popupFeatures":"Đ¤ÑƒĐ½ĐºÑ†Đ¸Đ¸ Đ½Đ° Đ¸Đ·ĐºĐ°Ñ‡Đ°Ñ‰ Đ¿Ñ€Đ¾Đ·Đ¾Ñ€ĐµÑ†","popupFullScreen":"ЦÑĐ» ĐµĐºÑ€Đ°Đ½ (IE)","popupLeft":"Đ›ÑĐ²Đ° Đ¿Đ¾Đ·Đ¸Ñ†Đ¸Ñ","popupLocationBar":"Đ›ĐµĐ½Ñ‚Đ° Ñ Đ»Đ¾ĐºĐ°Ñ†Đ¸ÑÑ‚Đ°","popupMenuBar":"Đ›ĐµĐ½Ñ‚Đ° Đ·Đ° Đ¼ĐµĐ½Ñ","popupResizable":"ĐÑ€Đ°Đ·Đ¼ĐµÑ€ÑĐµĐ¼","popupScrollBars":"Đ¡ĐºÑ€Đ¾Đ»ĐµÑ€Đ¸","popupStatusBar":"Đ¡Ñ‚Đ°Ñ‚ÑƒÑĐ½Đ° Đ»ĐµĐ½Ñ‚Đ°","popupToolbar":"Đ›ĐµĐ½Ñ‚Đ° Ñ Đ¸Đ½ÑÑ‚Ñ€ÑƒĐ¼ĐµĐ½Ñ‚Đ¸","popupTop":"Đ“Đ¾Ñ€Đ½Đ° Đ¿Đ¾Đ·Đ¸Ñ†Đ¸Ñ","rel":"Đ’Ñ€ÑĐ·ĐºĐ°","selectAnchor":"Đ˜Đ·Đ±ĐµÑ€ĐµÑ‚Đµ ĐºĐ¾Ñ‚Đ²Đ°","styles":"Đ¡Ñ‚Đ¸Đ»","tabIndex":"Ред Đ½Đ° Đ´Đ¾ÑÑ‚ÑĐ¿","target":"Цел","targetFrame":"<frame>","targetFrameName":"Đ˜Đ¼Đµ Đ½Đ° Ñ†ĐµĐ»ĐµĐ²Đ¸ÑÑ‚ Đ¿Ñ€Đ¾Đ·Đ¾Ñ€ĐµÑ†","targetPopup":"<Đ¸Đ·ĐºĐ°Ñ‡Đ°Ñ‰ Đ¿Ñ€Đ¾Đ·Đ¾Ñ€ĐµÑ†>","targetPopupName":"Đ˜Đ¼Đµ Đ½Đ° Đ¸Đ·ĐºĐ°Ñ‡Đ°Ñ‰ Đ¿Ñ€Đ¾Đ·Đ¾Ñ€ĐµÑ†","title":"Đ’Ñ€ÑĐ·ĐºĐ°","toAnchor":"Đ’Ñ€ÑĐ·ĐºĐ° ĐºÑĐ¼ ĐºĐ¾Ñ‚Đ²Đ° Đ² Ñ‚ĐµĐºÑÑ‚Đ°","toEmail":"E-mail","toUrl":"Đ£ĐµĐ± Đ°Đ´Ñ€ĐµÑ","toolbar":"Đ’Ñ€ÑĐ·ĐºĐ°","type":"Đ¢Đ¸Đ¿ Đ½Đ° Đ²Ñ€ÑĐ·ĐºĐ°Ñ‚Đ°","unlink":"ĐŸÑ€ĐµĐ¼Đ°Ñ…Đ½Đ¸ Đ²Ñ€ÑĐ·ĐºĐ°Ñ‚Đ°","upload":"ĐĐ°Ñ‡Đ²Đ°Đ½Đµ"},"list":{"bulletedlist":"Đ’Đ¼ÑĐºĐ²Đ°Đ½Đµ/ĐŸÑ€ĐµĐ¼Đ°Ñ…Đ²Đ°Đ½Đµ Đ½Đ° Ñ‚Đ¾Ñ‡ĐºĐ¾Đ² ÑĐ¿Đ¸ÑÑĐº","numberedlist":"Đ’Đ¼ÑĐºĐ²Đ°Đ½Đµ/ĐŸÑ€ĐµĐ¼Đ°Ñ…Đ²Đ°Đ½Đµ Đ½Đ° Đ½Đ¾Đ¼ĐµÑ€Đ¸Ñ€Đ°Đ½ ÑĐ¿Đ¸ÑÑĐº"},"magicline":{"title":"Đ’Đ¼ÑĐºĐ½ĐµÑ‚Đµ Đ¿Đ°Ñ€Đ°Đ³Ñ€Đ°Ñ„ Ñ‚ÑƒĐº"},"maximize":{"maximize":"ĐœĐ°ĐºÑĐ¸Đ¼Đ¸Đ·Đ¸Ñ€Đ°Đ½Đµ","minimize":"ĐœĐ¸Đ½Đ¸Đ¼Đ¸Đ·Đ¸Ñ€Đ°Đ½Đµ"},"pastetext":{"button":"Đ’Đ¼ÑĐºĐ½Đ¸ ĐºĐ°Ñ‚Đ¾ Ñ‡Đ¸ÑÑ‚ Ñ‚ĐµĐºÑÑ‚","title":"Đ’Đ¼ÑĐºĐ½Đ¸ ĐºĐ°Ñ‚Đ¾ Ñ‡Đ¸ÑÑ‚ Ñ‚ĐµĐºÑÑ‚"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Đ’Đ¼ÑĐºĐ½Đ¸ Đ¾Ñ‚ MS Word","toolbar":"Đ’Đ¼ÑĐºĐ½Đ¸ Đ¾Ñ‚ MS Word"},"removeformat":{"toolbar":"ĐŸÑ€ĐµĐ¼Đ°Ñ…Đ²Đ°Đ½Đµ Đ½Đ° Ñ„Đ¾Ñ€Đ¼Đ°Ñ‚Đ¸Ñ€Đ°Đ½ĐµÑ‚Đ¾"},"sourcearea":{"toolbar":"Đ˜Đ·Ñ‚Đ¾Ñ‡Đ½Đ¸Đº"},"specialchar":{"options":"ĐĐ¿Ñ†Đ¸Đ¸ Đ·Đ° ÑĐ¿ĐµÑ†Đ¸Đ°Đ»ĐµĐ½ Đ·Đ½Đ°Đº","title":"Đ˜Đ·Đ±Đ¾Ñ€ Đ½Đ° ÑĐ¿ĐµÑ†Đ¸Đ°Đ»ĐµĐ½ Đ·Đ½Đ°Đº","toolbar":"Đ’Đ¼ÑĐºĐ²Đ°Đ½Đµ Đ½Đ° ÑĐ¿ĐµÑ†Đ¸Đ°Đ»ĐµĐ½ Đ·Đ½Đ°Đº"},"scayt":{"btn_about":"About SCAYT","btn_dictionaries":"Đ ĐµÑ‡Đ½Đ¸Ñ†Đ¸","btn_disable":"Disable SCAYT","btn_enable":"Enable SCAYT","btn_langs":"Languages","btn_options":"Options","text_title":"Spell Check As You Type"},"stylescombo":{"label":"Đ¡Ñ‚Đ¸Đ»Đ¾Đ²Đµ","panelTitle":"Đ¡Ñ‚Đ¸Đ»Đ¾Đ²Đµ Đ·Đ° Ñ„Đ¾Ñ€Đ¼Đ°Ñ‚Đ¸Ñ€Đ°Đ½Đµ","panelTitle1":"Đ‘Đ»Đ¾ĐºĐ¾Đ²Đ¸ ÑÑ‚Đ¸Đ»Đ¾Đ²Đµ","panelTitle2":"Đ’ÑÑ‚Ñ€ĐµÑˆĐ½Đ¸ ÑÑ‚Đ¸Đ»Đ¾Đ²Đµ","panelTitle3":"ĐĐ±ĐµĐºÑ‚Đ½Đ¸ ÑÑ‚Đ¸Đ»Đ¾Đ²Đµ"},"table":{"border":"Đ Đ°Đ·Đ¼ĐµÑ€ Đ½Đ° Ñ€Đ°Đ¼ĐºĐ°Ñ‚Đ°","caption":"Đ—Đ°Đ³Đ»Đ°Đ²Đ¸Đµ","cell":{"menu":"ĐĐ»ĐµÑ‚ĐºĐ°","insertBefore":"Đ’Đ¼ÑĐºĐ²Đ°Đ½Đµ Đ½Đ° ĐºĐ»ĐµÑ‚ĐºĐ° Đ¿Ñ€ĐµĐ´Đ¸","insertAfter":"Đ’Đ¼ÑĐºĐ²Đ°Đ½Đµ Đ½Đ° ĐºĐ»ĐµÑ‚ĐºĐ° Ñлед","deleteCell":"Đ˜Đ·Ñ‚Ñ€Đ¸Đ²Đ°Đ½Đµ Đ½Đ° ĐºĐ»ĐµÑ‚ĐºĐ¸","merge":"Đ¡Đ»Đ¸Đ²Đ°Đ½Đµ Đ½Đ° ĐºĐ»ĐµÑ‚ĐºĐ¸","mergeRight":"Đ¡Đ»Đ¸Đ²Đ°Đ½Đµ Đ² Đ´ÑÑĐ½Đ¾","mergeDown":"Merge Down","splitHorizontal":"Split Cell Horizontally","splitVertical":"Split Cell Vertically","title":"ĐĐ°ÑÑ‚Ñ€Đ¾Đ¹ĐºĐ¸ Đ½Đ° ĐºĐ»ĐµÑ‚ĐºĐ°Ñ‚Đ°","cellType":"Đ¢Đ¸Đ¿ Đ½Đ° ĐºĐ»ĐµÑ‚ĐºĐ°Ñ‚Đ°","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"ĐĐ²Ñ‚Đ¾. Đ¿Ñ€ĐµĐ½Đ¾Ñ","hAlign":"Đ¥Đ¾Ñ€Đ¸Đ·Đ¾Đ½Ñ‚Đ°Đ»Đ½Đ¾ Đ¿Đ¾Đ´Ñ€Đ°Đ²Đ½ÑĐ²Đ°Đ½Đµ","vAlign":"Đ’ĐµÑ€Ñ‚Đ¸ĐºĐ°Đ»Đ½Đ¾ Đ¿Đ¾Đ´Ñ€Đ°Đ²Đ½ÑĐ²Đ°Đ½Đµ","alignBaseline":"Đ‘Đ°Đ·Đ¾Đ²Đ° Đ»Đ¸Đ½Đ¸Ñ","bgColor":"Đ¤Đ¾Đ½","borderColor":"Đ¦Đ²ÑÑ‚ Đ½Đ° Ñ€Đ°Đ¼ĐºĐ°Ñ‚Đ°","data":"Đ”Đ°Đ½Đ½Đ¸","header":"Đ¥ĐµĐ´ÑÑ€","yes":"Да","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":"Đ˜Đ·Đ±ĐµÑ€ĐµÑ‚Đµ"},"cellPad":"ĐÑ‚Đ´ĐµĐ»ÑĐ½Đµ Đ½Đ° ĐºĐ»ĐµÑ‚ĐºĐ¸Ñ‚Đµ","cellSpace":"Đ Đ°Đ·Ñ‚Đ¾ÑĐ½Đ¸Đµ Đ¼ĐµĐ¶Đ´Ñƒ ĐºĐ»ĐµÑ‚ĐºĐ¸Ñ‚Đµ","column":{"menu":"ĐĐ¾Đ»Đ¾Đ½Đ°","insertBefore":"Đ’Đ¼ÑĐºĐ²Đ°Đ½Đµ Đ½Đ° ĐºĐ¾Đ»Đ¾Đ½Đ° Đ¿Ñ€ĐµĐ´Đ¸","insertAfter":"Đ’Đ¼ÑĐºĐ²Đ°Đ½Đµ Đ½Đ° ĐºĐ¾Đ»Đ¾Đ½Đ° Ñлед","deleteColumn":"Đ˜Đ·Ñ‚Ñ€Đ¸Đ²Đ°Đ½Đµ Đ½Đ° ĐºĐ¾Đ»Đ¾Đ½Đ¸"},"columns":"ĐĐ¾Đ»Đ¾Đ½Đ¸","deleteTable":"Đ˜Đ·Ñ‚Ñ€Đ¸Đ²Đ°Đ½Đµ Đ½Đ° Ñ‚Đ°Đ±Đ»Đ¸Ñ†Đ°","headers":"Đ¥ĐµĐ´ÑÑ€Đ¸","headersBoth":"Đ—Đ°ĐµĐ´Đ½Đ¾","headersColumn":"ĐŸÑÑ€Đ²Đ° ĐºĐ¾Đ»Đ¾Đ½Đ°","headersNone":"ĐÑĐ¼Đ°","headersRow":"ĐŸÑÑ€Đ²Đ¸ Ñ€ĐµĐ´","invalidBorder":"Đ Đ°Đ·Đ¼ĐµÑ€ÑÑ‚ Đ½Đ° Ñ€Đ°Đ¼ĐºĐ°Ñ‚Đ° Ñ‚Ñ€ÑĐ±Đ²Đ° Đ´Đ° е Ñ‡Đ¸ÑĐ»Đ¾.","invalidCellPadding":"ĐÑ‚ÑÑ‚Đ¾ÑĐ½Đ¸ĐµÑ‚Đ¾ Đ½Đ° ĐºĐ»ĐµÑ‚ĐºĐ¸Ñ‚Đµ Ñ‚Ñ€ÑĐ±Đ²Đ° Đ´Đ° е Đ¿Đ¾Đ·Đ¸Ñ‚Đ¸Đ²Đ½Đ¾ Ñ‡Đ¸ÑĐ»Đ¾.","invalidCellSpacing":"Đ˜Đ½Ñ‚ĐµÑ€Đ²Đ°Đ»Đ° Đ² ĐºĐ»ĐµÑ‚ĐºĐ¸Ñ‚Đµ Ñ‚Ñ€ÑĐ±Đ²Đ° Đ´Đ° е Đ¿Đ¾Đ·Đ¸Ñ‚Đ¸Đ²Đ½Đ¾ Ñ‡Đ¸ÑĐ»Đ¾.","invalidCols":"Đ‘Ñ€Đ¾ÑÑ‚ ĐºĐ¾Đ»Đ¾Đ½Đ¸ Ñ‚Ñ€ÑĐ±Đ²Đ° Đ´Đ° е Đ¿Đ¾-Đ³Đ¾Đ»ÑĐ¼ Đ¾Ñ‚ 0.","invalidHeight":"ВиÑĐ¾Ñ‡Đ¸Đ½Đ°Ñ‚Đ° Đ½Đ° Ñ‚Đ°Đ±Đ»Đ¸Ñ†Đ°Ñ‚Đ° Ñ‚Ñ€ÑĐ±Đ²Đ° Đ´Đ° е Ñ‡Đ¸ÑĐ»Đ¾.","invalidRows":"Đ‘Ñ€Đ¾ÑÑ‚ Ñ€ĐµĐ´Đ¾Đ²Đµ Ñ‚Ñ€ÑĐ±Đ²Đ° Đ´Đ° е Đ¿Đ¾-Đ³Đ¾Đ»ÑĐ¼ Đ¾Ñ‚ 0.","invalidWidth":"Đ¨Đ¸Ñ€Đ¸Đ½Đ°Ñ‚Đ° Đ½Đ° Ñ‚Đ°Đ±Đ»Đ¸Ñ†Đ°Ñ‚Đ° Ñ‚Ñ€ÑĐ±Đ²Đ° Đ´Đ° е Ñ‡Đ¸ÑĐ»Đ¾.","menu":"ĐĐ°ÑÑ‚Ñ€Đ¾Đ¹ĐºĐ¸ Đ½Đ° Ñ‚Đ°Đ±Đ»Đ¸Ñ†Đ°Ñ‚Đ°","row":{"menu":"Ред","insertBefore":"Đ’Đ¼ÑĐºĐ²Đ°Đ½Đµ Đ½Đ° Ñ€ĐµĐ´ Đ¿Ñ€ĐµĐ´Đ¸","insertAfter":"Đ’Đ¼ÑĐºĐ²Đ°Đ½Đµ Đ½Đ° Ñ€ĐµĐ´ Ñлед","deleteRow":"Đ˜Đ·Ñ‚Ñ€Đ¸Đ²Đ°Đ½Đµ Đ½Đ° Ñ€ĐµĐ´Đ¾Đ²Đµ"},"rows":"Đ ĐµĐ´Đ¾Đ²Đµ","summary":"ĐĐ±Ñ‰Đ° Đ¸Đ½Ñ„Đ¾Ñ€Đ¼Đ°Ñ†Đ¸Ñ","title":"ĐĐ°ÑÑ‚Ñ€Đ¾Đ¹ĐºĐ¸ Đ½Đ° Ñ‚Đ°Đ±Đ»Đ¸Ñ†Đ°Ñ‚Đ°","toolbar":"Đ¢Đ°Đ±Đ»Đ¸Ñ†Đ°","widthPc":"Đ¿Ñ€Đ¾Ñ†ĐµĐ½Ñ‚","widthPx":"Đ¿Đ¸ĐºÑела","widthUnit":"ĐµĐ´Đ¸Đ½Đ¸Ñ†Đ° Đ·Đ° ÑˆĐ¸Ñ€Đ¸Đ½Đ°"},"undo":{"redo":"Đ’Ñ€ÑÑ‰Đ°Đ½Đµ Đ½Đ° Đ¿Ñ€ĐµĐ´Đ¸ÑˆĐµĐ½ ÑÑ‚Đ°Ñ‚ÑƒÑ","undo":"Đ’ÑĐ·Ñ‚Đ°Đ½Đ¾Đ²Đ¸"},"wsc":{"btnIgnore":"Đ˜Đ³Đ½Đ¾Ñ€Đ¸Ñ€Đ°Đ¹","btnIgnoreAll":"Đ˜Đ³Đ½Đ¾Ñ€Đ¸Ñ€Đ°Đ¹ Đ²ÑĐ¸Ñ‡ĐºĐ¾","btnReplace":"ĐŸÑ€ĐµĐ¿Đ¾ĐºÑ€Đ¸Đ²Đ°Đ½Đµ","btnReplaceAll":"ĐŸÑ€ĐµĐ¿Đ¾ĐºÑ€Đ¸Đ¹ Đ²ÑĐ¸Ñ‡ĐºĐ¾","btnUndo":"Đ’ÑĐ·Ñ‚Đ°Đ½Đ¾Đ²Đ¸","changeTo":"ĐŸÑ€Đ¾Đ¼ĐµĐ½Đ¸ Đ½Đ°","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Spell checker not installed. Do you want to download it now?","manyChanges":"Spell check complete: %1 words changed","noChanges":"Spell check complete: No words changed","noMispell":"Spell check complete: No misspellings found","noSuggestions":"- ĐÑĐ¼Đ° Đ¿Ñ€ĐµĐ¿Đ¾Ñ€ÑÑ‡Đ°Đ½Đ¸ -","notAvailable":"Đ¡ÑжалÑĐ²Đ°Đ¼Đµ, Đ½Đ¾ уÑĐ»ÑƒĐ³Đ°Ñ‚Đ° Đ½Đµ е Đ´Đ¾ÑÑ‚ÑĐ¿Đ½Đ° Đ·Đ° Đ¼Đ¾Đ¼ĐµĐ½Ñ‚Đ°","notInDic":"Đе е Đ² Ñ€ĐµÑ‡Đ½Đ¸ĐºĐ°","oneChange":"Spell check complete: One word changed","progress":"ĐŸÑ€Đ¾Đ²ĐµÑ€ÑĐ²Đ° Ñе Đ¿Ñ€Đ°Đ²Đ¾Đ¿Đ¸ÑĐ°...","title":"ĐŸÑ€Đ¾Đ²ĐµÑ€ĐºĐ° Đ½Đ° Đ¿Ñ€Đ°Đ²Đ¾Đ¿Đ¸Ñ","toolbar":"ĐŸÑ€Đ¾Đ²ĐµÑ€ĐºĐ° Đ½Đ° Đ¿Ñ€Đ°Đ²Đ¾Đ¿Đ¸Ñ"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/bn.js b/js/ckeditor/lang/bn.js
new file mode 100644
index 0000000..2749a6a
--- /dev/null
+++ b/js/ckeditor/lang/bn.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['bn']={"editor":"Rich Text Editor","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Press ALT 0 for help","browseServer":"বà§à¦°à¦¾à¦‰à¦œ সারà§à¦­à¦¾à¦°","url":"URL","protocol":"পà§à¦°à§‹à¦Ÿà§‹à¦•à¦²","upload":"আপলোড","uploadSubmit":"ইহাকে সারà§à¦­à¦¾à¦°à§‡ পà§à¦°à§‡à¦°à¦¨ কর","image":"ছবির লেবেল যà§à¦•à§à¦¤ কর","flash":"ফà§à¦²à¦¾à¦¶ লেবেল যà§à¦•à§à¦¤ কর","form":"ফরà§à¦®","checkbox":"à¦à§‡à¦• বাকà§à¦¸","radio":"রেডিও বাটন","textField":"টেকà§à¦¸à¦Ÿ ফীলà§à¦¡","textarea":"টেকà§à¦¸à¦Ÿ à¦à¦°à¦¿à§Ÿà¦¾","hiddenField":"গà§à¦ªà§à¦¤ ফীলà§à¦¡","button":"বাটন","select":"বাছাই ফীলà§à¦¡","imageButton":"ছবির বাটন","notSet":"<সেট নেই>","id":"আইডি","name":"নাম","langDir":"ভাষা লেখার দিক","langDirLtr":"বাম থেকে ডান (LTR)","langDirRtl":"ডান থেকে বাম (RTL)","langCode":"ভাষা কোড","longDescr":"URL à¦à¦° লমà§à¦¬à¦¾ বরà§à¦£à¦¨à¦¾","cssClass":"সà§à¦Ÿà¦¾à¦‡à¦²-শীট কà§à¦²à¦¾à¦¸","advisoryTitle":"পরামরà§à¦¶ শীরà§à¦·à¦•","cssStyle":"সà§à¦Ÿà¦¾à¦‡à¦²","ok":"ওকে","cancel":"বাতিল","close":"Close","preview":"পà§à¦°à¦¿à¦­à¦¿à¦‰","resize":"Resize","generalTab":"General","advancedTab":"à¦à¦¡à¦­à¦¾à¦¨à§à¦¸à¦¡","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":"টারà§à¦—েট","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"বাম থেকে ডান (LTR)","langDirRTL":"ডান থেকে বাম (RTL)","styles":"সà§à¦Ÿà¦¾à¦‡à¦²","cssClasses":"সà§à¦Ÿà¦¾à¦‡à¦²-শীট কà§à¦²à¦¾à¦¸","width":"পà§à¦°à¦¸à§à¦¥","height":"দৈরà§à¦˜à§à¦¯","align":"à¦à¦²à¦¾à¦‡à¦¨","alignLeft":"বামে","alignRight":"ডানে","alignCenter":"মাà¦à¦–ানে","alignJustify":"বà§à¦²à¦• জাসà§à¦Ÿà¦¿à¦«à¦¾à¦‡","alignTop":"উপর","alignMiddle":"মধà§à¦¯","alignBottom":"নীà¦à§‡","alignNone":"None","invalidValue":"Invalid value.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","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>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"বোলà§à¦¡","italic":"ইটালিক","strike":"সà§à¦Ÿà§à¦°à¦¾à¦‡à¦• থà§à¦°à§","subscript":"অধোলেখ","superscript":"অভিলেখ","underline":"আনà§à¦¡à¦¾à¦°à¦²à¦¾à¦‡à¦¨"},"blockquote":{"toolbar":"Block Quote"},"clipboard":{"copy":"কপি","copyError":"আপনার বà§à¦°à¦¾à¦‰à¦œà¦¾à¦°à§‡à¦° সà§à¦°à¦•à§à¦·à¦¾ সেটিংস à¦à¦¡à¦¿à¦Ÿà¦°à¦•à§‡ অটোমেটিক কপি করার অনà§à¦®à¦¤à¦¿ দেয়নি। দয়া করে à¦à¦‡ কাজের জনà§à¦¯ কিবোরà§à¦¡ বà§à¦¯à¦¬à¦¹à¦¾à¦° করà§à¦¨ (Ctrl/Cmd+C)।","cut":"কাট","cutError":"আপনার বà§à¦°à¦¾à¦‰à¦œà¦¾à¦°à§‡à¦° সà§à¦°à¦•à§à¦·à¦¾ সেটিংস à¦à¦¡à¦¿à¦Ÿà¦°à¦•à§‡ অটোমেটিক কাট করার অনà§à¦®à¦¤à¦¿ দেয়নি। দয়া করে à¦à¦‡ কাজের জনà§à¦¯ কিবোরà§à¦¡ বà§à¦¯à¦¬à¦¹à¦¾à¦° করà§à¦¨ (Ctrl/Cmd+X)।","paste":"পেসà§à¦Ÿ","pasteArea":"Paste Area","pasteMsg":"অনà§à¦—à§à¦°à¦¹ করে নীà¦à§‡à¦° বাকà§à¦¸à§‡ কিবোরà§à¦¡ বà§à¦¯à¦¬à¦¹à¦¾à¦° করে (<STRONG>Ctrl/Cmd+V</STRONG>) পেসà§à¦Ÿ করà§à¦¨ à¦à¦¬à¦‚ <STRONG>OK</STRONG> à¦à¦¾à¦ª দিন","securityMsg":"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.","title":"পেসà§à¦Ÿ"},"contextmenu":{"options":"Context Menu Options"},"button":{"selectedLabel":"%1 (Selected)"},"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"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"format":{"label":"ফনà§à¦Ÿ ফরমেট","panelTitle":"ফনà§à¦Ÿ ফরমেট","tag_address":"ঠিকানা","tag_div":"শীরà§à¦·à¦• (DIV)","tag_h1":"শীরà§à¦·à¦• ১","tag_h2":"শীরà§à¦·à¦• ২","tag_h3":"শীরà§à¦·à¦• ৩","tag_h4":"শীরà§à¦·à¦• ৪","tag_h5":"শীরà§à¦·à¦• ৫","tag_h6":"শীরà§à¦·à¦• ৬","tag_p":"সাধারণ","tag_pre":"ফরà§à¦®à§‡à¦Ÿà§‡à¦¡"},"horizontalrule":{"toolbar":"রেখা যà§à¦•à§à¦¤ কর"},"image":{"alertUrl":"অনà§à¦—à§à¦°à¦¹à¦• করে ছবির URL টাইপ করà§à¦¨","alt":"বিকলà§à¦ª টেকà§à¦¸à¦Ÿ","border":"বরà§à¦¡à¦¾à¦°","btnUpload":"ইহাকে সারà§à¦­à¦¾à¦°à§‡ পà§à¦°à§‡à¦°à¦¨ কর","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"হরাইজনà§à¦Ÿà¦¾à¦² সà§à¦ªà§‡à¦¸","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"ছবির তথà§à¦¯","linkTab":"লিংক","lockRatio":"অনà§à¦ªà¦¾à¦¤ লক কর","menu":"ছবির পà§à¦°à§‹à¦ªà¦¾à¦°à§à¦Ÿà¦¿","resetSize":"সাইজ পূরà§à¦¬à¦¾à¦¬à¦¸à§à¦¥à¦¾à§Ÿ ফিরিয়ে দাও","title":"ছবির পà§à¦°à§‹à¦ªà¦¾à¦°à§à¦Ÿà¦¿","titleButton":"ছবি বাটন পà§à¦°à§‹à¦ªà¦¾à¦°à§à¦Ÿà¦¿","upload":"আপলোড","urlMissing":"Image source URL is missing.","vSpace":"ভারà§à¦Ÿà¦¿à¦•à§‡à¦² সà§à¦ªà§‡à¦¸","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"indent":{"indent":"ইনডেনà§à¦Ÿ বাড়াও","outdent":"ইনডেনà§à¦Ÿ কমাও"},"fakeobjects":{"anchor":"Anchor","flash":"Flash Animation","hiddenfield":"Hidden Field","iframe":"IFrame","unknown":"Unknown Object"},"link":{"acccessKey":"à¦à¦•à§à¦¸à§‡à¦¸ কী","advanced":"à¦à¦¡à¦­à¦¾à¦¨à§à¦¸à¦¡","advisoryContentType":"পরামরà§à¦¶ কনà§à¦Ÿà§‡à¦¨à§à¦Ÿà§‡à¦° পà§à¦°à¦•à¦¾à¦°","advisoryTitle":"পরামরà§à¦¶ শীরà§à¦·à¦•","anchor":{"toolbar":"নোঙà§à¦—র","menu":"নোঙর পà§à¦°à§‹à¦ªà¦¾à¦°à§à¦Ÿà¦¿","title":"নোঙর পà§à¦°à§‹à¦ªà¦¾à¦°à§à¦Ÿà¦¿","name":"নোঙরের নাম","errorName":"নোঙরের নাম টাইপ করà§à¦¨","remove":"Remove Anchor"},"anchorId":"নোঙরের আইডি দিয়ে","anchorName":"নোঙরের নাম দিয়ে","charset":"লিংক রিসোরà§à¦¸ কà§à¦¯à¦¾à¦°à§‡à¦•à§à¦Ÿà¦° সেট","cssClasses":"সà§à¦Ÿà¦¾à¦‡à¦²-শীট কà§à¦²à¦¾à¦¸","emailAddress":"ইমেইল ঠিকানা","emailBody":"মেসেজের দেহ","emailSubject":"মেসেজের বিষয়","id":"আইডি","info":"লিংক তথà§à¦¯","langCode":"ভাষা লেখার দিক","langDir":"ভাষা লেখার দিক","langDirLTR":"বাম থেকে ডান (LTR)","langDirRTL":"ডান থেকে বাম (RTL)","menu":"লিংক সমà§à¦ªà¦¾à¦¦à¦¨","name":"নাম","noAnchors":"(No anchors available in the document)","noEmail":"অনà§à¦—à§à¦°à¦¹ করে ইমেইল à¦à¦¡à§à¦°à§‡à¦¸ টাইপ করà§à¦¨","noUrl":"অনà§à¦—à§à¦°à¦¹ করে URL লিংক টাইপ করà§à¦¨","other":"<other>","popupDependent":"ডিপেনà§à¦¡à§‡à¦¨à§à¦Ÿ (Netscape)","popupFeatures":"পপআপ উইনà§à¦¡à§‹ ফীà¦à¦¾à¦° সমূহ","popupFullScreen":"পূরà§à¦£ পরà§à¦¦à¦¾ জà§à§œà§‡ (IE)","popupLeft":"বামের পজিশন","popupLocationBar":"লোকেশন বার","popupMenuBar":"মেনà§à¦¯à§ বার","popupResizable":"Resizable","popupScrollBars":"সà§à¦•à§à¦°à¦² বার","popupStatusBar":"সà§à¦Ÿà§à¦¯à¦¾à¦Ÿà¦¾à¦¸ বার","popupToolbar":"টà§à¦² বার","popupTop":"ডানের পজিশন","rel":"Relationship","selectAnchor":"নোঙর বাছাই","styles":"সà§à¦Ÿà¦¾à¦‡à¦²","tabIndex":"টà§à¦¯à¦¾à¦¬ ইনà§à¦¡à§‡à¦•à§à¦¸","target":"টারà§à¦—েট","targetFrame":"<ফà§à¦°à§‡à¦®>","targetFrameName":"টারà§à¦—েট ফà§à¦°à§‡à¦®à§‡à¦° নাম","targetPopup":"<পপআপ উইনà§à¦¡à§‹>","targetPopupName":"পপআপ উইনà§à¦¡à§‹à¦° নাম","title":"লিংক","toAnchor":"à¦à¦‡ পেজে নোঙর কর","toEmail":"ইমেইল","toUrl":"URL","toolbar":"লিংক যà§à¦•à§à¦¤ কর","type":"লিংক পà§à¦°à¦•à¦¾à¦°","unlink":"লিংক সরাও","upload":"আপলোড"},"list":{"bulletedlist":"বà§à¦²à§‡à¦Ÿ লিসà§à¦Ÿ লেবেল","numberedlist":"সাংখà§à¦¯à¦¿à¦• লিসà§à¦Ÿà§‡à¦° লেবেল"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximize","minimize":"Minimize"},"pastetext":{"button":"সাদা টেকà§à¦¸à¦Ÿ হিসেবে পেসà§à¦Ÿ কর","title":"সাদা টেকà§à¦¸à¦Ÿ হিসেবে পেসà§à¦Ÿ কর"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"পেসà§à¦Ÿ (শবà§à¦¦)","toolbar":"পেসà§à¦Ÿ (শবà§à¦¦)"},"removeformat":{"toolbar":"ফরমেট সরাও"},"sourcearea":{"toolbar":"সোরà§à¦¸"},"specialchar":{"options":"Special Character Options","title":"বিশেষ কà§à¦¯à¦¾à¦°à§‡à¦•à§à¦Ÿà¦¾à¦° বাছাই কর","toolbar":"বিশেষ অকà§à¦·à¦° যà§à¦•à§à¦¤ কর"},"scayt":{"btn_about":"About SCAYT","btn_dictionaries":"Dictionaries","btn_disable":"Disable SCAYT","btn_enable":"Enable SCAYT","btn_langs":"Languages","btn_options":"Options","text_title":"Spell Check As You Type"},"stylescombo":{"label":"সà§à¦Ÿà¦¾à¦‡à¦²","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"বরà§à¦¡à¦¾à¦° সাইজ","caption":"শীরà§à¦·à¦•","cell":{"menu":"সেল","insertBefore":"Insert Cell Before","insertAfter":"Insert Cell After","deleteCell":"সেল মà§à¦›à§‡ দাও","merge":"সেল জোড়া দাও","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":"সেল পà§à¦¯à¦¾à¦¡à¦¿à¦‚","cellSpace":"সেল সà§à¦ªà§‡à¦¸","column":{"menu":"কলাম","insertBefore":"Insert Column Before","insertAfter":"Insert Column After","deleteColumn":"কলাম মà§à¦›à§‡ দাও"},"columns":"কলাম","deleteTable":"টেবিল ডিলীট কর","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":"টেবিল পà§à¦°à§‹à¦ªà¦¾à¦°à§à¦Ÿà¦¿","row":{"menu":"রো","insertBefore":"Insert Row Before","insertAfter":"Insert Row After","deleteRow":"রো মà§à¦›à§‡ দাও"},"rows":"রো","summary":"সারাংশ","title":"টেবিল পà§à¦°à§‹à¦ªà¦¾à¦°à§à¦Ÿà¦¿","toolbar":"টেবিলের লেবেল যà§à¦•à§à¦¤ কর","widthPc":"শতকরা","widthPx":"পিকà§à¦¸à§‡à¦²","widthUnit":"width unit"},"undo":{"redo":"রি-ডà§","undo":"আনডà§"},"wsc":{"btnIgnore":"ইগনোর কর","btnIgnoreAll":"সব ইগনোর কর","btnReplace":"বদলে দাও","btnReplaceAll":"সব বদলে দাও","btnUndo":"আনà§à¦¡à§","changeTo":"à¦à¦¤à§‡ বদলাও","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"বানান পরীকà§à¦·à¦• ইনসà§à¦Ÿà¦² করা নেই। আপনি কি à¦à¦–নই à¦à¦Ÿà¦¾ ডাউনলোড করতে à¦à¦¾à¦¨?","manyChanges":"বানান পরীকà§à¦·à¦¾ শেষ: %1 গà§à¦²à§‹ শবà§à¦¦ বদলে গà§à¦¯à¦¾à¦›à§‡","noChanges":"বানান পরীকà§à¦·à¦¾ শেষ: কোন শবà§à¦¦ পরিবরà§à¦¤à¦¨ করা হয়নি","noMispell":"বানান পরীকà§à¦·à¦¾ শেষ: কোন ভà§à¦² বানান পাওয়া যায়নি","noSuggestions":"- কোন সাজেশন নেই -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"শবà§à¦¦à¦•à§‹à¦·à§‡ নেই","oneChange":"বানান পরীকà§à¦·à¦¾ শেষ: à¦à¦•à¦Ÿà¦¿ মাতà§à¦° শবà§à¦¦ পরিবরà§à¦¤à¦¨ করা হয়েছে","progress":"বানান পরীকà§à¦·à¦¾ à¦à¦²à¦›à§‡...","title":"Spell Checker","toolbar":"বানান à¦à§‡à¦•"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/bs.js b/js/ckeditor/lang/bs.js
new file mode 100644
index 0000000..e0d5eb8
--- /dev/null
+++ b/js/ckeditor/lang/bs.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['bs']={"editor":"Rich Text Editor","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Press ALT 0 for help","browseServer":"Browse Server","url":"URL","protocol":"Protokol","upload":"Å alji","uploadSubmit":"Å alji na server","image":"Slika","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":"<nije podeÅ¡eno>","id":"Id","name":"Naziv","langDir":"Smjer pisanja","langDirLtr":"S lijeva na desno (LTR)","langDirRtl":"S desna na lijevo (RTL)","langCode":"Jezièni kĂ´d","longDescr":"Dugaèki opis URL-a","cssClass":"Klase CSS stilova","advisoryTitle":"Advisory title","cssStyle":"Stil","ok":"OK","cancel":"Odustani","close":"Close","preview":"Prikaži","resize":"Resize","generalTab":"General","advancedTab":"Naprednije","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":"Prozor","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"S lijeva na desno (LTR)","langDirRTL":"S desna na lijevo (RTL)","styles":"Stil","cssClasses":"Klase CSS stilova","width":"Å irina","height":"Visina","align":"Poravnanje","alignLeft":"Lijevo","alignRight":"Desno","alignCenter":"Centar","alignJustify":"Puno poravnanje","alignTop":"Vrh","alignMiddle":"Sredina","alignBottom":"Dno","alignNone":"None","invalidValue":"Invalid value.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","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>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Boldiraj","italic":"Ukosi","strike":"Precrtaj","subscript":"Subscript","superscript":"Superscript","underline":"Podvuci"},"blockquote":{"toolbar":"Block Quote"},"clipboard":{"copy":"Kopiraj","copyError":"Sigurnosne postavke VaÅ¡eg pretraživaèa ne dozvoljavaju operacije automatskog kopiranja. Molimo koristite kraticu na tastaturi (Ctrl/Cmd+C).","cut":"Izreži","cutError":"Sigurnosne postavke vaÅ¡eg pretraživaèa ne dozvoljavaju operacije automatskog rezanja. Molimo koristite kraticu na tastaturi (Ctrl/Cmd+X).","paste":"Zalijepi","pasteArea":"Paste Area","pasteMsg":"Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK","securityMsg":"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.","title":"Zalijepi"},"contextmenu":{"options":"Context Menu Options"},"button":{"selectedLabel":"%1 (Selected)"},"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"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"format":{"label":"Format","panelTitle":"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":"Ubaci horizontalnu liniju"},"image":{"alertUrl":"Molimo ukucajte URL od slike.","alt":"Tekst na slici","border":"Okvir","btnUpload":"Å alji na 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":"Info slike","linkTab":"Link","lockRatio":"Zakljuèaj odnos","menu":"Svojstva slike","resetSize":"Resetuj dimenzije","title":"Svojstva slike","titleButton":"Image Button Properties","upload":"Å alji","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":"Poveæaj uvod","outdent":"Smanji uvod"},"fakeobjects":{"anchor":"Anchor","flash":"Flash Animation","hiddenfield":"Hidden Field","iframe":"IFrame","unknown":"Unknown Object"},"link":{"acccessKey":"Pristupna tipka","advanced":"Naprednije","advisoryContentType":"Advisory vrsta sadržaja","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":"Po Id-u elementa","anchorName":"Po nazivu sidra","charset":"Linked Resource Charset","cssClasses":"Klase CSS stilova","emailAddress":"E-Mail Adresa","emailBody":"Poruka","emailSubject":"Subjekt poruke","id":"Id","info":"Link info","langCode":"Smjer pisanja","langDir":"Smjer pisanja","langDirLTR":"S lijeva na desno (LTR)","langDirRTL":"S desna na lijevo (RTL)","menu":"Izmjeni link","name":"Naziv","noAnchors":"(Nema dostupnih sidra na stranici)","noEmail":"Molimo ukucajte e-mail adresu","noUrl":"Molimo ukucajte URL link","other":"<other>","popupDependent":"Ovisno (Netscape)","popupFeatures":"Moguænosti popup prozora","popupFullScreen":"Cijeli ekran (IE)","popupLeft":"Lijeva pozicija","popupLocationBar":"Traka za lokaciju","popupMenuBar":"Izborna traka","popupResizable":"Resizable","popupScrollBars":"Scroll traka","popupStatusBar":"Statusna traka","popupToolbar":"Traka sa alatima","popupTop":"Gornja pozicija","rel":"Relationship","selectAnchor":"Izaberi sidro","styles":"Stil","tabIndex":"Tab indeks","target":"Prozor","targetFrame":"<frejm>","targetFrameName":"Target Frame Name","targetPopup":"<popup prozor>","targetPopupName":"Naziv popup prozora","title":"Link","toAnchor":"Sidro na ovoj stranici","toEmail":"E-Mail","toUrl":"URL","toolbar":"Ubaci/Izmjeni link","type":"Tip linka","unlink":"IzbriÅ¡i link","upload":"Å alji"},"list":{"bulletedlist":"Lista","numberedlist":"Numerisana lista"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximize","minimize":"Minimize"},"pastetext":{"button":"Zalijepi kao obièan tekst","title":"Zalijepi kao obièan tekst"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Zalijepi iz Word-a","toolbar":"Zalijepi iz Word-a"},"removeformat":{"toolbar":"PoniÅ¡ti format"},"sourcearea":{"toolbar":"HTML kĂ´d"},"specialchar":{"options":"Special Character Options","title":"Izaberi specijalni karakter","toolbar":"Ubaci specijalni karater"},"scayt":{"btn_about":"About SCAYT","btn_dictionaries":"Dictionaries","btn_disable":"Disable SCAYT","btn_enable":"Enable SCAYT","btn_langs":"Languages","btn_options":"Options","text_title":"Spell Check As You Type"},"stylescombo":{"label":"Stil","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"Okvir","caption":"Naslov","cell":{"menu":"Cell","insertBefore":"Insert Cell Before","insertAfter":"Insert Cell After","deleteCell":"BriÅ¡i æelije","merge":"Spoji æelije","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":"Uvod æelija","cellSpace":"Razmak æelija","column":{"menu":"Column","insertBefore":"Insert Column Before","insertAfter":"Insert Column After","deleteColumn":"BriÅ¡i kolone"},"columns":"Kolona","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":"Svojstva tabele","row":{"menu":"Row","insertBefore":"Insert Row Before","insertAfter":"Insert Row After","deleteRow":"BriÅ¡i redove"},"rows":"Redova","summary":"Summary","title":"Svojstva tabele","toolbar":"Tabela","widthPc":"posto","widthPx":"piksela","widthUnit":"width unit"},"undo":{"redo":"Ponovi","undo":"Vrati"},"wsc":{"btnIgnore":"Ignore","btnIgnoreAll":"Ignore All","btnReplace":"Replace","btnReplaceAll":"Replace All","btnUndo":"Undo","changeTo":"Change to","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Spell checker not installed. Do you want to download it now?","manyChanges":"Spell check complete: %1 words changed","noChanges":"Spell check complete: No words changed","noMispell":"Spell check complete: No misspellings found","noSuggestions":"- No suggestions -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Not in dictionary","oneChange":"Spell check complete: One word changed","progress":"Spell check in progress...","title":"Spell Checker","toolbar":"Check Spelling"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/ca.js b/js/ckeditor/lang/ca.js
new file mode 100644
index 0000000..d52a596
--- /dev/null
+++ b/js/ckeditor/lang/ca.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['ca']={"editor":"Editor de text enriquit","editorPanel":"Panell de l'editor de text enriquit","common":{"editorHelp":"Premeu ALT 0 per ajuda","browseServer":"Veure servidor","url":"URL","protocol":"Protocol","upload":"Puja","uploadSubmit":"Envia-la al servidor","image":"Imatge","flash":"Flash","form":"Formulari","checkbox":"Casella de verificaciĂ³","radio":"BotĂ³ d'opciĂ³","textField":"Camp de text","textarea":"Ă€rea de text","hiddenField":"Camp ocult","button":"BotĂ³","select":"Camp de selecciĂ³","imageButton":"BotĂ³ d'imatge","notSet":"<no definit>","id":"Id","name":"Nom","langDir":"DirecciĂ³ de l'idioma","langDirLtr":"D'esquerra a dreta (LTR)","langDirRtl":"De dreta a esquerra (RTL)","langCode":"Codi d'idioma","longDescr":"DescripciĂ³ llarga de la URL","cssClass":"Classes del full d'estil","advisoryTitle":"TĂ­tol consultiu","cssStyle":"Estil","ok":"D'acord","cancel":"Cancel·la","close":"Tanca","preview":"Previsualitza","resize":"Arrossegueu per redimensionar","generalTab":"General","advancedTab":"Avançat","validateNumberFailed":"Aquest valor no Ă©s un nĂºmero.","confirmNewPage":"Els canvis en aquest contingut que no es desin es perdran. Esteu segur que voleu carregar una pĂ gina nova?","confirmCancel":"Algunes opcions s'han canviat. Esteu segur que voleu tancar el quadre de diĂ leg?","options":"Opcions","target":"DestĂ­","targetNew":"Nova finestra (_blank)","targetTop":"Finestra superior (_top)","targetSelf":"Mateixa finestra (_self)","targetParent":"Finestra pare (_parent)","langDirLTR":"D'esquerra a dreta (LTR)","langDirRTL":"De dreta a esquerra (RTL)","styles":"Estil","cssClasses":"Classes del full d'estil","width":"Amplada","height":"Alçada","align":"AlineaciĂ³","alignLeft":"Ajusta a l'esquerra","alignRight":"Ajusta a la dreta","alignCenter":"Centre","alignJustify":"Justificat","alignTop":"Superior","alignMiddle":"Centre","alignBottom":"Inferior","alignNone":"None","invalidValue":"Valor no vĂ lid.","invalidHeight":"L'alçada ha de ser un nĂºmero.","invalidWidth":"L'amplada ha de ser un nĂºmero.","invalidCssLength":"El valor especificat per als \"%1\" camps ha de ser un nĂºmero positiu amb o sense unitat de mesura vĂ lida de CSS (px, %, in, cm, mm, em, ex, pt o pc).","invalidHtmlLength":"El valor especificat per als \"%1\" camps ha de ser un nĂºmero positiu amb o sense unitat de mesura vĂ lida d'HTML (px o %).","invalidInlineStyle":"El valor especificat per l'estil en lĂ­nia ha de constar d'una o mĂ©s tuples amb el format \"name: value\", separats per punt i coma.","cssLengthTooltip":"IntroduĂ¯u un nĂºmero per un valor en pĂ­xels o un nĂºmero amb una unitat vĂ lida de CSS (px, %, in, cm, mm, em, ex, pt o pc).","unavailable":"%1<span class=\"cke_accessibility\">, no disponible</span>"},"about":{"copy":"Copyright &copy; $1. Tots els drets reservats.","dlgTitle":"Quant al CKEditor","help":"Premi $1 per obtenir ajuda.","moreInfo":"Per informaciĂ³ sobre llicències visiteu el nostre lloc web:","title":"Quant al CKEditor","userGuide":"Manual d'usuari de CKEditor"},"basicstyles":{"bold":"Negreta","italic":"Cursiva","strike":"Ratllat","subscript":"SubĂ­ndex","superscript":"SuperĂ­ndex","underline":"Subratllat"},"blockquote":{"toolbar":"Bloc de cita"},"clipboard":{"copy":"Copiar","copyError":"La configuraciĂ³ de seguretat del vostre navegador no permet executar automĂ ticament les operacions de copiar. Si us plau, utilitzeu el teclat (Ctrl/Cmd+C).","cut":"Retallar","cutError":"La configuraciĂ³ de seguretat del vostre navegador no permet executar automĂ ticament les operacions de retallar. Si us plau, utilitzeu el teclat (Ctrl/Cmd+X).","paste":"Enganxar","pasteArea":"Ă€rea d'enganxat","pasteMsg":"Si us plau, enganxi dins del segĂ¼ent camp utilitzant el teclat (<strong>Ctrl/Cmd+V</strong>) i premi OK.","securityMsg":"A causa de la configuraciĂ³ de seguretat del vostre navegador, l'editor no pot accedir a les dades del porta-retalls directament. Enganxeu-ho un altre cop en aquesta finestra.","title":"Enganxar"},"contextmenu":{"options":"Opcions del menĂº contextual"},"button":{"selectedLabel":"%1 (Seleccionat)"},"toolbar":{"toolbarCollapse":"Redueix la barra d'eines","toolbarExpand":"Amplia la barra d'eines","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 de barra d'eines"},"elementspath":{"eleLabel":"Ruta dels elements","eleTitle":"%1 element"},"format":{"label":"Format","panelTitle":"Format","tag_address":"Adreça","tag_div":"Normal (DIV)","tag_h1":"Encapçalament 1","tag_h2":"Encapçalament 2","tag_h3":"Encapçalament 3","tag_h4":"Encapçalament 4","tag_h5":"Encapçalament 5","tag_h6":"Encapçalament 6","tag_p":"Normal","tag_pre":"Formatejat"},"horizontalrule":{"toolbar":"Insereix lĂ­nia horitzontal"},"image":{"alertUrl":"Si us plau, escriviu la URL de la imatge","alt":"Text alternatiu","border":"Vora","btnUpload":"Envia-la al servidor","button2Img":"Voleu transformar el botĂ³ d'imatge seleccionat en una simple imatge?","hSpace":"Espaiat horit.","img2Button":"Voleu transformar la imatge seleccionada en un botĂ³ d'imatge?","infoTab":"InformaciĂ³ de la imatge","linkTab":"Enllaç","lockRatio":"Bloqueja les proporcions","menu":"Propietats de la imatge","resetSize":"Restaura la mida","title":"Propietats de la imatge","titleButton":"Propietats del botĂ³ d'imatge","upload":"Puja","urlMissing":"Falta la URL de la imatge.","vSpace":"Espaiat vert.","validateBorder":"La vora ha de ser un nombre enter.","validateHSpace":"HSpace ha de ser un nombre enter.","validateVSpace":"VSpace ha de ser un nombre enter."},"indent":{"indent":"Augmenta el sagnat","outdent":"Redueix el sagnat"},"fakeobjects":{"anchor":"Ă€ncora","flash":"AnimaciĂ³ Flash","hiddenfield":"Camp ocult","iframe":"IFrame","unknown":"Objecte desconegut"},"link":{"acccessKey":"Clau d'accĂ©s","advanced":"Avançat","advisoryContentType":"Tipus de contingut consultiu","advisoryTitle":"TĂ­tol consultiu","anchor":{"toolbar":"Insereix/Edita Ă ncora","menu":"Propietats de l'Ă ncora","title":"Propietats de l'Ă ncora","name":"Nom de l'Ă ncora","errorName":"Si us plau, escriviu el nom de l'ancora","remove":"Remove Anchor"},"anchorId":"Per Id d'element","anchorName":"Per nom d'Ă ncora","charset":"Conjunt de carĂ cters font enllaçat","cssClasses":"Classes del full d'estil","emailAddress":"Adreça de correu electrĂ²nic","emailBody":"Cos del missatge","emailSubject":"Assumpte del missatge","id":"Id","info":"InformaciĂ³ de l'enllaç","langCode":"DirecciĂ³ de l'idioma","langDir":"DirecciĂ³ de l'idioma","langDirLTR":"D'esquerra a dreta (LTR)","langDirRTL":"De dreta a esquerra (RTL)","menu":"Edita l'enllaç","name":"Nom","noAnchors":"(No hi ha Ă ncores disponibles en aquest document)","noEmail":"Si us plau, escrigui l'adreça correu electrĂ²nic","noUrl":"Si us plau, escrigui l'enllaç URL","other":"<altre>","popupDependent":"Depenent (Netscape)","popupFeatures":"CaracterĂ­stiques finestra popup","popupFullScreen":"Pantalla completa (IE)","popupLeft":"PosiciĂ³ esquerra","popupLocationBar":"Barra d'adreça","popupMenuBar":"Barra de menĂº","popupResizable":"Redimensionable","popupScrollBars":"Barres d'scroll","popupStatusBar":"Barra d'estat","popupToolbar":"Barra d'eines","popupTop":"PosiciĂ³ dalt","rel":"RelaciĂ³","selectAnchor":"Selecciona una Ă ncora","styles":"Estil","tabIndex":"Index de Tab","target":"DestĂ­","targetFrame":"<marc>","targetFrameName":"Nom del marc de destĂ­","targetPopup":"<finestra emergent>","targetPopupName":"Nom finestra popup","title":"Enllaç","toAnchor":"Ă€ncora en aquesta pĂ gina","toEmail":"Correu electrĂ²nic","toUrl":"URL","toolbar":"Insereix/Edita enllaç","type":"Tipus d'enllaç","unlink":"Elimina l'enllaç","upload":"Puja"},"list":{"bulletedlist":"Llista de pics","numberedlist":"Llista numerada"},"magicline":{"title":"Insereix el parĂ graf aquĂ­"},"maximize":{"maximize":"Maximitza","minimize":"Minimitza"},"pastetext":{"button":"Enganxa com a text no formatat","title":"Enganxa com a text no formatat"},"pastefromword":{"confirmCleanup":"El text que voleu enganxar sembla provenir de Word. Voleu netejar aquest text abans que sigui enganxat?","error":"No ha estat possible netejar les dades enganxades degut a un error intern","title":"Enganxa des del Word","toolbar":"Enganxa des del Word"},"removeformat":{"toolbar":"Elimina Format"},"sourcearea":{"toolbar":"Codi font"},"specialchar":{"options":"Opcions de carĂ cters especials","title":"Selecciona el carĂ cter especial","toolbar":"Insereix carĂ cter especial"},"scayt":{"btn_about":"Quant a l'SCAYT","btn_dictionaries":"Diccionaris","btn_disable":"Deshabilita SCAYT","btn_enable":"Habilitat l'SCAYT","btn_langs":"Idiomes","btn_options":"Opcions","text_title":"Spell Check As You Type"},"stylescombo":{"label":"Estil","panelTitle":"Estils de format","panelTitle1":"Estils de bloc","panelTitle2":"Estils incrustats","panelTitle3":"Estils d'objecte"},"table":{"border":"Mida vora","caption":"TĂ­tol","cell":{"menu":"Cel·la","insertBefore":"Insereix abans","insertAfter":"Insereix desprĂ©s","deleteCell":"Suprimeix","merge":"Fusiona","mergeRight":"Fusiona a la dreta","mergeDown":"Fusiona avall","splitHorizontal":"Divideix horitzontalment","splitVertical":"Divideix verticalment","title":"Propietats de la cel·la","cellType":"Tipus de cel·la","rowSpan":"ExpansiĂ³ de files","colSpan":"ExpansiĂ³ de columnes","wordWrap":"Ajustar al contingut","hAlign":"AlineaciĂ³ Horizontal","vAlign":"AlineaciĂ³ Vertical","alignBaseline":"A la lĂ­nia base","bgColor":"Color de fons","borderColor":"Color de la vora","data":"Dades","header":"Capçalera","yes":"SĂ­","no":"No","invalidWidth":"L'amplada de cel·la ha de ser un nombre.","invalidHeight":"L'alçada de cel·la ha de ser un nombre.","invalidRowSpan":"L'expansiĂ³ de files ha de ser un nombre enter.","invalidColSpan":"L'expansiĂ³ de columnes ha de ser un nombre enter.","chooseColor":"Trieu"},"cellPad":"Encoixinament de cel·les","cellSpace":"Espaiat de cel·les","column":{"menu":"Columna","insertBefore":"Insereix columna abans de","insertAfter":"Insereix columna darrera","deleteColumn":"Suprimeix una columna"},"columns":"Columnes","deleteTable":"Suprimeix la taula","headers":"Capçaleres","headersBoth":"Ambdues","headersColumn":"Primera columna","headersNone":"Cap","headersRow":"Primera fila","invalidBorder":"El gruix de la vora ha de ser un nombre.","invalidCellPadding":"L'encoixinament de cel·la ha de ser un nombre.","invalidCellSpacing":"L'espaiat de cel·la ha de ser un nombre.","invalidCols":"El nombre de columnes ha de ser un nombre major que 0.","invalidHeight":"L'alçada de la taula ha de ser un nombre.","invalidRows":"El nombre de files ha de ser un nombre major que 0.","invalidWidth":"L'amplada de la taula ha de ser un nombre.","menu":"Propietats de la taula","row":{"menu":"Fila","insertBefore":"Insereix fila abans de","insertAfter":"Insereix fila darrera","deleteRow":"Suprimeix una fila"},"rows":"Files","summary":"Resum","title":"Propietats de la taula","toolbar":"Taula","widthPc":"percentatge","widthPx":"pĂ­xels","widthUnit":"unitat d'amplada"},"undo":{"redo":"RefĂ©s","undo":"DesfĂ©s"},"wsc":{"btnIgnore":"Ignora","btnIgnoreAll":"Ignora-les totes","btnReplace":"Canvia","btnReplaceAll":"Canvia-les totes","btnUndo":"DesfĂ©s","changeTo":"Reemplaça amb","errorLoading":"Error carregant el servidor: %s.","ieSpellDownload":"VerificaciĂ³ ortogrĂ fica no instal·lada. Voleu descarregar-ho ara?","manyChanges":"VerificaciĂ³ ortogrĂ fica: s'han canviat %1 paraules","noChanges":"VerificaciĂ³ ortogrĂ fica: no s'ha canviat cap paraula","noMispell":"VerificaciĂ³ ortogrĂ fica acabada: no hi ha cap paraula mal escrita","noSuggestions":"Cap suggeriment","notAvailable":"El servei no es troba disponible ara.","notInDic":"No Ă©s al diccionari","oneChange":"VerificaciĂ³ ortogrĂ fica: s'ha canviat una paraula","progress":"VerificaciĂ³ ortogrĂ fica en curs...","title":"Comprova l'ortografia","toolbar":"Revisa l'ortografia"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/cs.js b/js/ckeditor/lang/cs.js
new file mode 100644
index 0000000..86e5f56
--- /dev/null
+++ b/js/ckeditor/lang/cs.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['cs']={"editor":"TextovĂ½ editor","editorPanel":"Panel textovĂ©ho editoru","common":{"editorHelp":"StisknÄ›te ALT 0 pro nĂ¡povÄ›du","browseServer":"Vybrat na serveru","url":"URL","protocol":"Protokol","upload":"Odeslat","uploadSubmit":"Odeslat na server","image":"ObrĂ¡zek","flash":"Flash","form":"FormulĂ¡Å™","checkbox":"ZaÅ¡krtĂ¡vacĂ­ polĂ­Äko","radio":"PÅ™epĂ­naÄ","textField":"TextovĂ© pole","textarea":"TextovĂ¡ oblast","hiddenField":"SkrytĂ© pole","button":"TlaÄĂ­tko","select":"Seznam","imageButton":"ObrĂ¡zkovĂ© tlaÄĂ­tko","notSet":"<nenastaveno>","id":"Id","name":"JmĂ©no","langDir":"SmÄ›r jazyka","langDirLtr":"Zleva doprava (LTR)","langDirRtl":"Zprava doleva (RTL)","langCode":"KĂ³d jazyka","longDescr":"DlouhĂ½ popis URL","cssClass":"TÅ™Ă­da stylu","advisoryTitle":"PomocnĂ½ titulek","cssStyle":"Styl","ok":"OK","cancel":"ZruÅ¡it","close":"ZavÅ™Ă­t","preview":"NĂ¡hled","resize":"Uchopit pro zmÄ›nu velikosti","generalTab":"ObecnĂ©","advancedTab":"RozÅ¡Ă­Å™enĂ©","validateNumberFailed":"ZadanĂ¡ hodnota nenĂ­ ÄĂ­selnĂ¡.","confirmNewPage":"JakĂ©koliv neuloženĂ© zmÄ›ny obsahu budou ztraceny. SkuteÄnÄ› chcete otevÅ™Ă­t novou strĂ¡nku?","confirmCancel":"NÄ›kterĂ¡ z nastavenĂ­ byla zmÄ›nÄ›na. SkuteÄnÄ› chcete zavÅ™Ă­t dialogovĂ© okno?","options":"NastavenĂ­","target":"CĂ­l","targetNew":"NovĂ© okno (_blank)","targetTop":"Okno nejvyÅ¡Å¡Ă­ ĂºrovnÄ› (_top)","targetSelf":"StejnĂ© okno (_self)","targetParent":"RodiÄovskĂ© okno (_parent)","langDirLTR":"Zleva doprava (LTR)","langDirRTL":"Zprava doleva (RTL)","styles":"Styly","cssClasses":"TÅ™Ă­dy stylů","width":"Å Ă­Å™ka","height":"VĂ½Å¡ka","align":"ZarovnĂ¡nĂ­","alignLeft":"Vlevo","alignRight":"Vpravo","alignCenter":"Na stÅ™ed","alignJustify":"Zarovnat do bloku","alignTop":"Nahoru","alignMiddle":"Na stÅ™ed","alignBottom":"Dolů","alignNone":"Å½Ă¡dnĂ©","invalidValue":"NeplatnĂ¡ hodnota.","invalidHeight":"ZadanĂ¡ vĂ½Å¡ka musĂ­ bĂ½t ÄĂ­slo.","invalidWidth":"Å Ă­Å™ka musĂ­ bĂ½t ÄĂ­slo.","invalidCssLength":"Hodnota urÄenĂ¡ pro pole \"%1\" musĂ­ bĂ½t kladnĂ© ÄĂ­slo bez nebo s platnou jednotkou mĂ­ry CSS (px, %, in, cm, mm, em, ex, pt, nebo pc).","invalidHtmlLength":"Hodnota urÄenĂ¡ pro pole \"%1\" musĂ­ bĂ½t kladnĂ© ÄĂ­slo bez nebo s platnou jednotkou mĂ­ry HTML (px nebo %).","invalidInlineStyle":"Hodnota urÄenĂ¡ pro Å™Ă¡dkovĂ½ styl se musĂ­ sklĂ¡dat z jednĂ© nebo vĂ­ce n-tic ve formĂ¡tu \"nĂ¡zev : hodnota\", oddÄ›lenĂ© stÅ™ednĂ­ky","cssLengthTooltip":"Zadejte ÄĂ­slo jako hodnotu v pixelech nebo ÄĂ­slo s platnou jednotkou CSS (px, %, v cm, mm, em, ex, pt, nebo pc).","unavailable":"%1<span class=\"cke_accessibility\">, nedostupnĂ©</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"O aplikaci CKEditor","help":"ProhlĂ©dnÄ›te si $1 pro nĂ¡povÄ›du.","moreInfo":"Pro informace o lincenci navÅ¡tivte naÅ¡i webovou strĂ¡nku:","title":"O aplikaci CKEditor","userGuide":"UživatelskĂ¡ pÅ™Ă­ruÄka CKEditor"},"basicstyles":{"bold":"TuÄnĂ©","italic":"KurzĂ­va","strike":"PÅ™eÅ¡krtnutĂ©","subscript":"DolnĂ­ index","superscript":"HornĂ­ index","underline":"PodtrženĂ©"},"blockquote":{"toolbar":"Citace"},"clipboard":{"copy":"KopĂ­rovat","copyError":"BezpeÄnostnĂ­ nastavenĂ­ vaÅ¡eho prohlĂ­Å¾eÄe nedovolujĂ­ editoru spustit funkci pro kopĂ­rovĂ¡nĂ­ zvolenĂ©ho textu do schrĂ¡nky. ProsĂ­m zkopĂ­rujte zvolenĂ½ text do schrĂ¡nky pomocĂ­ klĂ¡vesnice (Ctrl/Cmd+C).","cut":"Vyjmout","cutError":"BezpeÄnostnĂ­ nastavenĂ­ vaÅ¡eho prohlĂ­Å¾eÄe nedovolujĂ­ editoru spustit funkci pro vyjmutĂ­ zvolenĂ©ho textu do schrĂ¡nky. ProsĂ­m vyjmÄ›te zvolenĂ½ text do schrĂ¡nky pomocĂ­ klĂ¡vesnice (Ctrl/Cmd+X).","paste":"Vložit","pasteArea":"Oblast vklĂ¡dĂ¡nĂ­","pasteMsg":"Do nĂ¡sledujĂ­cĂ­ho pole vložte požadovanĂ½ obsah pomocĂ­ klĂ¡vesnice (<STRONG>Ctrl/Cmd+V</STRONG>) a stisknÄ›te <STRONG>OK</STRONG>.","securityMsg":"Z důvodů nastavenĂ­ bezpeÄnosti vaÅ¡eho prohlĂ­Å¾eÄe nemůže editor pÅ™istupovat pÅ™Ă­mo do schrĂ¡nky. Obsah schrĂ¡nky prosĂ­m vložte znovu do tohoto okna.","title":"Vložit"},"contextmenu":{"options":"NastavenĂ­ kontextovĂ© nabĂ­dky"},"button":{"selectedLabel":"%1 (VybrĂ¡no)"},"toolbar":{"toolbarCollapse":"SkrĂ½t panel nĂ¡strojů","toolbarExpand":"Zobrazit panel nĂ¡strojů","toolbarGroups":{"document":"Dokument","clipboard":"SchrĂ¡nka/ZpÄ›t","editing":"Ăpravy","forms":"FormulĂ¡Å™e","basicstyles":"ZĂ¡kladnĂ­ styly","paragraph":"Odstavec","links":"Odkazy","insert":"Vložit","styles":"Styly","colors":"Barvy","tools":"NĂ¡stroje"},"toolbars":"Panely nĂ¡strojů editoru"},"elementspath":{"eleLabel":"Cesta objektu","eleTitle":"%1 objekt"},"format":{"label":"FormĂ¡t","panelTitle":"FormĂ¡t","tag_address":"Adresa","tag_div":"NormĂ¡lnĂ­ (DIV)","tag_h1":"Nadpis 1","tag_h2":"Nadpis 2","tag_h3":"Nadpis 3","tag_h4":"Nadpis 4","tag_h5":"Nadpis 5","tag_h6":"Nadpis 6","tag_p":"NormĂ¡lnĂ­","tag_pre":"NaformĂ¡tovĂ¡no"},"horizontalrule":{"toolbar":"Vložit vodorovnou linku"},"image":{"alertUrl":"Zadejte prosĂ­m URL obrĂ¡zku","alt":"AlternativnĂ­ text","border":"Okraje","btnUpload":"Odeslat na server","button2Img":"SkuteÄnÄ› chcete pÅ™evĂ©st zvolenĂ© obrĂ¡zkovĂ© tlaÄĂ­tko na obyÄejnĂ½ obrĂ¡zek?","hSpace":"HorizontĂ¡lnĂ­ mezera","img2Button":"SkuteÄnÄ› chcete pÅ™evĂ©st zvolenĂ½ obrĂ¡zek na obrĂ¡zkovĂ© tlaÄĂ­tko?","infoTab":"Informace o obrĂ¡zku","linkTab":"Odkaz","lockRatio":"ZĂ¡mek","menu":"Vlastnosti obrĂ¡zku","resetSize":"PůvodnĂ­ velikost","title":"Vlastnosti obrĂ¡zku","titleButton":"VlastnostĂ­ obrĂ¡zkovĂ©ho tlaÄĂ­tka","upload":"Odeslat","urlMissing":"ZadanĂ© URL zdroje obrĂ¡zku nebylo nalezeno.","vSpace":"VertikĂ¡lnĂ­ mezera","validateBorder":"Okraj musĂ­ bĂ½t nastaven v celĂ½ch ÄĂ­slech.","validateHSpace":"HorizontĂ¡lnĂ­ mezera musĂ­ bĂ½t nastavena v celĂ½ch ÄĂ­slech.","validateVSpace":"VertikĂ¡lnĂ­ mezera musĂ­ bĂ½t nastavena v celĂ½ch ÄĂ­slech."},"indent":{"indent":"ZvÄ›tÅ¡it odsazenĂ­","outdent":"ZmenÅ¡it odsazenĂ­"},"fakeobjects":{"anchor":"ZĂ¡ložka","flash":"Flash animace","hiddenfield":"SkrytĂ© pole","iframe":"IFrame","unknown":"NeznĂ¡mĂ½ objekt"},"link":{"acccessKey":"PÅ™Ă­stupovĂ½ klĂ­Ä","advanced":"RozÅ¡Ă­Å™enĂ©","advisoryContentType":"PomocnĂ½ typ obsahu","advisoryTitle":"PomocnĂ½ titulek","anchor":{"toolbar":"ZĂ¡ložka","menu":"Vlastnosti zĂ¡ložky","title":"Vlastnosti zĂ¡ložky","name":"NĂ¡zev zĂ¡ložky","errorName":"Zadejte prosĂ­m nĂ¡zev zĂ¡ložky","remove":"Odstranit zĂ¡ložku"},"anchorId":"Podle Id objektu","anchorName":"Podle jmĂ©na kotvy","charset":"PÅ™iÅ™azenĂ¡ znakovĂ¡ sada","cssClasses":"TÅ™Ă­da stylu","emailAddress":"E-mailovĂ¡ adresa","emailBody":"TÄ›lo zprĂ¡vy","emailSubject":"PÅ™edmÄ›t zprĂ¡vy","id":"Id","info":"Informace o odkazu","langCode":"KĂ³d jazyka","langDir":"SmÄ›r jazyka","langDirLTR":"Zleva doprava (LTR)","langDirRTL":"Zprava doleva (RTL)","menu":"ZmÄ›nit odkaz","name":"JmĂ©no","noAnchors":"(Ve strĂ¡nce nenĂ­ definovĂ¡na Å¾Ă¡dnĂ¡ kotva!)","noEmail":"Zadejte prosĂ­m e-mailovou adresu","noUrl":"Zadejte prosĂ­m URL odkazu","other":"<jinĂ½>","popupDependent":"ZĂ¡vislost (Netscape)","popupFeatures":"Vlastnosti vyskakovacĂ­ho okna","popupFullScreen":"CelĂ¡ obrazovka (IE)","popupLeft":"LevĂ½ okraj","popupLocationBar":"Panel umĂ­stÄ›nĂ­","popupMenuBar":"Panel nabĂ­dky","popupResizable":"UmožňujĂ­cĂ­ mÄ›nit velikost","popupScrollBars":"PosuvnĂ­ky","popupStatusBar":"StavovĂ½ Å™Ă¡dek","popupToolbar":"Panel nĂ¡strojů","popupTop":"HornĂ­ okraj","rel":"Vztah","selectAnchor":"Vybrat kotvu","styles":"Styl","tabIndex":"PoÅ™adĂ­ prvku","target":"CĂ­l","targetFrame":"<rĂ¡mec>","targetFrameName":"NĂ¡zev cĂ­lovĂ©ho rĂ¡mu","targetPopup":"<vyskakovacĂ­ okno>","targetPopupName":"NĂ¡zev vyskakovacĂ­ho okna","title":"Odkaz","toAnchor":"Kotva v tĂ©to strĂ¡nce","toEmail":"E-mail","toUrl":"URL","toolbar":"Odkaz","type":"Typ odkazu","unlink":"Odstranit odkaz","upload":"Odeslat"},"list":{"bulletedlist":"OdrĂ¡Å¾ky","numberedlist":"ÄŒĂ­slovĂ¡nĂ­"},"magicline":{"title":"zde vložit odstavec"},"maximize":{"maximize":"Maximalizovat","minimize":"Minimalizovat"},"pastetext":{"button":"Vložit jako ÄistĂ½ text","title":"Vložit jako ÄistĂ½ text"},"pastefromword":{"confirmCleanup":"Jak je vidÄ›t, vklĂ¡danĂ½ text je kopĂ­rovĂ¡n z Wordu. Chcete jej pÅ™ed vloženĂ­m vyÄistit?","error":"Z důvodu vnitÅ™nĂ­ chyby nebylo možnĂ© provĂ©st vyÄiÅ¡tÄ›nĂ­ vklĂ¡danĂ©ho textu.","title":"Vložit z Wordu","toolbar":"Vložit z Wordu"},"removeformat":{"toolbar":"Odstranit formĂ¡tovĂ¡nĂ­"},"sourcearea":{"toolbar":"Zdroj"},"specialchar":{"options":"NastavenĂ­ speciĂ¡lnĂ­ch znaků","title":"VĂ½bÄ›r speciĂ¡lnĂ­ho znaku","toolbar":"Vložit speciĂ¡lnĂ­ znaky"},"scayt":{"btn_about":"O aplikaci SCAYT","btn_dictionaries":"SlovnĂ­ky","btn_disable":"Vypnout SCAYT","btn_enable":"Zapnout SCAYT","btn_langs":"Jazyky","btn_options":"NastavenĂ­","text_title":"Kontrola pravopisu bÄ›hem psanĂ­ (SCAYT)"},"stylescombo":{"label":"Styl","panelTitle":"FormĂ¡tovacĂ­ styly","panelTitle1":"BlokovĂ© styly","panelTitle2":"Å˜Ă¡dkovĂ© styly","panelTitle3":"ObjektovĂ© styly"},"table":{"border":"OhraniÄenĂ­","caption":"Popis","cell":{"menu":"Buňka","insertBefore":"Vložit buňku pÅ™ed","insertAfter":"Vložit buňku za","deleteCell":"Smazat buňky","merge":"SlouÄit buňky","mergeRight":"SlouÄit doprava","mergeDown":"SlouÄit dolů","splitHorizontal":"RozdÄ›lit buňky vodorovnÄ›","splitVertical":"RozdÄ›lit buňky svisle","title":"Vlastnosti buňky","cellType":"Typ buňky","rowSpan":"Spojit Å™Ă¡dky","colSpan":"Spojit sloupce","wordWrap":"ZalamovĂ¡nĂ­","hAlign":"VodorovnĂ© zarovnĂ¡nĂ­","vAlign":"SvislĂ© zarovnĂ¡nĂ­","alignBaseline":"Na ĂºÄaÅ™Ă­","bgColor":"Barva pozadĂ­","borderColor":"Barva okraje","data":"Data","header":"HlaviÄka","yes":"Ano","no":"Ne","invalidWidth":"Å Ă­Å™ka buňky musĂ­ bĂ½t ÄĂ­slo.","invalidHeight":"ZadanĂ¡ vĂ½Å¡ka buňky musĂ­ bĂ½t ÄĂ­slenĂ¡.","invalidRowSpan":"ZadanĂ½ poÄet slouÄenĂ½ch Å™Ă¡dků musĂ­ bĂ½t celĂ© ÄĂ­slo.","invalidColSpan":"ZadanĂ½ poÄet slouÄenĂ½ch sloupců musĂ­ bĂ½t celĂ© ÄĂ­slo.","chooseColor":"VĂ½bÄ›r"},"cellPad":"OdsazenĂ­ obsahu v buňce","cellSpace":"VzdĂ¡lenost bunÄ›k","column":{"menu":"Sloupec","insertBefore":"Vložit sloupec pÅ™ed","insertAfter":"Vložit sloupec za","deleteColumn":"Smazat sloupec"},"columns":"Sloupce","deleteTable":"Smazat tabulku","headers":"ZĂ¡hlavĂ­","headersBoth":"ObojĂ­","headersColumn":"PrvnĂ­ sloupec","headersNone":"Å½Ă¡dnĂ©","headersRow":"PrvnĂ­ Å™Ă¡dek","invalidBorder":"ZdanĂ¡ velikost okraje musĂ­ bĂ½t ÄĂ­selnĂ¡.","invalidCellPadding":"ZadanĂ© odsazenĂ­ obsahu v buňce musĂ­ bĂ½t ÄĂ­selnĂ©.","invalidCellSpacing":"ZadanĂ¡ vzdĂ¡lenost bunÄ›k musĂ­ bĂ½t ÄĂ­selnĂ¡.","invalidCols":"PoÄet sloupců musĂ­ bĂ½t ÄĂ­slo vÄ›tÅ¡Ă­ než 0.","invalidHeight":"ZadanĂ¡ vĂ½Å¡ka tabulky musĂ­ bĂ½t ÄĂ­selnĂ¡.","invalidRows":"PoÄet Å™Ă¡dků musĂ­ bĂ½t ÄĂ­slo vÄ›tÅ¡Ă­ než 0.","invalidWidth":"Å Ă­Å™ka tabulky musĂ­ bĂ½t ÄĂ­slo.","menu":"Vlastnosti tabulky","row":{"menu":"Å˜Ă¡dek","insertBefore":"Vložit Å™Ă¡dek pÅ™ed","insertAfter":"Vložit Å™Ă¡dek za","deleteRow":"Smazat Å™Ă¡dky"},"rows":"Å˜Ă¡dky","summary":"Souhrn","title":"Vlastnosti tabulky","toolbar":"Tabulka","widthPc":"procent","widthPx":"bodů","widthUnit":"jednotka Å¡Ă­Å™ky"},"undo":{"redo":"Znovu","undo":"ZpÄ›t"},"wsc":{"btnIgnore":"PÅ™eskoÄit","btnIgnoreAll":"PÅ™eskakovat vÅ¡e","btnReplace":"ZamÄ›nit","btnReplaceAll":"Zaměňovat vÅ¡e","btnUndo":"ZpÄ›t","changeTo":"ZmÄ›nit na","errorLoading":"Chyba nahrĂ¡vĂ¡nĂ­ služby aplikace z: %s.","ieSpellDownload":"Kontrola pravopisu nenĂ­ nainstalovĂ¡na. Chcete ji nynĂ­ stĂ¡hnout?","manyChanges":"Kontrola pravopisu dokonÄena: %1 slov zmÄ›nÄ›no","noChanges":"Kontrola pravopisu dokonÄena: Beze zmÄ›n","noMispell":"Kontrola pravopisu dokonÄena: Å½Ă¡dnĂ© pravopisnĂ© chyby nenalezeny","noSuggestions":"- Å¾Ă¡dnĂ© nĂ¡vrhy -","notAvailable":"OmlouvĂ¡me se, ale služba nynĂ­ nenĂ­ dostupnĂ¡.","notInDic":"NenĂ­ ve slovnĂ­ku","oneChange":"Kontrola pravopisu dokonÄena: Jedno slovo zmÄ›nÄ›no","progress":"ProbĂ­hĂ¡ kontrola pravopisu...","title":"Kontrola pravopisu","toolbar":"Zkontrolovat pravopis"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/cy.js b/js/ckeditor/lang/cy.js
new file mode 100644
index 0000000..2a878ab
--- /dev/null
+++ b/js/ckeditor/lang/cy.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['cy']={"editor":"Golygydd Testun Cyfoethog","editorPanel":"Panel Golygydd Testun Cyfoethog","common":{"editorHelp":"Gwasgwch ALT 0 am gymorth","browseServer":"Pori'r Gweinydd","url":"URL","protocol":"Protocol","upload":"Lanlwytho","uploadSubmit":"Anfon i'r Gweinydd","image":"Delwedd","flash":"Flash","form":"Ffurflen","checkbox":"Blwch ticio","radio":"Botwm Radio","textField":"Maes Testun","textarea":"Ardal Testun","hiddenField":"Maes Cudd","button":"Botwm","select":"Maes Dewis","imageButton":"Botwm Delwedd","notSet":"<heb osod>","id":"Id","name":"Name","langDir":"Cyfeiriad Iaith","langDirLtr":"Chwith i'r Dde (LTR)","langDirRtl":"Dde i'r Chwith (RTL)","langCode":"Cod Iaith","longDescr":"URL Disgrifiad Hir","cssClass":"Dosbarthiadau Dalen Arddull","advisoryTitle":"Teitl Cynghorol","cssStyle":"Arddull","ok":"Iawn","cancel":"Diddymu","close":"Cau","preview":"Rhagolwg","resize":"Ailfeintio","generalTab":"Cyffredinol","advancedTab":"Uwch","validateNumberFailed":"'Dyw'r gwerth hwn ddim yn rhif.","confirmNewPage":"Byddwch chi'n colli unrhyw newidiadau i'r cynnwys sydd heb eu cadw. Ydych am barhau i lwytho tudalen newydd?","confirmCancel":"Cafodd rhai o'r opsiynau eu newid. Ydych chi wir am gau'r deialog?","options":"Opsiynau","target":"Targed","targetNew":"Ffenest Newydd (_blank)","targetTop":"Ffenest ar y Brig (_top)","targetSelf":"Yr un Ffenest (_self)","targetParent":"Ffenest y Rhiant (_parent)","langDirLTR":"Chwith i'r Dde (LTR)","langDirRTL":"Dde i'r Chwith (RTL)","styles":"Arddull","cssClasses":"Dosbarthiadau Dalen Arddull","width":"Lled","height":"Uchder","align":"Alinio","alignLeft":"Chwith","alignRight":"Dde","alignCenter":"Canol","alignJustify":"Unioni","alignTop":"Brig","alignMiddle":"Canol","alignBottom":"Gwaelod","alignNone":"None","invalidValue":"Gwerth annilys.","invalidHeight":"Mae'n rhaid i'r uchder fod yn rhif.","invalidWidth":"Mae'n rhaid i'r lled fod yn rhif.","invalidCssLength":"Mae'n rhaid i'r gwerth ar gyfer maes \"%1\" fod yn rhif positif gyda neu heb uned fesuriad CSS dilys (px, %, in, cm, mm, em, ex, pt, neu pc).","invalidHtmlLength":"Mae'n rhaid i'r gwerth ar gyfer maes \"%1\" fod yn rhif positif gyda neu heb uned fesuriad HTML dilys (px neu %).","invalidInlineStyle":"Mae'n rhaid i'r gwerth ar gyfer arddull mewn-llinell gynnwys un set neu fwy ar y fformat \"enw : gwerth\", wedi'u gwahanu gyda hanner colon.","cssLengthTooltip":"Rhowch rif am werth mewn picsel neu rhif gydag uned CSS dilys (px, %, in, cm, mm, em, pt neu pc).","unavailable":"%1<span class=\"cke_accessibility\">, ddim ar gael</span>"},"about":{"copy":"Hawlfraint &copy; $1. Cedwir pob hawl.","dlgTitle":"Ynghylch CKEditor","help":"Gwirio $1 am gymorth.","moreInfo":"Am wybodaeth ynghylch trwyddedau, ewch i'n gwefan:","title":"Ynghylch CKEditor","userGuide":"Canllawiau Defnyddiwr CKEditor"},"basicstyles":{"bold":"Bras","italic":"Italig","strike":"Llinell Trwyddo","subscript":"Is-sgript","superscript":"Uwchsgript","underline":"Tanlinellu"},"blockquote":{"toolbar":"Dyfyniad bloc"},"clipboard":{"copy":"CopĂ¯o","copyError":"'Dyw gosodiadau diogelwch eich porwr ddim yn caniatĂ u'r golygydd i gynnal 'gweithredoedd copĂ¯o' yn awtomatig. Defnyddiwch y bysellfwrdd (Ctrl/Cmd+C).","cut":"Torri","cutError":"Nid yw gosodiadau diogelwch eich porwr yn caniatĂ u'r golygydd i gynnal 'gweithredoedd torri' yn awtomatig. Defnyddiwch y bysellfwrdd (Ctrl/Cmd+X).","paste":"Gludo","pasteArea":"Ardal Gludo","pasteMsg":"Gludwch i mewn i'r blwch canlynol gan ddefnyddio'r bysellfwrdd (<strong>Ctrl/Cmd+V</strong>) a phwyso <strong>Iawn</strong>.","securityMsg":"Oherwydd gosodiadau diogelwch eich porwr, 'dyw'r porwr ddim yn gallu ennill mynediad i'r data ar y clipfwrdd yn uniongyrchol. Mae angen i chi ei ludo eto i'r ffenestr hon.","title":"Gludo"},"contextmenu":{"options":"Opsiynau Dewislen Cyd-destun"},"button":{"selectedLabel":"%1 (Selected)"},"toolbar":{"toolbarCollapse":"Cyfangu'r Bar Offer","toolbarExpand":"Ehangu'r Bar Offer","toolbarGroups":{"document":"Dogfen","clipboard":"Clipfwrdd/Dadwneud","editing":"Golygu","forms":"Ffurflenni","basicstyles":"Arddulliau Sylfaenol","paragraph":"Paragraff","links":"Dolenni","insert":"Mewnosod","styles":"Arddulliau","colors":"Lliwiau","tools":"Offer"},"toolbars":"Bariau offer y golygydd"},"elementspath":{"eleLabel":"Llwybr elfennau","eleTitle":"Elfen %1"},"format":{"label":"Fformat","panelTitle":"Fformat Paragraff","tag_address":"Cyfeiriad","tag_div":"Normal (DIV)","tag_h1":"Pennawd 1","tag_h2":"Pennawd 2","tag_h3":"Pennawd 3","tag_h4":"Pennawd 4","tag_h5":"Pennawd 5","tag_h6":"Pennawd 6","tag_p":"Normal","tag_pre":"Wedi'i Fformatio"},"horizontalrule":{"toolbar":"Mewnosod Llinell Lorweddol"},"image":{"alertUrl":"Rhowch URL y ddelwedd","alt":"Testun Amgen","border":"Ymyl","btnUpload":"Anfon i'r Gweinydd","button2Img":"Ydych am drawsffurfio'r botwm ddelwedd hwn ar ddelwedd syml?","hSpace":"BwlchLl","img2Button":"Ydych am drawsffurfio'r ddelwedd hon ar fotwm delwedd?","infoTab":"Gwyb Delwedd","linkTab":"Dolen","lockRatio":"Cloi Cymhareb","menu":"Priodweddau Delwedd","resetSize":"Ailosod Maint","title":"Priodweddau Delwedd","titleButton":"Priodweddau Botwm Delwedd","upload":"Lanlwytho","urlMissing":"URL gwreiddiol y ddelwedd ar goll.","vSpace":"BwlchF","validateBorder":"Rhaid i'r ymyl fod yn gyfanrif.","validateHSpace":"Rhaid i'r HSpace fod yn gyfanrif.","validateVSpace":"Rhaid i'r VSpace fod yn gyfanrif."},"indent":{"indent":"Cynyddu'r Mewnoliad","outdent":"Lleihau'r Mewnoliad"},"fakeobjects":{"anchor":"Angor","flash":"Animeiddiant Flash","hiddenfield":"Maes Cudd","iframe":"IFrame","unknown":"Gwrthrych Anhysbys"},"link":{"acccessKey":"Allwedd Mynediad","advanced":"Uwch","advisoryContentType":"Math y Cynnwys Cynghorol","advisoryTitle":"Teitl Cynghorol","anchor":{"toolbar":"Angor","menu":"Golygu'r Angor","title":"Priodweddau'r Angor","name":"Enw'r Angor","errorName":"Teipiwch enw'r angor","remove":"Tynnwch yr Angor"},"anchorId":"Gan Id yr Elfen","anchorName":"Gan Enw'r Angor","charset":"Set Nodau'r Adnodd Cysylltiedig","cssClasses":"Dosbarthiadau Dalen Arddull","emailAddress":"Cyfeiriad E-Bost","emailBody":"Corff y Neges","emailSubject":"Testun y Neges","id":"Id","info":"Gwyb y Ddolen","langCode":"Cod Iaith","langDir":"Cyfeiriad Iaith","langDirLTR":"Chwith i'r Dde (LTR)","langDirRTL":"Dde i'r Chwith (RTL)","menu":"Golygu Dolen","name":"Enw","noAnchors":"(Dim angorau ar gael yn y ddogfen)","noEmail":"Teipiwch gyfeiriad yr e-bost","noUrl":"Teipiwch URL y ddolen","other":"<eraill>","popupDependent":"Dibynnol (Netscape)","popupFeatures":"Nodweddion Ffenestr Bop","popupFullScreen":"Sgrin Llawn (IE)","popupLeft":"Safle Chwith","popupLocationBar":"Bar Safle","popupMenuBar":"Dewislen","popupResizable":"Ailfeintiol","popupScrollBars":"Barrau Sgrolio","popupStatusBar":"Bar Statws","popupToolbar":"Bar Offer","popupTop":"Safle Top","rel":"Perthynas","selectAnchor":"Dewiswch Angor","styles":"Arddull","tabIndex":"Indecs Tab","target":"Targed","targetFrame":"<ffrĂ¢m>","targetFrameName":"Enw FfrĂ¢m y Targed","targetPopup":"<ffenestr bop>","targetPopupName":"Enw Ffenestr Bop","title":"Dolen","toAnchor":"Dolen at angor yn y testun","toEmail":"E-bost","toUrl":"URL","toolbar":"Dolen","type":"Math y Ddolen","unlink":"Datgysylltu","upload":"Lanlwytho"},"list":{"bulletedlist":"Mewnosod/Tynnu Rhestr Bwled","numberedlist":"Mewnosod/Tynnu Rhestr Rhifol"},"magicline":{"title":"Mewnosod paragraff yma"},"maximize":{"maximize":"Mwyhau","minimize":"Lleihau"},"pastetext":{"button":"Gludo fel testun plaen","title":"Gludo fel Testun Plaen"},"pastefromword":{"confirmCleanup":"Mae'r testun rydych chi am ludo wedi'i gopĂ¯o o Word. Ydych chi am ei lanhau cyn ei ludo?","error":"Doedd dim modd glanhau y data a ludwyd oherwydd gwall mewnol","title":"Gludo o Word","toolbar":"Gludo o Word"},"removeformat":{"toolbar":"Tynnu Fformat"},"sourcearea":{"toolbar":"HTML"},"specialchar":{"options":"Opsiynau Nodau Arbennig","title":"Dewis Nod Arbennig","toolbar":"Mewnosod Nod Arbennig"},"scayt":{"btn_about":"Ynghylch SCAYT","btn_dictionaries":"Geiriaduron","btn_disable":"Analluogi SCAYT","btn_enable":"Galluogi SCAYT","btn_langs":"Ieithoedd","btn_options":"Opsiynau","text_title":"Gwirio'r Sillafu Wrth Deipio"},"stylescombo":{"label":"Arddulliau","panelTitle":"Arddulliau Fformatio","panelTitle1":"Arddulliau Bloc","panelTitle2":"Arddulliau Mewnol","panelTitle3":"Arddulliau Gwrthrych"},"table":{"border":"Maint yr Ymyl","caption":"Pennawd","cell":{"menu":"Cell","insertBefore":"Mewnosod Cell Cyn","insertAfter":"Mewnosod Cell Ar Ă”l","deleteCell":"Dileu Celloedd","merge":"Cyfuno Celloedd","mergeRight":"Cyfuno i'r Dde","mergeDown":"Cyfuno i Lawr","splitHorizontal":"Hollti'r Gell yn Lorweddol","splitVertical":"Hollti'r Gell yn Fertigol","title":"Priodweddau'r Gell","cellType":"Math y Gell","rowSpan":"Rhychwant Rhesi","colSpan":"Rhychwant Colofnau","wordWrap":"Lapio Geiriau","hAlign":"Aliniad Llorweddol","vAlign":"Aliniad Fertigol","alignBaseline":"Baslinell","bgColor":"Lliw Cefndir","borderColor":"Lliw Ymyl","data":"Data","header":"Pennyn","yes":"Ie","no":"Na","invalidWidth":"Mae'n rhaid i led y gell fod yn rhif.","invalidHeight":"Mae'n rhaid i uchder y gell fod yn rhif.","invalidRowSpan":"Mae'n rhaid i rychwant y rhesi fod yn gyfanrif.","invalidColSpan":"Mae'n rhaid i rychwant y colofnau fod yn gyfanrif.","chooseColor":"Dewis"},"cellPad":"Padio'r gell","cellSpace":"Bylchiad y gell","column":{"menu":"Colofn","insertBefore":"Mewnosod Colofn Cyn","insertAfter":"Mewnosod Colofn Ar Ă”l","deleteColumn":"Dileu Colofnau"},"columns":"Colofnau","deleteTable":"Dileu Tabl","headers":"Penynnau","headersBoth":"Y Ddau","headersColumn":"Colofn gyntaf","headersNone":"Dim","headersRow":"Rhes gyntaf","invalidBorder":"Mae'n rhaid i faint yr ymyl fod yn rhif.","invalidCellPadding":"Mae'n rhaid i badiad y gell fod yn rhif positif.","invalidCellSpacing":"Mae'n rhaid i fylchiad y gell fod yn rhif positif.","invalidCols":"Mae'n rhaid cael o leiaf un golofn.","invalidHeight":"Mae'n rhaid i uchder y tabl fod yn rhif.","invalidRows":"Mae'n rhaid cael o leiaf un rhes.","invalidWidth":"Mae'n rhaid i led y tabl fod yn rhif.","menu":"Priodweddau'r Tabl","row":{"menu":"Rhes","insertBefore":"Mewnosod Rhes Cyn","insertAfter":"Mewnosod Rhes Ar Ă”l","deleteRow":"Dileu Rhesi"},"rows":"Rhesi","summary":"Crynodeb","title":"Priodweddau'r Tabl","toolbar":"Tabl","widthPc":"y cant","widthPx":"picsel","widthUnit":"uned lled"},"undo":{"redo":"Ailwneud","undo":"Dadwneud"},"wsc":{"btnIgnore":"Anwybyddu Un","btnIgnoreAll":"Anwybyddu Pob","btnReplace":"Amnewid Un","btnReplaceAll":"Amnewid Pob","btnUndo":"Dadwneud","changeTo":"Newid i","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Gwirydd sillafu heb ei arsefydlu. A ydych am ei lawrlwytho nawr?","manyChanges":"Gwirio sillafu wedi gorffen: Newidiwyd %1 gair","noChanges":"Gwirio sillafu wedi gorffen: Dim newidiadau","noMispell":"Gwirio sillafu wedi gorffen: Dim camsillaf.","noSuggestions":"- Dim awgrymiadau -","notAvailable":"Nid yw'r gwasanaeth hwn ar gael yn bresennol.","notInDic":"Nid i'w gael yn y geiriadur","oneChange":"Gwirio sillafu wedi gorffen: Newidiwyd 1 gair","progress":"Gwirio sillafu yn ar y gweill...","title":"Gwirio Sillafu","toolbar":"Gwirio Sillafu"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/da.js b/js/ckeditor/lang/da.js
new file mode 100644
index 0000000..ab40a44
--- /dev/null
+++ b/js/ckeditor/lang/da.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['da']={"editor":"Rich Text Editor","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Tryk ALT 0 for hjælp","browseServer":"Gennemse...","url":"URL","protocol":"Protokol","upload":"Upload","uploadSubmit":"Upload","image":"Indsæt billede","flash":"Indsæt Flash","form":"Indsæt formular","checkbox":"Indsæt afkrydsningsfelt","radio":"Indsæt alternativknap","textField":"Indsæt tekstfelt","textarea":"Indsæt tekstboks","hiddenField":"Indsæt skjult felt","button":"Indsæt knap","select":"Indsæt liste","imageButton":"Indsæt billedknap","notSet":"<intet valgt>","id":"Id","name":"Navn","langDir":"Tekstretning","langDirLtr":"Fra venstre mod højre (LTR)","langDirRtl":"Fra højre mod venstre (RTL)","langCode":"Sprogkode","longDescr":"Udvidet beskrivelse","cssClass":"Typografiark (CSS)","advisoryTitle":"Titel","cssStyle":"Typografi (CSS)","ok":"OK","cancel":"AnnullĂ©r","close":"Luk","preview":"ForhĂ¥ndsvisning","resize":"Træk for at skalere","generalTab":"Generelt","advancedTab":"Avanceret","validateNumberFailed":"Værdien er ikke et tal.","confirmNewPage":"Alt indhold, der ikke er blevet gemt, vil gĂ¥ tabt. Er du sikker pĂ¥, at du vil indlæse en ny side?","confirmCancel":"Nogle af indstillingerne er blevet ændret. Er du sikker pĂ¥, at du vil lukke vinduet?","options":"Vis muligheder","target":"MĂ¥l","targetNew":"Nyt vindue (_blank)","targetTop":"Ă˜verste vindue (_top)","targetSelf":"Samme vindue (_self)","targetParent":"Samme vindue (_parent)","langDirLTR":"Venstre til højre (LTR)","langDirRTL":"Højre til venstre (RTL)","styles":"Style","cssClasses":"Stylesheetklasser","width":"Bredde","height":"Højde","align":"Justering","alignLeft":"Venstre","alignRight":"Højre","alignCenter":"Centreret","alignJustify":"Lige margener","alignTop":"Ă˜verst","alignMiddle":"Centreret","alignBottom":"Nederst","alignNone":"Ingen","invalidValue":"Ugyldig værdi.","invalidHeight":"Højde skal være et tal.","invalidWidth":"Bredde skal være et tal.","invalidCssLength":"Værdien specificeret for \"%1\" feltet skal være et positivt nummer med eller uden en CSS mĂ¥leenhed (px, %, in, cm, mm, em, ex, pt, eller pc).","invalidHtmlLength":"Værdien specificeret for \"%1\" feltet skal være et positivt nummer med eller uden en CSS mĂ¥leenhed (px eller %).","invalidInlineStyle":"Værdien specificeret for inline style skal indeholde en eller flere elementer med et format som \"name:value\", separeret af semikoloner","cssLengthTooltip":"Indsæt en numerisk værdi i pixel eller nummer med en gyldig CSS værdi (px, %, in, cm, mm, em, ex, pt, eller pc).","unavailable":"%1<span class=\"cke_accessibility\">, ikke tilgængelig</span>"},"about":{"copy":"Copyright &copy; $1. Alle rettigheder forbeholdes.","dlgTitle":"Om CKEditor","help":"Se $1 for at fĂ¥ hjælp.","moreInfo":"For informationer omkring licens, se venligst vores hjemmeside (pĂ¥ engelsk):","title":"Om CKEditor","userGuide":"CKEditor-brugermanual"},"basicstyles":{"bold":"Fed","italic":"Kursiv","strike":"Gennemstreget","subscript":"Sænket skrift","superscript":"Hævet skrift","underline":"Understreget"},"blockquote":{"toolbar":"Blokcitat"},"clipboard":{"copy":"KopiĂ©r","copyError":"Din browsers sikkerhedsindstillinger tillader ikke editoren at fĂ¥ automatisk adgang til udklipsholderen.<br><br>Brug i stedet tastaturet til at kopiere teksten (Ctrl/Cmd+C).","cut":"Klip","cutError":"Din browsers sikkerhedsindstillinger tillader ikke editoren at fĂ¥ automatisk adgang til udklipsholderen.<br><br>Brug i stedet tastaturet til at klippe teksten (Ctrl/Cmd+X).","paste":"Indsæt","pasteArea":"Indsæt omrĂ¥de","pasteMsg":"Indsæt i feltet herunder (<STRONG>Ctrl/Cmd+V</STRONG>) og klik pĂ¥ <STRONG>OK</STRONG>.","securityMsg":"Din browsers sikkerhedsindstillinger tillader ikke editoren at fĂ¥ automatisk adgang til udklipsholderen.<br><br>Du skal indsætte udklipsholderens indhold i dette vindue igen.","title":"Indsæt"},"contextmenu":{"options":"Muligheder for hjælpemenu"},"button":{"selectedLabel":"%1 (Valgt)"},"toolbar":{"toolbarCollapse":"Sammenklap værktøjslinje","toolbarExpand":"Udvid værktøjslinje","toolbarGroups":{"document":"Dokument","clipboard":"Udklipsholder/Fortryd","editing":"Redigering","forms":"Formularer","basicstyles":"Basis styles","paragraph":"Paragraf","links":"Links","insert":"Indsæt","styles":"Typografier","colors":"Farver","tools":"Værktøjer"},"toolbars":"Editors værktøjslinjer"},"elementspath":{"eleLabel":"Sti pĂ¥ element","eleTitle":"%1 element"},"format":{"label":"Formatering","panelTitle":"Formatering","tag_address":"Adresse","tag_div":"Normal (DIV)","tag_h1":"Overskrift 1","tag_h2":"Overskrift 2","tag_h3":"Overskrift 3","tag_h4":"Overskrift 4","tag_h5":"Overskrift 5","tag_h6":"Overskrift 6","tag_p":"Normal","tag_pre":"Formateret"},"horizontalrule":{"toolbar":"Indsæt vandret streg"},"image":{"alertUrl":"Indtast stien til billedet","alt":"Alternativ tekst","border":"Ramme","btnUpload":"Upload fil til serveren","button2Img":"Vil du lave billedknappen om til et almindeligt billede?","hSpace":"Vandret margen","img2Button":"Vil du lave billedet om til en billedknap?","infoTab":"Generelt","linkTab":"Hyperlink","lockRatio":"LĂ¥s størrelsesforhold","menu":"Egenskaber for billede","resetSize":"Nulstil størrelse","title":"Egenskaber for billede","titleButton":"Egenskaber for billedknap","upload":"Upload","urlMissing":"Kilde pĂ¥ billed-URL mangler","vSpace":"Lodret margen","validateBorder":"Kant skal være et helt nummer.","validateHSpace":"HSpace skal være et helt nummer.","validateVSpace":"VSpace skal være et helt nummer."},"indent":{"indent":"Forøg indrykning","outdent":"Formindsk indrykning"},"fakeobjects":{"anchor":"Anker","flash":"Flashanimation","hiddenfield":"Skjult felt","iframe":"Iframe","unknown":"Ukendt objekt"},"link":{"acccessKey":"Genvejstast","advanced":"Avanceret","advisoryContentType":"Indholdstype","advisoryTitle":"Titel","anchor":{"toolbar":"Indsæt/redigĂ©r bogmærke","menu":"Egenskaber for bogmærke","title":"Egenskaber for bogmærke","name":"Bogmærkenavn","errorName":"Indtast bogmærkenavn","remove":"Fjern bogmærke"},"anchorId":"Efter element-Id","anchorName":"Efter ankernavn","charset":"Tegnsæt","cssClasses":"Typografiark","emailAddress":"E-mailadresse","emailBody":"Besked","emailSubject":"Emne","id":"Id","info":"Generelt","langCode":"Tekstretning","langDir":"Tekstretning","langDirLTR":"Fra venstre mod højre (LTR)","langDirRTL":"Fra højre mod venstre (RTL)","menu":"RedigĂ©r hyperlink","name":"Navn","noAnchors":"(Ingen bogmærker i dokumentet)","noEmail":"Indtast e-mailadresse!","noUrl":"Indtast hyperlink-URL!","other":"<anden>","popupDependent":"Koblet/dependent (Netscape)","popupFeatures":"Egenskaber for popup","popupFullScreen":"Fuld skærm (IE)","popupLeft":"Position fra venstre","popupLocationBar":"Adresselinje","popupMenuBar":"Menulinje","popupResizable":"JustĂ©rbar","popupScrollBars":"Scrollbar","popupStatusBar":"Statuslinje","popupToolbar":"Værktøjslinje","popupTop":"Position fra toppen","rel":"Relation","selectAnchor":"Vælg et anker","styles":"Typografi","tabIndex":"Tabulatorindeks","target":"MĂ¥l","targetFrame":"<ramme>","targetFrameName":"Destinationsvinduets navn","targetPopup":"<popup vindue>","targetPopupName":"Popupvinduets navn","title":"Egenskaber for hyperlink","toAnchor":"Bogmærke pĂ¥ denne side","toEmail":"E-mail","toUrl":"URL","toolbar":"Indsæt/redigĂ©r hyperlink","type":"Type","unlink":"Fjern hyperlink","upload":"Upload"},"list":{"bulletedlist":"Punktopstilling","numberedlist":"Talopstilling"},"magicline":{"title":"Indsæt afsnit"},"maximize":{"maximize":"MaksimĂ©r","minimize":"MinimĂ©r"},"pastetext":{"button":"Indsæt som ikke-formateret tekst","title":"Indsæt som ikke-formateret tekst"},"pastefromword":{"confirmCleanup":"Den tekst du forsøger at indsætte ser ud til at komme fra Word. Vil du rense teksten før den indsættes?","error":"Det var ikke muligt at fjerne formatteringen pĂ¥ den indsatte tekst grundet en intern fejl","title":"Indsæt fra Word","toolbar":"Indsæt fra Word"},"removeformat":{"toolbar":"Fjern formatering"},"sourcearea":{"toolbar":"Kilde"},"specialchar":{"options":"Muligheder for specialkarakterer","title":"Vælg symbol","toolbar":"Indsæt symbol"},"scayt":{"btn_about":"Om SCAYT","btn_dictionaries":"Ordbøger","btn_disable":"DeaktivĂ©r SCAYT","btn_enable":"AktivĂ©r SCAYT","btn_langs":"Sprog","btn_options":"Indstillinger","text_title":"Stavekontrol mens du skriver"},"stylescombo":{"label":"Typografi","panelTitle":"Formattering pĂ¥ stylesheet","panelTitle1":"Block typografi","panelTitle2":"Inline typografi","panelTitle3":"Object typografi"},"table":{"border":"Rammebredde","caption":"Titel","cell":{"menu":"Celle","insertBefore":"Indsæt celle før","insertAfter":"Indsæt celle efter","deleteCell":"Slet celle","merge":"Flet celler","mergeRight":"Flet til højre","mergeDown":"Flet nedad","splitHorizontal":"Del celle vandret","splitVertical":"Del celle lodret","title":"Celleegenskaber","cellType":"Celletype","rowSpan":"Række span (rows span)","colSpan":"Kolonne span (columns span)","wordWrap":"Tekstombrydning","hAlign":"Vandret justering","vAlign":"Lodret justering","alignBaseline":"Grundlinje","bgColor":"Baggrundsfarve","borderColor":"Rammefarve","data":"Data","header":"Hoved","yes":"Ja","no":"Nej","invalidWidth":"Cellebredde skal være et tal.","invalidHeight":"Cellehøjde skal være et tal.","invalidRowSpan":"Række span skal være et heltal.","invalidColSpan":"Kolonne span skal være et heltal.","chooseColor":"Vælg"},"cellPad":"Cellemargen","cellSpace":"Celleafstand","column":{"menu":"Kolonne","insertBefore":"Indsæt kolonne før","insertAfter":"Indsæt kolonne efter","deleteColumn":"Slet kolonne"},"columns":"Kolonner","deleteTable":"Slet tabel","headers":"Hoved","headersBoth":"Begge","headersColumn":"Første kolonne","headersNone":"Ingen","headersRow":"Første række","invalidBorder":"Rammetykkelse skal være et tal.","invalidCellPadding":"Cellemargen skal være et tal.","invalidCellSpacing":"Celleafstand skal være et tal.","invalidCols":"Antallet af kolonner skal være større end 0.","invalidHeight":"Tabelhøjde skal være et tal.","invalidRows":"Antallet af rækker skal være større end 0.","invalidWidth":"Tabelbredde skal være et tal.","menu":"Egenskaber for tabel","row":{"menu":"Række","insertBefore":"Indsæt række før","insertAfter":"Indsæt række efter","deleteRow":"Slet række"},"rows":"Rækker","summary":"ResumĂ©","title":"Egenskaber for tabel","toolbar":"Tabel","widthPc":"procent","widthPx":"pixels","widthUnit":"Bredde pĂ¥ enhed"},"undo":{"redo":"AnnullĂ©r fortryd","undo":"Fortryd"},"wsc":{"btnIgnore":"IgnorĂ©r","btnIgnoreAll":"IgnorĂ©r alle","btnReplace":"Erstat","btnReplaceAll":"Erstat alle","btnUndo":"Tilbage","changeTo":"Forslag","errorLoading":"Fejl ved indlæsning af host: %s.","ieSpellDownload":"Stavekontrol ikke installeret. Vil du installere den nu?","manyChanges":"Stavekontrol færdig: %1 ord ændret","noChanges":"Stavekontrol færdig: Ingen ord ændret","noMispell":"Stavekontrol færdig: Ingen fejl fundet","noSuggestions":"(ingen forslag)","notAvailable":"Stavekontrol er desværre ikke tilgængelig.","notInDic":"Ikke i ordbogen","oneChange":"Stavekontrol færdig: Et ord ændret","progress":"Stavekontrollen arbejder...","title":"Stavekontrol","toolbar":"Stavekontrol"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/de.js b/js/ckeditor/lang/de.js
new file mode 100644
index 0000000..088c6e3
--- /dev/null
+++ b/js/ckeditor/lang/de.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['de']={"editor":"WYSIWYG-Editor","editorPanel":"WYSIWYG-Editor-Leiste","common":{"editorHelp":"DrĂ¼cken Sie ALT 0 fĂ¼r Hilfe","browseServer":"Server durchsuchen","url":"URL","protocol":"Protokoll","upload":"Hochladen","uploadSubmit":"Zum Server senden","image":"Bild","flash":"Flash","form":"Formular","checkbox":"Checkbox","radio":"Radiobutton","textField":"Textfeld einzeilig","textarea":"Textfeld mehrzeilig","hiddenField":"Verstecktes Feld","button":"Klickbutton","select":"Auswahlfeld","imageButton":"Bildbutton","notSet":"<nichts>","id":"ID","name":"Name","langDir":"Schreibrichtung","langDirLtr":"Links nach Rechts (LTR)","langDirRtl":"Rechts nach Links (RTL)","langCode":"SprachenkĂ¼rzel","longDescr":"Langform URL","cssClass":"Stylesheet Klasse","advisoryTitle":"Titel Beschreibung","cssStyle":"Style","ok":"OK","cancel":"Abbrechen","close":"SchlieĂŸen","preview":"Vorschau","resize":"Zum VergrĂ¶ĂŸern ziehen","generalTab":"Allgemein","advancedTab":"Erweitert","validateNumberFailed":"Dieser Wert ist keine Nummer.","confirmNewPage":"Alle nicht gespeicherten Ă„nderungen gehen verlohren. Sind Sie sicher die neue Seite zu laden?","confirmCancel":"Einige Optionen wurden geändert. Wollen Sie den Dialog dennoch schlieĂŸen?","options":"Optionen","target":"Zielseite","targetNew":"Neues Fenster (_blank)","targetTop":"Oberstes Fenster (_top)","targetSelf":"Gleiches Fenster (_self)","targetParent":"Oberes Fenster (_parent)","langDirLTR":"Links nach Rechts (LNR)","langDirRTL":"Rechts nach Links (RNL)","styles":"Style","cssClasses":"Stylesheet Klasse","width":"Breite","height":"Höhe","align":"Ausrichtung","alignLeft":"Links","alignRight":"Rechts","alignCenter":"Zentriert","alignJustify":"Blocksatz","alignTop":"Oben","alignMiddle":"Mitte","alignBottom":"Unten","alignNone":"Keine","invalidValue":"UngĂ¼ltiger Wert.","invalidHeight":"Höhe muss eine Zahl sein.","invalidWidth":"Breite muss eine Zahl sein.","invalidCssLength":"Wert spezifiziert fĂ¼r \"%1\" Feld muss ein positiver numerischer Wert sein mit oder ohne korrekte CSS Messeinheit (px, %, in, cm, mm, em, ex, pt oder pc).","invalidHtmlLength":"Wert spezifiziert fĂ¼r \"%1\" Feld muss ein positiver numerischer Wert sein mit oder ohne korrekte HTML Messeinheit (px oder %).","invalidInlineStyle":"Wert spezifiziert fĂ¼r inline Stilart muss enthalten ein oder mehr Tupels mit dem Format \"Name : Wert\" getrennt mit Semikolons.","cssLengthTooltip":"Gebe eine Zahl ein fĂ¼r ein Wert in pixels oder eine Zahl mit einer korrekten CSS Messeinheit (px, %, in, cm, mm, em, ex, pt oder pc).","unavailable":"%1<span class=\"cke_accessibility\">, nicht verfĂ¼gbar</span>"},"about":{"copy":"Copyright &copy; $1. Alle Rechte vorbehalten.","dlgTitle":"Ăœber CKEditor","help":"PrĂ¼fe $1 fĂ¼r Hilfe.","moreInfo":"FĂ¼r Informationen Ă¼ber unsere Lizenzbestimmungen besuchen sie bitte unsere Webseite:","title":"Ăœber CKEditor","userGuide":"CKEditor Benutzerhandbuch"},"basicstyles":{"bold":"Fett","italic":"Kursiv","strike":"Durchgestrichen","subscript":"Tiefgestellt","superscript":"Hochgestellt","underline":"Unterstrichen"},"blockquote":{"toolbar":"Zitatblock"},"clipboard":{"copy":"Kopieren","copyError":"Die Sicherheitseinstellungen Ihres Browsers lassen es nicht zu, den Text automatisch kopieren. Bitte benutzen Sie die System-Zwischenablage Ă¼ber STRG-C (kopieren).","cut":"Ausschneiden","cutError":"Die Sicherheitseinstellungen Ihres Browsers lassen es nicht zu, den Text automatisch auszuschneiden. Bitte benutzen Sie die System-Zwischenablage Ă¼ber STRG-X (ausschneiden) und STRG-V (einfĂ¼gen).","paste":"EinfĂ¼gen","pasteArea":"EinfĂ¼gebereich","pasteMsg":"Bitte fĂ¼gen Sie den Text in der folgenden Box Ă¼ber die Tastatur (mit <STRONG>Strg+V</STRONG>) ein und bestätigen Sie mit <STRONG>OK</STRONG>.","securityMsg":"Aufgrund von Sicherheitsbeschränkungen Ihres Browsers kann der Editor nicht direkt auf die Zwischenablage zugreifen. Bitte fĂ¼gen Sie den Inhalt erneut in diesem Fenster ein.","title":"EinfĂ¼gen"},"contextmenu":{"options":"KontextmenĂ¼ Optionen"},"button":{"selectedLabel":"%1 (Ausgewählt)"},"toolbar":{"toolbarCollapse":"Symbolleiste einklappen","toolbarExpand":"Symbolleiste ausklappen","toolbarGroups":{"document":"Dokument","clipboard":"Zwischenablage/RĂ¼ckgängig","editing":"Editieren","forms":"Formularen","basicstyles":"Grundstile","paragraph":"Absatz","links":"Links","insert":"EinfĂ¼gen","styles":"Stile","colors":"Farben","tools":"Werkzeuge"},"toolbars":"Editor Symbolleisten"},"elementspath":{"eleLabel":"Elements Pfad","eleTitle":"%1 Element"},"format":{"label":"Format","panelTitle":"Format","tag_address":"Addresse","tag_div":"Normal (DIV)","tag_h1":"Ăœberschrift 1","tag_h2":"Ăœberschrift 2","tag_h3":"Ăœberschrift 3","tag_h4":"Ăœberschrift 4","tag_h5":"Ăœberschrift 5","tag_h6":"Ăœberschrift 6","tag_p":"Normal","tag_pre":"Formatiert"},"horizontalrule":{"toolbar":"Horizontale Linie einfĂ¼gen"},"image":{"alertUrl":"Bitte geben Sie die Bild-URL an","alt":"Alternativer Text","border":"Rahmen","btnUpload":"Zum Server senden","button2Img":"Möchten Sie den gewählten Bild-Button in ein einfaches Bild umwandeln?","hSpace":"Horizontal-Abstand","img2Button":"Möchten Sie das gewählten Bild in einen Bild-Button umwandeln?","infoTab":"Bild-Info","linkTab":"Link","lockRatio":"GrĂ¶ĂŸenverhältnis beibehalten","menu":"Bild-Eigenschaften","resetSize":"GrĂ¶ĂŸe zurĂ¼cksetzen","title":"Bild-Eigenschaften","titleButton":"Bildbutton-Eigenschaften","upload":"Hochladen","urlMissing":"Imagequelle URL fehlt.","vSpace":"Vertikal-Abstand","validateBorder":"Rahmen muĂŸ eine ganze Zahl sein.","validateHSpace":"Horizontal-Abstand muĂŸ eine ganze Zahl sein.","validateVSpace":"Vertikal-Abstand muĂŸ eine ganze Zahl sein."},"indent":{"indent":"Einzug erhöhen","outdent":"Einzug verringern"},"fakeobjects":{"anchor":"Anker","flash":"Flash Animation","hiddenfield":"Verstecktes Feld","iframe":"IFrame","unknown":"Unbekanntes Objekt"},"link":{"acccessKey":"Zugriffstaste","advanced":"Erweitert","advisoryContentType":"Inhaltstyp","advisoryTitle":"Titel Beschreibung","anchor":{"toolbar":"Anker einfĂ¼gen/editieren","menu":"Anker-Eigenschaften","title":"Anker-Eigenschaften","name":"Anker Name","errorName":"Bitte geben Sie den Namen des Ankers ein","remove":"Anker entfernen"},"anchorId":"nach Element Id","anchorName":"nach Anker Name","charset":"Ziel-Zeichensatz","cssClasses":"Stylesheet Klasse","emailAddress":"E-Mail Adresse","emailBody":"Nachrichtentext","emailSubject":"Betreffzeile","id":"Id","info":"Link-Info","langCode":"SprachenkĂ¼rzel","langDir":"Schreibrichtung","langDirLTR":"Links nach Rechts (LTR)","langDirRTL":"Rechts nach Links (RTL)","menu":"Link editieren","name":"Name","noAnchors":"(keine Anker im Dokument vorhanden)","noEmail":"Bitte geben Sie e-Mail Adresse an","noUrl":"Bitte geben Sie die Link-URL an","other":"<andere>","popupDependent":"Abhängig (Netscape)","popupFeatures":"Pop-up Fenster-Eigenschaften","popupFullScreen":"Vollbild (IE)","popupLeft":"Linke Position","popupLocationBar":"Adress-Leiste","popupMenuBar":"MenĂ¼-Leiste","popupResizable":"GrĂ¶ĂŸe änderbar","popupScrollBars":"Rollbalken","popupStatusBar":"Statusleiste","popupToolbar":"Symbolleiste","popupTop":"Obere Position","rel":"Beziehung","selectAnchor":"Anker auswählen","styles":"Style","tabIndex":"Tab-Index","target":"Zielseite","targetFrame":"<Frame>","targetFrameName":"Ziel-Fenster-Name","targetPopup":"<Pop-up Fenster>","targetPopupName":"Pop-up Fenster-Name","title":"Link","toAnchor":"Anker in dieser Seite","toEmail":"E-Mail","toUrl":"URL","toolbar":"Link einfĂ¼gen/editieren","type":"Link-Typ","unlink":"Link entfernen","upload":"Hochladen"},"list":{"bulletedlist":"Liste","numberedlist":"Nummerierte Liste"},"magicline":{"title":"Absatz hier einfĂ¼gen"},"maximize":{"maximize":"Maximieren","minimize":"Minimieren"},"pastetext":{"button":"Als Text einfĂ¼gen","title":"Als Text einfĂ¼gen"},"pastefromword":{"confirmCleanup":"Der Text, den Sie einfĂ¼gen möchten, scheint aus MS-Word kopiert zu sein. Möchten Sie ihn zuvor bereinigen lassen?","error":"Aufgrund eines internen Fehlers war es nicht möglich die eingefĂ¼gten Daten zu bereinigen","title":"Aus MS-Word einfĂ¼gen","toolbar":"Aus MS-Word einfĂ¼gen"},"removeformat":{"toolbar":"Formatierungen entfernen"},"sourcearea":{"toolbar":"Quellcode"},"specialchar":{"options":"Sonderzeichen Optionen","title":"Sonderzeichen auswählen","toolbar":"Sonderzeichen einfĂ¼gen/editieren"},"scayt":{"btn_about":"Ăœber SCAYT","btn_dictionaries":"WörterbĂ¼cher","btn_disable":"SCAYT ausschalten","btn_enable":"SCAYT einschalten","btn_langs":"Sprachen","btn_options":"Optionen","text_title":"RechtschreibprĂ¼fung während der Texteingabe (SCAYT)"},"stylescombo":{"label":"Stil","panelTitle":"Formatierungsstile","panelTitle1":"Block Stilart","panelTitle2":"Inline Stilart","panelTitle3":"Objekt Stilart"},"table":{"border":"Rahmen","caption":"Ăœberschrift","cell":{"menu":"Zelle","insertBefore":"Zelle davor einfĂ¼gen","insertAfter":"Zelle danach einfĂ¼gen","deleteCell":"Zelle löschen","merge":"Zellen verbinden","mergeRight":"Nach rechts verbinden","mergeDown":"Nach unten verbinden","splitHorizontal":"Zelle horizontal teilen","splitVertical":"Zelle vertikal teilen","title":"Zellen-Eigenschaften","cellType":"Zellart","rowSpan":"Anzahl Zeilen verbinden","colSpan":"Anzahl Spalten verbinden","wordWrap":"Zeilenumbruch","hAlign":"Horizontale Ausrichtung","vAlign":"Vertikale Ausrichtung","alignBaseline":"Grundlinie","bgColor":"Hintergrundfarbe","borderColor":"Rahmenfarbe","data":"Daten","header":"Ăœberschrift","yes":"Ja","no":"Nein","invalidWidth":"Zellenbreite muĂŸ eine Zahl sein.","invalidHeight":"Zellenhöhe muĂŸ eine Zahl sein.","invalidRowSpan":"\"Anzahl Zeilen verbinden\" muss eine Ganzzahl sein.","invalidColSpan":"\"Anzahl Spalten verbinden\" muss eine Ganzzahl sein.","chooseColor":"Wählen"},"cellPad":"Zellenabstand innen","cellSpace":"Zellenabstand auĂŸen","column":{"menu":"Spalte","insertBefore":"Spalte links davor einfĂ¼gen","insertAfter":"Spalte rechts danach einfĂ¼gen","deleteColumn":"Spalte löschen"},"columns":"Spalte","deleteTable":"Tabelle löschen","headers":"Kopfzeile","headersBoth":"Beide","headersColumn":"Erste Spalte","headersNone":"Keine","headersRow":"Erste Zeile","invalidBorder":"Die Rahmenbreite muĂŸ eine Zahl sein.","invalidCellPadding":"Der Zellenabstand innen muĂŸ eine positive Zahl sein.","invalidCellSpacing":"Der Zellenabstand auĂŸen muĂŸ eine positive Zahl sein.","invalidCols":"Die Anzahl der Spalten muĂŸ grĂ¶ĂŸer als 0 sein..","invalidHeight":"Die Tabellenbreite muĂŸ eine Zahl sein.","invalidRows":"Die Anzahl der Zeilen muĂŸ grĂ¶ĂŸer als 0 sein.","invalidWidth":"Die Tabellenbreite muss eine Zahl sein.","menu":"Tabellen-Eigenschaften","row":{"menu":"Zeile","insertBefore":"Zeile oberhalb einfĂ¼gen","insertAfter":"Zeile unterhalb einfĂ¼gen","deleteRow":"Zeile entfernen"},"rows":"Zeile","summary":"InhaltsĂ¼bersicht","title":"Tabellen-Eigenschaften","toolbar":"Tabelle","widthPc":"%","widthPx":"Pixel","widthUnit":"Breite Einheit"},"undo":{"redo":"Wiederherstellen","undo":"RĂ¼ckgängig"},"wsc":{"btnIgnore":"Ignorieren","btnIgnoreAll":"Alle Ignorieren","btnReplace":"Ersetzen","btnReplaceAll":"Alle Ersetzen","btnUndo":"RĂ¼ckgängig","changeTo":"Ă„ndern in","errorLoading":"Fehler beim laden des Dienstanbieters: %s.","ieSpellDownload":"RechtschreibprĂ¼fung nicht installiert. Möchten Sie sie jetzt herunterladen?","manyChanges":"RechtschreibprĂ¼fung abgeschlossen - %1 Wörter geändert","noChanges":"RechtschreibprĂ¼fung abgeschlossen - keine Worte geändert","noMispell":"RechtschreibprĂ¼fung abgeschlossen - keine Fehler gefunden","noSuggestions":" - keine Vorschläge - ","notAvailable":"Entschuldigung, aber dieser Dienst steht im Moment nicht zur VerfĂ¼gung.","notInDic":"Nicht im Wörterbuch","oneChange":"RechtschreibprĂ¼fung abgeschlossen - ein Wort geändert","progress":"RechtschreibprĂ¼fung läuft...","title":"RechtschreibprĂ¼fung","toolbar":"RechtschreibprĂ¼fung"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/el.js b/js/ckeditor/lang/el.js
new file mode 100644
index 0000000..c6f4510
--- /dev/null
+++ b/js/ckeditor/lang/el.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['el']={"editor":"ΕπεξεÏγαστής ΠλοÏσιου Îειμένου","editorPanel":"Πίνακας ΕπεξεÏγαστή ΠλοÏσιου Îειμένου","common":{"editorHelp":"Πατήστε το ALT 0 για βοήθεια","browseServer":"ΕξεÏεÏνηση Διακομιστή","url":"URL","protocol":"ΠÏωτόκολλο","upload":"Αποστολή","uploadSubmit":"Αποστολή στον Διακομιστή","image":"Εικόνα","flash":"Flash","form":"ΦόÏμα","checkbox":"Îουτί Επιλογής","radio":"Îουμπί Επιλογής","textField":"Πεδίο Îειμένου","textarea":"ΠεÏιοχή Îειμένου","hiddenField":"ÎÏυφό Πεδίο","button":"Îουμπί","select":"Πεδίο Επιλογής","imageButton":"Îουμπί Εικόνας","notSet":"<δεν έχει Ïυθμιστεί>","id":"Id","name":"Όνομα","langDir":"ÎατεÏθυνση Îειμένου","langDirLtr":"ΑÏιστεÏά Ï€Ïος Δεξιά (LTR)","langDirRtl":"Δεξιά Ï€Ïος ΑÏιστεÏά (RTL)","langCode":"Îωδικός ΓλÏσσας","longDescr":"Αναλυτική ΠεÏιγÏαφή URL","cssClass":"Îλάσεις ΦÏλλων Στυλ","advisoryTitle":"Ενδεικτικός Τίτλος","cssStyle":"ΜοÏφή Îειμένου","ok":"OK","cancel":"ΑκÏÏωση","close":"Îλείσιμο","preview":"ΠÏοεπισκόπηση","resize":"Αλλαγή Μεγέθους","generalTab":"Γενικά","advancedTab":"Για ΠÏοχωÏημένους","validateNumberFailed":"Αυτή η τιμή δεν είναι αÏιθμός.","confirmNewPage":"Οι όποιες αλλαγές στο πεÏιεχόμενο θα χαθοÏν. Είσαστε σίγουÏοι ότι θέλετε να φοÏÏ„Ïσετε μια νέα σελίδα;","confirmCancel":"ΜεÏικές επιλογές έχουν αλλάξει. Είσαστε σίγουÏοι ότι θέλετε να κλείσετε το παÏάθυÏο διαλόγου;","options":"Επιλογές","target":"ΠÏοοÏισμός","targetNew":"Îέο ΠαÏάθυÏο (_blank)","targetTop":"ΑÏχική ΠεÏιοχή (_top)","targetSelf":"Îδιο ΠαÏάθυÏο (_self)","targetParent":"ΓονεÏκό ΠαÏάθυÏο (_parent)","langDirLTR":"ΑÏιστεÏά Ï€Ïος Δεξιά (LTR)","langDirRTL":"Δεξιά Ï€Ïος ΑÏιστεÏά (RTL)","styles":"ΜοÏφή","cssClasses":"Îλάσεις ΦÏλλων Στυλ","width":"Πλάτος","height":"Îψος","align":"Στοίχιση","alignLeft":"ΑÏιστεÏά","alignRight":"Δεξιά","alignCenter":"ÎέντÏο","alignJustify":"ΠλήÏης Στοίχιση","alignTop":"Πάνω","alignMiddle":"Μέση","alignBottom":"Îάτω","alignNone":"ΧωÏίς","invalidValue":"Μη έγκυÏη τιμή.","invalidHeight":"Το Ïψος Ï€Ïέπει να είναι ένας αÏιθμός.","invalidWidth":"Το πλάτος Ï€Ïέπει να είναι ένας αÏιθμός.","invalidCssLength":"Η τιμή που οÏίζεται για το πεδίο \"%1\" Ï€Ïέπει να είναι ένας θετικός αÏιθμός με ή χωÏίς μια έγκυÏη μονάδα μέτÏησης CSS (px, %, in, cm, mm, em, ex, pt, ή pc).","invalidHtmlLength":"Η τιμή που οÏίζεται για το πεδίο \"%1\" Ï€Ïέπει να είναι ένας θετικός αÏιθμός με ή χωÏίς μια έγκυÏη μονάδα μέτÏησης HTML (px ή %).","invalidInlineStyle":"Η τιμή για το εν σειÏά στυλ Ï€Ïέπει να πεÏιέχει ένα ή πεÏισσότεÏα ζεÏγη με την μοÏφή \"όνομα: τιμή\" διαχωÏισμένα με Ελληνικό εÏωτηματικό.","cssLengthTooltip":"Εισάγεται μια τιμή σε pixel ή έναν αÏιθμό μαζί με μια έγκυÏη μονάδα μέτÏησης CSS (px, %, in, cm, mm, em, ex, pt, ή pc).","unavailable":"%1<span class=\"cke_accessibility\">, δεν είναι διαθέσιμο</span>"},"about":{"copy":"Πνευματικά δικαιÏματα &copy; $1 Με επιφÏλαξη παντός δικαιÏματος.","dlgTitle":"ΠεÏί του CKEditor","help":"Ελέγξτε τις $1 για βοήθεια.","moreInfo":"Για πληÏοφοÏίες σχετικές με την άδεια χÏήσης, παÏακαλοÏμε επισκεφθείτε την ιστοσελίδα μας:","title":"ΠεÏί του CKEditor","userGuide":"Οδηγίες ΧÏήστη CKEditor"},"basicstyles":{"bold":"Έντονη","italic":"Πλάγια","strike":"ΔιακÏιτή ΔιαγÏαφή","subscript":"Δείκτης","superscript":"Εκθέτης","underline":"ΥπογÏάμμιση"},"blockquote":{"toolbar":"ΠεÏιοχή ΠαÏάθεσης"},"clipboard":{"copy":"ΑντιγÏαφή","copyError":"Οι Ïυθμίσεις ασφαλείας του πεÏιηγητή σας δεν επιτÏέπουν την επιλεγμένη εÏγασία αντιγÏαφής. ΠαÏÎ±ÎºÎ±Î»Ï Ï‡Ïησιμοποιείστε το πληκτÏολόγιο (Ctrl/Cmd+C).","cut":"Αποκοπή","cutError":"Οι Ïυθμίσεις ασφαλείας του πεÏιηγητή σας δεν επιτÏέπουν την επιλεγμένη εÏγασία αποκοπής. ΠαÏÎ±ÎºÎ±Î»Ï Ï‡Ïησιμοποιείστε το πληκτÏολόγιο (Ctrl/Cmd+X).","paste":"Επικόλληση","pasteArea":"ΠεÏιοχή Επικόλλησης","pasteMsg":"ΠαÏÎ±ÎºÎ±Î»Ï ÎµÏ€Î¹ÎºÎ¿Î»Î»Î®ÏƒÏ„Îµ στο ακόλουθο κουτί χÏησιμοποιÏντας το πληκτÏολόγιο (<strong>Ctrl/Cmd+V</strong>) και πατήστε OK.","securityMsg":"Λόγων των Ïυθμίσεων ασφάλειας του πεÏιηγητή σας, ο επεξεÏγαστής δεν μποÏεί να έχει Ï€Ïόσβαση στην μνήμη επικόλλησης. ΧÏειάζεται να επικολλήσετε ξανά σε αυτό το παÏάθυÏο.","title":"Επικόλληση"},"contextmenu":{"options":"Επιλογές Αναδυόμενου ΜενοÏ"},"button":{"selectedLabel":"%1 (Επιλεγμένο)"},"toolbar":{"toolbarCollapse":"ΣÏμπτυξη ΕÏγαλειοθήκης","toolbarExpand":"Ανάπτυξη ΕÏγαλειοθήκης","toolbarGroups":{"document":"ΈγγÏαφο","clipboard":"ΠÏόχειÏο/ΑναίÏεση","editing":"ΕπεξεÏγασία","forms":"ΦόÏμες","basicstyles":"Βασικά Στυλ","paragraph":"ΠαÏάγÏαφος","links":"ΣÏνδεσμοι","insert":"Εισαγωγή","styles":"Στυλ","colors":"ΧÏÏματα","tools":"ΕÏγαλεία"},"toolbars":"ΕÏγαλειοθήκες επεξεÏγαστή"},"elementspath":{"eleLabel":"ΔιαδÏομή Στοιχείων","eleTitle":"Στοιχείο %1"},"format":{"label":"ΜοÏφοποίηση","panelTitle":"ΜοÏφοποίηση ΠαÏαγÏάφου","tag_address":"ΔιεÏθυνση","tag_div":"Îανονική (DIV)","tag_h1":"Îεφαλίδα 1","tag_h2":"Îεφαλίδα 2","tag_h3":"Îεφαλίδα 3","tag_h4":"Îεφαλίδα 4","tag_h5":"Îεφαλίδα 5","tag_h6":"Îεφαλίδα 6","tag_p":"Îανονική","tag_pre":"ΠÏο-μοÏφοποιημένη"},"horizontalrule":{"toolbar":"Εισαγωγή ΟÏιζόντιας ΓÏαμμής"},"image":{"alertUrl":"Εισάγετε την τοποθεσία (URL) της εικόνας","alt":"Εναλλακτικό Îείμενο","border":"ΠεÏίγÏαμμα","btnUpload":"Αποστολή στον Διακομιστή","button2Img":"Θέλετε να μετατÏέψετε το επιλεγμένο κουμπί εικόνας σε απλή εικόνα;","hSpace":"HSpace","img2Button":"Θέλετε να μεταμοÏφÏσετε την επιλεγμένη εικόνα που είναι πάνω σε ένα κουμπί;","infoTab":"ΠληÏοφοÏίες Εικόνας","linkTab":"ΣÏνδεσμος","lockRatio":"Îλείδωμα Αναλογίας","menu":"Ιδιότητες Εικόνας","resetSize":"ΕπαναφοÏά ΑÏÏ‡Î¹ÎºÎ¿Ï ÎœÎµÎ³Î­Î¸Î¿Ï…Ï‚","title":"Ιδιότητες Εικόνας","titleButton":"Ιδιότητες ÎÎ¿Ï…Î¼Ï€Î¹Î¿Ï Î•Î¹ÎºÏŒÎ½Î±Ï‚","upload":"Αποστολή","urlMissing":"Το URL πηγής για την εικόνα λείπει.","vSpace":"VSpace","validateBorder":"Το πεÏίγÏαμμα Ï€Ïέπει να είναι ένας ακέÏαιος αÏιθμός.","validateHSpace":"Το HSpace Ï€Ïέπει να είναι ένας ακέÏαιος αÏιθμός.","validateVSpace":"Το VSpace Ï€Ïέπει να είναι ένας ακέÏαιος αÏιθμός."},"indent":{"indent":"ΑÏξηση Εσοχής","outdent":"Μείωση Εσοχής"},"fakeobjects":{"anchor":"ΆγκυÏα","flash":"Ταινία Flash","hiddenfield":"ÎÏυφό Πεδίο","iframe":"IFrame","unknown":"Άγνωστο Αντικείμενο"},"link":{"acccessKey":"Συντόμευση","advanced":"Για ΠÏοχωÏημένους","advisoryContentType":"Ενδεικτικός ΤÏπος ΠεÏιεχομένου","advisoryTitle":"Ενδεικτικός Τίτλος","anchor":{"toolbar":"Εισαγωγή/επεξεÏγασία ΆγκυÏας","menu":"Ιδιότητες άγκυÏας","title":"Ιδιότητες άγκυÏας","name":"Όνομα άγκυÏας","errorName":"ΠαÏακαλοÏμε εισάγετε όνομα άγκυÏας","remove":"ΑφαίÏεση ΆγκυÏας"},"anchorId":"Βάσει του Element Id","anchorName":"Βάσει του Ονόματος ΆγκυÏας","charset":"Îωδικοποίηση ΧαÏακτήÏων ΠÏοσαÏτημένης Πηγής","cssClasses":"Îλάσεις ΦÏλλων Στυλ","emailAddress":"ΔιεÏθυνση E-mail","emailBody":"Îείμενο ΜηνÏματος","emailSubject":"Θέμα ΜηνÏματος","id":"Id","info":"ΠληÏοφοÏίες Συνδέσμου","langCode":"ÎατεÏθυνση Îειμένου","langDir":"ÎατεÏθυνση Îειμένου","langDirLTR":"ΑÏιστεÏά Ï€Ïος Δεξιά (LTR)","langDirRTL":"Δεξιά Ï€Ïος ΑÏιστεÏά (RTL)","menu":"ΕπεξεÏγασία Συνδέσμου","name":"Όνομα","noAnchors":"(Δεν υπάÏχουν άγκυÏες στο κείμενο)","noEmail":"Εισάγετε τη διεÏθυνση ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου","noUrl":"Εισάγετε την τοποθεσία (URL) του συνδέσμου","other":"<άλλο>","popupDependent":"ΕξαÏτημένο (Netscape)","popupFeatures":"Επιλογές Αναδυόμενου ΠαÏαθÏÏου","popupFullScreen":"ΠλήÏης Οθόνη (IE)","popupLeft":"Θέση ΑÏιστεÏά","popupLocationBar":"ΓÏαμμή Τοποθεσίας","popupMenuBar":"ΓÏαμμή ΕπιλογÏν","popupResizable":"ΠÏοσαÏμοζόμενο Μέγεθος","popupScrollBars":"ΜπάÏες ÎÏλισης","popupStatusBar":"ΓÏαμμή Îατάστασης","popupToolbar":"ΕÏγαλειοθήκη","popupTop":"Θέση Πάνω","rel":"Σχέση","selectAnchor":"Επιλέξτε μια ΆγκυÏα","styles":"ΜοÏφή","tabIndex":"ΣειÏά Μεταπήδησης","target":"ΠαÏάθυÏο ΠÏοοÏισμοÏ","targetFrame":"<πλαίσιο>","targetFrameName":"Όνομα Πλαισίου ΠÏοοÏισμοÏ","targetPopup":"<αναδυόμενο παÏάθυÏο>","targetPopupName":"Όνομα Αναδυόμενου ΠαÏαθÏÏου","title":"ΣÏνδεσμος","toAnchor":"ΆγκυÏα σε αυτήν τη σελίδα","toEmail":"E-Mail","toUrl":"URL","toolbar":"ΣÏνδεσμος","type":"ΤÏπος Συνδέσμου","unlink":"ΑφαίÏεση Συνδέσμου","upload":"Αποστολή"},"list":{"bulletedlist":"Εισαγωγή/ΑπομάκÏυνση Λίστας Îουκκίδων","numberedlist":"Εισαγωγή/ΑπομάκÏυνση ΑÏιθμημένης Λίστας"},"magicline":{"title":"Εισάγετε παÏάγÏαφο εδÏ"},"maximize":{"maximize":"Μεγιστοποίηση","minimize":"Ελαχιστοποίηση"},"pastetext":{"button":"Επικόλληση ως απλό κείμενο","title":"Επικόλληση ως απλό κείμενο"},"pastefromword":{"confirmCleanup":"Το κείμενο που επικολλάται φαίνεται να είναι αντιγÏαμμένο από το Word. Μήπως θα θέλατε να καθαÏιστεί Ï€ÏÎ¿Ï„Î¿Ï ÎµÏ€Î¹ÎºÎ¿Î»Î»Î·Î¸ÎµÎ¯;","error":"Δεν ήταν δυνατό να καθαÏιστοÏν τα δεδομένα λόγω ενός εσωτεÏÎ¹ÎºÎ¿Ï ÏƒÏ†Î¬Î»Î¼Î±Ï„Î¿Ï‚","title":"Επικόλληση από το Word","toolbar":"Επικόλληση από το Word"},"removeformat":{"toolbar":"ΕκκαθάÏιση ΜοÏφοποίησης"},"sourcearea":{"toolbar":"ÎÏδικας"},"specialchar":{"options":"Επιλογές ΕιδικÏν ΧαÏακτήÏων","title":"Επιλέξτε Έναν Ειδικό ΧαÏακτήÏα","toolbar":"Εισαγωγή Î•Î¹Î´Î¹ÎºÎ¿Ï Î§Î±ÏακτήÏα"},"scayt":{"btn_about":"About SCAYT","btn_dictionaries":"Λεξικά","btn_disable":"Disable SCAYT","btn_enable":"Enable SCAYT","btn_langs":"ΓλÏσσες","btn_options":"Επιλογές","text_title":"Spell Check As You Type"},"stylescombo":{"label":"ΜοÏφές","panelTitle":"Στυλ ΜοÏφοποίησης","panelTitle1":"Στυλ Τμημάτων","panelTitle2":"Στυλ Εν ΣειÏά","panelTitle3":"Στυλ Αντικειμένων"},"table":{"border":"Πάχος ΠεÏιγÏάμματος","caption":"Λεζάντα","cell":{"menu":"Îελί","insertBefore":"Εισαγωγή ÎÎµÎ»Î¹Î¿Ï Î Ïιν","insertAfter":"Εισαγωγή ÎÎµÎ»Î¹Î¿Ï ÎœÎµÏ„Î¬","deleteCell":"ΔιαγÏαφή ÎελιÏν","merge":"Ενοποίηση ÎελιÏν","mergeRight":"ΣυγχÏνευση Με Δεξιά","mergeDown":"ΣυγχÏνευση Με Îάτω","splitHorizontal":"ΟÏιζόντια ΔιαίÏεση ÎελιοÏ","splitVertical":"ÎατακόÏυφη ΔιαίÏεση ÎελιοÏ","title":"Ιδιότητες ÎελιοÏ","cellType":"ΤÏπος ÎελιοÏ","rowSpan":"ΕÏÏος ΓÏαμμÏν","colSpan":"ΕÏÏος ΣτηλÏν","wordWrap":"Αναδίπλωση Λέξεων","hAlign":"ΟÏιζόντια Στοίχιση","vAlign":"Îάθετη Στοίχιση","alignBaseline":"Baseline","bgColor":"ΧÏÏμα Φόντου","borderColor":"ΧÏÏμα ΠεÏιγÏάμματος","data":"Δεδομένα","header":"Îεφαλίδα","yes":"Îαι","no":"Όχι","invalidWidth":"Το πλάτος του ÎºÎµÎ»Î¹Î¿Ï Ï€Ïέπει να είναι αÏιθμός.","invalidHeight":"Το Ïψος του ÎºÎµÎ»Î¹Î¿Ï Ï€Ïέπει να είναι αÏιθμός.","invalidRowSpan":"Το εÏÏος των γÏαμμÏν Ï€Ïέπει να είναι ακέÏαιος αÏιθμός.","invalidColSpan":"Το εÏÏος των στηλÏν Ï€Ïέπει να είναι ακέÏαιος αÏιθμός.","chooseColor":"Επιλέξτε"},"cellPad":"ΑναπλήÏωση κελιÏν","cellSpace":"Απόσταση κελιÏν","column":{"menu":"Στήλη","insertBefore":"Εισαγωγή Στήλης ΠÏιν","insertAfter":"Εισαγωγή Στήλης Μετά","deleteColumn":"ΔιαγÏαφή ΣτηλÏν"},"columns":"Στήλες","deleteTable":"ΔιαγÏαφή Πίνακα","headers":"Îεφαλίδες","headersBoth":"Îαι τα δÏο","headersColumn":"ΠÏÏτη στήλη","headersNone":"Îανένα","headersRow":"ΠÏÏτη ΓÏαμμή","invalidBorder":"Το πάχος του πεÏιγÏάμματος Ï€Ïέπει να είναι ένας αÏιθμός.","invalidCellPadding":"Η αναπλήÏωση των κελιÏν Ï€Ïέπει να είναι θετικός αÏιθμός.","invalidCellSpacing":"Η απόσταση Î¼ÎµÏ„Î±Î¾Ï Ï„Ï‰Î½ κελιÏν Ï€Ïέπει να είναι ένας θετικός αÏιθμός.","invalidCols":"Ο αÏιθμός των στηλÏν Ï€Ïέπει να είναι μεγαλÏτεÏος από 0.","invalidHeight":"Το Ïψος του πίνακα Ï€Ïέπει να είναι αÏιθμός.","invalidRows":"Ο αÏιθμός των σειÏÏν Ï€Ïέπει να είναι μεγαλÏτεÏος από 0.","invalidWidth":"Το πλάτος του πίνακα Ï€Ïέπει να είναι ένας αÏιθμός.","menu":"Ιδιότητες Πίνακα","row":{"menu":"ΓÏαμμή","insertBefore":"Εισαγωγή ΓÏαμμής ΠÏιν","insertAfter":"Εισαγωγή ΓÏαμμής Μετά","deleteRow":"ΔιαγÏαφή ΓÏαμμÏν"},"rows":"ΓÏαμμές","summary":"ΠεÏίληψη","title":"Ιδιότητες Πίνακα","toolbar":"Πίνακας","widthPc":"τοις εκατό","widthPx":"pixel","widthUnit":"μονάδα πλάτους"},"undo":{"redo":"Επανάληψη","undo":"ΑναίÏεση"},"wsc":{"btnIgnore":"Αγνόηση","btnIgnoreAll":"Αγνόηση όλων","btnReplace":"Αντικατάσταση","btnReplaceAll":"Αντικατάσταση όλων","btnUndo":"ΑναίÏεση","changeTo":"Αλλαγή σε","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Δεν υπάÏχει εγκατεστημένος οÏθογÏάφος. Θέλετε να τον κατεβάσετε Ï„ÏÏα;","manyChanges":"Ο οÏθογÏαφικός έλεγχος ολοκληÏÏθηκε: Άλλαξαν %1 λέξεις","noChanges":"Ο οÏθογÏαφικός έλεγχος ολοκληÏÏθηκε: Δεν άλλαξαν λέξεις","noMispell":"Ο οÏθογÏαφικός έλεγχος ολοκληÏÏθηκε: Δεν βÏέθηκαν λάθη","noSuggestions":"- Δεν υπάÏχουν Ï€Ïοτάσεις -","notAvailable":"Η υπηÏεσία δεν είναι διαθέσιμη αυτήν την στιγμή.","notInDic":"Δεν υπάÏχει στο λεξικό","oneChange":"Ο οÏθογÏαφικός έλεγχος ολοκληÏÏθηκε: Άλλαξε μια λέξη","progress":"Γίνεται οÏθογÏαφικός έλεγχος...","title":"ΟÏθογÏαφικός Έλεγχος","toolbar":"ΟÏθογÏαφικός Έλεγχος"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/en-au.js b/js/ckeditor/lang/en-au.js
new file mode 100644
index 0000000..026761f
--- /dev/null
+++ b/js/ckeditor/lang/en-au.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['en-au']={"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":"Align","alignLeft":"Left","alignRight":"Right","alignCenter":"Centre","alignJustify":"Justify","alignTop":"Top","alignMiddle":"Middle","alignBottom":"Bottom","alignNone":"None","invalidValue":"Invalid value.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","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>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Bold","italic":"Italic","strike":"Strike Through","subscript":"Subscript","superscript":"Superscript","underline":"Underline"},"blockquote":{"toolbar":"Block Quote"},"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","pasteArea":"Paste Area","pasteMsg":"Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK","securityMsg":"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.","title":"Paste"},"contextmenu":{"options":"Context Menu Options"},"button":{"selectedLabel":"%1 (Selected)"},"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"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"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"},"image":{"alertUrl":"Please type the image URL","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"},"fakeobjects":{"anchor":"Anchor","flash":"Flash Animation","hiddenfield":"Hidden Field","iframe":"IFrame","unknown":"Unknown Object"},"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","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","other":"<other>","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","toolbar":"Link","type":"Link Type","unlink":"Unlink","upload":"Upload"},"list":{"bulletedlist":"Insert/Remove Bulleted List","numberedlist":"Insert/Remove Numbered List"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximize","minimize":"Minimize"},"pastetext":{"button":"Paste as plain text","title":"Paste as Plain Text"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Paste from Word","toolbar":"Paste from Word"},"removeformat":{"toolbar":"Remove Format"},"sourcearea":{"toolbar":"Source"},"specialchar":{"options":"Special Character Options","title":"Select Special Character","toolbar":"Insert Special Character"},"scayt":{"btn_about":"About SCAYT","btn_dictionaries":"Dictionaries","btn_disable":"Disable SCAYT","btn_enable":"Enable SCAYT","btn_langs":"Languages","btn_options":"Options","text_title":"Spell Check As You Type"},"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"},"wsc":{"btnIgnore":"Ignore","btnIgnoreAll":"Ignore All","btnReplace":"Replace","btnReplaceAll":"Replace All","btnUndo":"Undo","changeTo":"Change to","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Spell checker not installed. Do you want to download it now?","manyChanges":"Spell check complete: %1 words changed","noChanges":"Spell check complete: No words changed","noMispell":"Spell check complete: No misspellings found","noSuggestions":"- No suggestions -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Not in dictionary","oneChange":"Spell check complete: One word changed","progress":"Spell check in progress...","title":"Spell Checker","toolbar":"Check Spelling"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/en-ca.js b/js/ckeditor/lang/en-ca.js
new file mode 100644
index 0000000..174f7be
--- /dev/null
+++ b/js/ckeditor/lang/en-ca.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['en-ca']={"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":"Align","alignLeft":"Left","alignRight":"Right","alignCenter":"Centre","alignJustify":"Justify","alignTop":"Top","alignMiddle":"Middle","alignBottom":"Bottom","alignNone":"None","invalidValue":"Invalid value.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","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>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Bold","italic":"Italic","strike":"Strike Through","subscript":"Subscript","superscript":"Superscript","underline":"Underline"},"blockquote":{"toolbar":"Block Quote"},"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","pasteArea":"Paste Area","pasteMsg":"Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK","securityMsg":"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.","title":"Paste"},"contextmenu":{"options":"Context Menu Options"},"button":{"selectedLabel":"%1 (Selected)"},"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"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"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"},"image":{"alertUrl":"Please type the image URL","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"},"fakeobjects":{"anchor":"Anchor","flash":"Flash Animation","hiddenfield":"Hidden Field","iframe":"IFrame","unknown":"Unknown Object"},"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","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","other":"<other>","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","toolbar":"Link","type":"Link Type","unlink":"Unlink","upload":"Upload"},"list":{"bulletedlist":"Insert/Remove Bulleted List","numberedlist":"Insert/Remove Numbered List"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximize","minimize":"Minimize"},"pastetext":{"button":"Paste as plain text","title":"Paste as Plain Text"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Paste from Word","toolbar":"Paste from Word"},"removeformat":{"toolbar":"Remove Format"},"sourcearea":{"toolbar":"Source"},"specialchar":{"options":"Special Character Options","title":"Select Special Character","toolbar":"Insert Special Character"},"scayt":{"btn_about":"About SCAYT","btn_dictionaries":"Dictionaries","btn_disable":"Disable SCAYT","btn_enable":"Enable SCAYT","btn_langs":"Languages","btn_options":"Options","text_title":"Spell Check As You Type"},"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"},"wsc":{"btnIgnore":"Ignore","btnIgnoreAll":"Ignore All","btnReplace":"Replace","btnReplaceAll":"Replace All","btnUndo":"Undo","changeTo":"Change to","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Spell checker not installed. Do you want to download it now?","manyChanges":"Spell check complete: %1 words changed","noChanges":"Spell check complete: No words changed","noMispell":"Spell check complete: No misspellings found","noSuggestions":"- No suggestions -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Not in dictionary","oneChange":"Spell check complete: One word changed","progress":"Spell check in progress...","title":"Spell Checker","toolbar":"Check Spelling"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/en-gb.js b/js/ckeditor/lang/en-gb.js
new file mode 100644
index 0000000..b29e97c
--- /dev/null
+++ b/js/ckeditor/lang/en-gb.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://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","alignLeft":"Left","alignRight":"Right","alignCenter":"Centre","alignJustify":"Justify","alignTop":"Top","alignMiddle":"Middle","alignBottom":"Bottom","alignNone":"None","invalidValue":"Invalid value.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","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>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Bold","italic":"Italic","strike":"Strike Through","subscript":"Subscript","superscript":"Superscript","underline":"Underline"},"blockquote":{"toolbar":"Block Quote"},"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","pasteArea":"Paste Area","pasteMsg":"Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK","securityMsg":"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.","title":"Paste"},"contextmenu":{"options":"Context Menu Options"},"button":{"selectedLabel":"%1 (Selected)"},"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"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"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"},"image":{"alertUrl":"Please type the image URL","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"},"fakeobjects":{"anchor":"Anchor","flash":"Flash Animation","hiddenfield":"Hidden Field","iframe":"IFrame","unknown":"Unknown Object"},"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","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","other":"<other>","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","toolbar":"Link","type":"Link Type","unlink":"Unlink","upload":"Upload"},"list":{"bulletedlist":"Insert/Remove Bulleted List","numberedlist":"Insert/Remove Numbered List"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximise","minimize":"Minimise"},"pastetext":{"button":"Paste as plain text","title":"Paste as Plain Text"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Paste from Word","toolbar":"Paste from Word"},"removeformat":{"toolbar":"Remove Format"},"sourcearea":{"toolbar":"Source"},"specialchar":{"options":"Special Character Options","title":"Select Special Character","toolbar":"Insert Special Character"},"scayt":{"btn_about":"About SCAYT","btn_dictionaries":"Dictionaries","btn_disable":"Disable SCAYT","btn_enable":"Enable SCAYT","btn_langs":"Languages","btn_options":"Options","text_title":"Spell Check As You Type"},"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"},"wsc":{"btnIgnore":"Ignore","btnIgnoreAll":"Ignore All","btnReplace":"Replace","btnReplaceAll":"Replace All","btnUndo":"Undo","changeTo":"Change to","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Spell checker not installed. Do you want to download it now?","manyChanges":"Spell check complete: %1 words changed","noChanges":"Spell check complete: No words changed","noMispell":"Spell check complete: No misspellings found","noSuggestions":"- No suggestions -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Not in dictionary","oneChange":"Spell check complete: One word changed","progress":"Spell check in progress...","title":"Spell Checker","toolbar":"Check Spelling"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/en.js b/js/ckeditor/lang/en.js
new file mode 100644
index 0000000..6e4e1b5
--- /dev/null
+++ b/js/ckeditor/lang/en.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://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","alignLeft":"Left","alignRight":"Right","alignCenter":"Center","alignJustify":"Justify","alignTop":"Top","alignMiddle":"Middle","alignBottom":"Bottom","alignNone":"None","invalidValue":"Invalid value.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","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>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Bold","italic":"Italic","strike":"Strikethrough","subscript":"Subscript","superscript":"Superscript","underline":"Underline"},"blockquote":{"toolbar":"Block Quote"},"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","pasteArea":"Paste Area","pasteMsg":"Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK","securityMsg":"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.","title":"Paste"},"contextmenu":{"options":"Context Menu Options"},"button":{"selectedLabel":"%1 (Selected)"},"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"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"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"},"image":{"alertUrl":"Please type the image URL","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"},"fakeobjects":{"anchor":"Anchor","flash":"Flash Animation","hiddenfield":"Hidden Field","iframe":"IFrame","unknown":"Unknown Object"},"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","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","other":"<other>","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","toolbar":"Link","type":"Link Type","unlink":"Unlink","upload":"Upload"},"list":{"bulletedlist":"Insert/Remove Bulleted List","numberedlist":"Insert/Remove Numbered List"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximize","minimize":"Minimize"},"pastetext":{"button":"Paste as plain text","title":"Paste as Plain Text"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Paste from Word","toolbar":"Paste from Word"},"removeformat":{"toolbar":"Remove Format"},"sourcearea":{"toolbar":"Source"},"specialchar":{"options":"Special Character Options","title":"Select Special Character","toolbar":"Insert Special Character"},"scayt":{"btn_about":"About SCAYT","btn_dictionaries":"Dictionaries","btn_disable":"Disable SCAYT","btn_enable":"Enable SCAYT","btn_langs":"Languages","btn_options":"Options","text_title":"Spell Check As You Type"},"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"},"wsc":{"btnIgnore":"Ignore","btnIgnoreAll":"Ignore All","btnReplace":"Replace","btnReplaceAll":"Replace All","btnUndo":"Undo","changeTo":"Change to","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Spell checker not installed. Do you want to download it now?","manyChanges":"Spell check complete: %1 words changed","noChanges":"Spell check complete: No words changed","noMispell":"Spell check complete: No misspellings found","noSuggestions":"- No suggestions -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Not in dictionary","oneChange":"Spell check complete: One word changed","progress":"Spell check in progress...","title":"Spell Checker","toolbar":"Check Spelling"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/eo.js b/js/ckeditor/lang/eo.js
new file mode 100644
index 0000000..3e35fcd
--- /dev/null
+++ b/js/ckeditor/lang/eo.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['eo']={"editor":"RiĉTeksta Redaktilo","editorPanel":"Panelo de la RiĉTeksta Redaktilo","common":{"editorHelp":"Premu ALT 0 por helpilo","browseServer":"Foliumi en la Servilo","url":"URL","protocol":"Protokolo","upload":"AlÅuti","uploadSubmit":"Sendu al Servilo","image":"Bildo","flash":"FlaÅo","form":"Formularo","checkbox":"Markobutono","radio":"Radiobutono","textField":"Teksta kampo","textarea":"Teksta Areo","hiddenField":"KaÅita Kampo","button":"Butono","select":"Elekta Kampo","imageButton":"Bildbutono","notSet":"<DefaÅ­lta>","id":"Id","name":"Nomo","langDir":"Skribdirekto","langDirLtr":"De maldekstro dekstren (LTR)","langDirRtl":"De dekstro maldekstren (RTL)","langCode":"Lingva Kodo","longDescr":"URL de Longa Priskribo","cssClass":"Klasoj de Stilfolioj","advisoryTitle":"Priskriba Titolo","cssStyle":"Stilo","ok":"Akcepti","cancel":"Rezigni","close":"Fermi","preview":"Vidigi Aspekton","resize":"Movigi por ÅanÄi la grandon","generalTab":"Äœenerala","advancedTab":"Speciala","validateNumberFailed":"Tiu valoro ne estas nombro.","confirmNewPage":"La neregistritaj ÅanÄoj estas perdotaj. Ĉu vi certas, ke vi volas Åargi novan paÄon?","confirmCancel":"Iuj opcioj esta ÅanÄitaj. Ĉu vi certas, ke vi volas fermi la dialogon?","options":"Opcioj","target":"Celo","targetNew":"Nova Fenestro (_blank)","targetTop":"Supra Fenestro (_top)","targetSelf":"Sama Fenestro (_self)","targetParent":"Patra Fenestro (_parent)","langDirLTR":"De maldekstro dekstren (LTR)","langDirRTL":"De dekstro maldekstren (RTL)","styles":"Stilo","cssClasses":"Stilfoliaj Klasoj","width":"LarÄo","height":"Alto","align":"Äœisrandigo","alignLeft":"Maldekstre","alignRight":"Dekstre","alignCenter":"Centre","alignJustify":"Äœisrandigi AmbaÅ­flanke","alignTop":"Supre","alignMiddle":"Centre","alignBottom":"Malsupre","alignNone":"None","invalidValue":"Nevalida Valoro","invalidHeight":"Alto devas esti nombro.","invalidWidth":"LarÄo devas esti nombro.","invalidCssLength":"La valoro indikita por la \"%1\" kampo devas esti pozitiva nombro kun aÅ­ sen valida CSSmezurunuo (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"La valoro indikita por la \"%1\" kampo devas esti pozitiva nombro kun aÅ­ sen valida HTMLmezurunuo (px or %).","invalidInlineStyle":"La valoro indikita por la enlinia stilo devas konsisti el unu aÅ­ pluraj elementoj kun la formato de \"nomo : valoro\", apartigitaj per punktokomoj.","cssLengthTooltip":"Entajpu nombron por rastrumera valoro aÅ­ nombron kun valida CSSunuo (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, nehavebla</span>"},"about":{"copy":"Copyright &copy; $1. Ĉiuj rajtoj rezervitaj.","dlgTitle":"Pri CKEditor","help":"Kontroli $1 por helpo.","moreInfo":"Por informoj pri licenco, bonvolu viziti nian retpaÄaron:","title":"Pri CKEditor","userGuide":"CKEditor Uzindikoj"},"basicstyles":{"bold":"Grasa","italic":"Kursiva","strike":"Trastreko","subscript":"Suba indico","superscript":"Supra indico","underline":"Substreko"},"blockquote":{"toolbar":"Citaĵo"},"clipboard":{"copy":"Kopii","copyError":"La sekurecagordo de via TTT-legilo ne permesas, ke la redaktilo faras kopiajn operaciojn. Bonvolu uzi la klavaron por tio (Ctrl/Cmd-C).","cut":"Eltondi","cutError":"La sekurecagordo de via TTT-legilo ne permesas, ke la redaktilo faras eltondajn operaciojn. Bonvolu uzi la klavaron por tio (Ctrl/Cmd-X).","paste":"Interglui","pasteArea":"Intergluoareo","pasteMsg":"Bonvolu glui la tekston en la jenan areon per uzado de la klavaro (<strong>Ctrl/Cmd+V</strong>) kaj premu OK","securityMsg":"Pro la sekurecagordo de via TTT-legilo, la redaktilo ne povas rekte atingi viajn datenojn en la poÅo. Bonvolu denove interglui la datenojn en tiun fenestron.","title":"Interglui"},"contextmenu":{"options":"Opcioj de Kunteksta Menuo"},"button":{"selectedLabel":"%1 (Selektita)"},"toolbar":{"toolbarCollapse":"Faldi la ilbreton","toolbarExpand":"Malfaldi la ilbreton","toolbarGroups":{"document":"Dokumento","clipboard":"PoÅo/Malfari","editing":"Redaktado","forms":"Formularoj","basicstyles":"Bazaj stiloj","paragraph":"Paragrafo","links":"Ligiloj","insert":"Enmeti","styles":"Stiloj","colors":"Koloroj","tools":"Iloj"},"toolbars":"Ilobretoj de la redaktilo"},"elementspath":{"eleLabel":"Vojo al Elementoj","eleTitle":"%1 elementoj"},"format":{"label":"Formato","panelTitle":"ParagrafFormato","tag_address":"Adreso","tag_div":"Normala (DIV)","tag_h1":"Titolo 1","tag_h2":"Titolo 2","tag_h3":"Titolo 3","tag_h4":"Titolo 4","tag_h5":"Titolo 5","tag_h6":"Titolo 6","tag_p":"Normala","tag_pre":"Formatita"},"horizontalrule":{"toolbar":"Enmeti Horizontalan Linion"},"image":{"alertUrl":"Bonvolu tajpi la retadreson de la bildo","alt":"AnstataÅ­iga Teksto","border":"Bordero","btnUpload":"Sendu al Servilo","button2Img":"Ĉu vi volas transformi la selektitan bildbutonon en simplan bildon?","hSpace":"Horizontala Spaco","img2Button":"Ĉu vi volas transformi la selektitan bildon en bildbutonon?","infoTab":"Informoj pri Bildo","linkTab":"Ligilo","lockRatio":"Konservi Proporcion","menu":"Atributoj de Bildo","resetSize":"Origina Grando","title":"Atributoj de Bildo","titleButton":"Bildbutonaj Atributoj","upload":"AlÅuti","urlMissing":"La fontretadreso de la bildo mankas.","vSpace":"Vertikala Spaco","validateBorder":"La bordero devas esti entjera nombro.","validateHSpace":"La horizontala spaco devas esti entjera nombro.","validateVSpace":"La vertikala spaco devas esti entjera nombro."},"indent":{"indent":"Pligrandigi KrommarÄenon","outdent":"Malpligrandigi KrommarÄenon"},"fakeobjects":{"anchor":"Ankro","flash":"FlaÅAnimacio","hiddenfield":"KaÅita kampo","iframe":"Enlinia Kadro (IFrame)","unknown":"Nekonata objekto"},"link":{"acccessKey":"Fulmoklavo","advanced":"Speciala","advisoryContentType":"Enhavotipo","advisoryTitle":"Priskriba Titolo","anchor":{"toolbar":"Ankro","menu":"Enmeti/ÅœanÄi Ankron","title":"Ankraj Atributoj","name":"Ankra Nomo","errorName":"Bv entajpi la ankran nomon","remove":"Forigi Ankron"},"anchorId":"Per Elementidentigilo","anchorName":"Per Ankronomo","charset":"Signaro de la Ligita Rimedo","cssClasses":"Klasoj de Stilfolioj","emailAddress":"RetpoÅto","emailBody":"MesaÄa korpo","emailSubject":"MesaÄa Temo","id":"Id","info":"Informoj pri la Ligilo","langCode":"Lingva Kodo","langDir":"Skribdirekto","langDirLTR":"De maldekstro dekstren (LTR)","langDirRTL":"De dekstro maldekstren (RTL)","menu":"ÅœanÄi Ligilon","name":"Nomo","noAnchors":"<Ne disponeblas ankroj en la dokumento>","noEmail":"Bonvolu entajpi la retpoÅtadreson","noUrl":"Bonvolu entajpi la URL-on","other":"<alia>","popupDependent":"Dependa (Netscape)","popupFeatures":"Atributoj de la Åœprucfenestro","popupFullScreen":"Tutekrane (IE)","popupLeft":"Maldekstra Pozicio","popupLocationBar":"Adresobreto","popupMenuBar":"Menubreto","popupResizable":"DimensiÅanÄebla","popupScrollBars":"Rulumskaloj","popupStatusBar":"Statobreto","popupToolbar":"Ilobreto","popupTop":"Supra Pozicio","rel":"Rilato","selectAnchor":"Elekti Ankron","styles":"Stilo","tabIndex":"Taba Indekso","target":"Celo","targetFrame":"<kadro>","targetFrameName":"Nomo de CelKadro","targetPopup":"<Åprucfenestro>","targetPopupName":"Nomo de Åœprucfenestro","title":"Ligilo","toAnchor":"Ankri en tiu ĉi paÄo","toEmail":"RetpoÅto","toUrl":"URL","toolbar":"Enmeti/ÅœanÄi Ligilon","type":"Tipo de Ligilo","unlink":"Forigi Ligilon","upload":"AlÅuti"},"list":{"bulletedlist":"Bula Listo","numberedlist":"Numera Listo"},"magicline":{"title":"Enmeti paragrafon ĉi-tien"},"maximize":{"maximize":"Pligrandigi","minimize":"Malgrandigi"},"pastetext":{"button":"Interglui kiel platan tekston","title":"Interglui kiel platan tekston"},"pastefromword":{"confirmCleanup":"La teksto, kiun vi volas interglui, Åajnas esti kopiita el Word. Ĉu vi deziras purigi Äin antaÅ­ intergluo?","error":"Ne eblis purigi la intergluitajn datenojn pro interna eraro","title":"Interglui el Word","toolbar":"Interglui el Word"},"removeformat":{"toolbar":"Forigi Formaton"},"sourcearea":{"toolbar":"Fonto"},"specialchar":{"options":"Opcioj pri Specialaj Signoj","title":"Selekti Specialan Signon","toolbar":"Enmeti Specialan Signon"},"scayt":{"btn_about":"Pri OKDVT","btn_dictionaries":"Vortaroj","btn_disable":"Malebligi OKDVT","btn_enable":"Ebligi OKDVT","btn_langs":"Lingvoj","btn_options":"Opcioj","text_title":"OrtografiKontrolado Dum Vi Tajpas (OKDVT)"},"stylescombo":{"label":"Stiloj","panelTitle":"Stiloj pri enpaÄigo","panelTitle1":"Stiloj de blokoj","panelTitle2":"Enliniaj Stiloj","panelTitle3":"Stiloj de objektoj"},"table":{"border":"Bordero","caption":"Tabeltitolo","cell":{"menu":"Ĉelo","insertBefore":"Enmeti Ĉelon AntaÅ­","insertAfter":"Enmeti Ĉelon Post","deleteCell":"Forigi la Ĉelojn","merge":"Kunfandi la Ĉelojn","mergeRight":"Kunfandi dekstren","mergeDown":"Kunfandi malsupren ","splitHorizontal":"Horizontale dividi","splitVertical":"Vertikale dividi","title":"Ĉelatributoj","cellType":"Ĉeltipo","rowSpan":"Kunfando de linioj","colSpan":"Kunfando de kolumnoj","wordWrap":"Cezuro","hAlign":"Horizontala Äisrandigo","vAlign":"Vertikala Äisrandigo","alignBaseline":"Malsupro de la teksto","bgColor":"Fonkoloro","borderColor":"Borderkoloro","data":"Datenoj","header":"Supra paÄotitolo","yes":"Jes","no":"No","invalidWidth":"ĈellarÄo devas esti nombro.","invalidHeight":"Ĉelalto devas esti nombro.","invalidRowSpan":"Kunfando de linioj devas esti entjera nombro.","invalidColSpan":"Kunfando de kolumnoj devas esti entjera nombro.","chooseColor":"Elektu"},"cellPad":"Interna MarÄeno de la ĉeloj","cellSpace":"Spaco inter la Ĉeloj","column":{"menu":"Kolumno","insertBefore":"Enmeti kolumnon antaÅ­","insertAfter":"Enmeti kolumnon post","deleteColumn":"Forigi Kolumnojn"},"columns":"Kolumnoj","deleteTable":"Forigi Tabelon","headers":"Supraj PaÄotitoloj","headersBoth":"AmbaÅ­","headersColumn":"Unua kolumno","headersNone":"Neniu","headersRow":"Unua linio","invalidBorder":"La bordergrando devas esti nombro.","invalidCellPadding":"La interna marÄeno en la ĉeloj devas esti pozitiva nombro.","invalidCellSpacing":"La spaco inter la ĉeloj devas esti pozitiva nombro.","invalidCols":"La nombro de la kolumnoj devas superi 0.","invalidHeight":"La tabelalto devas esti nombro.","invalidRows":"La nombro de la linioj devas superi 0.","invalidWidth":"La tabellarÄo devas esti nombro.","menu":"Atributoj de Tabelo","row":{"menu":"Linio","insertBefore":"Enmeti linion antaÅ­","insertAfter":"Enmeti linion post","deleteRow":"Forigi Liniojn"},"rows":"Linioj","summary":"Resumo","title":"Atributoj de Tabelo","toolbar":"Tabelo","widthPc":"elcentoj","widthPx":"Rastrumeroj","widthUnit":"unuo de larÄo"},"undo":{"redo":"Refari","undo":"Malfari"},"wsc":{"btnIgnore":"Ignori","btnIgnoreAll":"Ignori Ĉion","btnReplace":"AnstataÅ­igi","btnReplaceAll":"AnstataÅ­igi Ĉion","btnUndo":"Malfari","changeTo":"ÅœanÄi al","errorLoading":"Eraro en la servoelÅuto el la gastiga komputiko: %s.","ieSpellDownload":"Ortografikontrolilo ne instalita. Ĉu vi volas elÅuti Äin nun?","manyChanges":"Ortografikontrolado finita: %1 vortoj korektitaj","noChanges":"Ortografikontrolado finita: neniu vorto korektita","noMispell":"Ortografikontrolado finita: neniu eraro trovita","noSuggestions":"- Neniu propono -","notAvailable":"BedaÅ­rinde la servo ne funkcias nuntempe.","notInDic":"Ne trovita en la vortaro","oneChange":"Ortografikontrolado finita: unu vorto korektita","progress":"La ortografio estas kontrolata...","title":"Kontroli la ortografion","toolbar":"Kontroli la ortografion"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/es.js b/js/ckeditor/lang/es.js
new file mode 100644
index 0000000..0a86852
--- /dev/null
+++ b/js/ckeditor/lang/es.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['es']={"editor":"Editor de texto enriquecido","editorPanel":"Panel del Editor de Texto Enriquecido","common":{"editorHelp":"Pulse ALT 0 para ayuda","browseServer":"Ver Servidor","url":"URL","protocol":"Protocolo","upload":"Cargar","uploadSubmit":"Enviar al Servidor","image":"Imagen","flash":"Flash","form":"Formulario","checkbox":"Casilla de VerificaciĂ³n","radio":"Botones de Radio","textField":"Campo de Texto","textarea":"Area de Texto","hiddenField":"Campo Oculto","button":"BotĂ³n","select":"Campo de SelecciĂ³n","imageButton":"BotĂ³n Imagen","notSet":"<No definido>","id":"Id","name":"Nombre","langDir":"OrientaciĂ³n","langDirLtr":"Izquierda a Derecha (LTR)","langDirRtl":"Derecha a Izquierda (RTL)","langCode":"CĂ³d. de idioma","longDescr":"DescripciĂ³n larga URL","cssClass":"Clases de hojas de estilo","advisoryTitle":"TĂ­tulo","cssStyle":"Estilo","ok":"Aceptar","cancel":"Cancelar","close":"Cerrar","preview":"PrevisualizaciĂ³n","resize":"Arrastre para redimensionar","generalTab":"General","advancedTab":"Avanzado","validateNumberFailed":"El valor no es un nĂºmero.","confirmNewPage":"Cualquier cambio que no se haya guardado se perderĂ¡.\r\n¿EstĂ¡ seguro de querer crear una nueva pĂ¡gina?","confirmCancel":"Algunas de las opciones se han cambiado.\r\n¿EstĂ¡ seguro de querer cerrar el diĂ¡logo?","options":"Opciones","target":"Destino","targetNew":"Nueva ventana (_blank)","targetTop":"Ventana principal (_top)","targetSelf":"Misma ventana (_self)","targetParent":"Ventana padre (_parent)","langDirLTR":"Izquierda a derecha (LTR)","langDirRTL":"Derecha a izquierda (RTL)","styles":"Estilos","cssClasses":"Clase de la hoja de estilos","width":"Anchura","height":"Altura","align":"AlineaciĂ³n","alignLeft":"Izquierda","alignRight":"Derecha","alignCenter":"Centrado","alignJustify":"Justificado","alignTop":"Tope","alignMiddle":"Centro","alignBottom":"Pie","alignNone":"None","invalidValue":"Valor no vĂ¡lido","invalidHeight":"Altura debe ser un nĂºmero.","invalidWidth":"Anchura debe ser un nĂºmero.","invalidCssLength":"El valor especificado para el campo \"%1\" debe ser un nĂºmero positivo, incluyendo optionalmente una unidad de medida CSS vĂ¡lida (px, %, in, cm, mm, em, ex, pt, o pc).","invalidHtmlLength":"El valor especificado para el campo \"%1\" debe ser un nĂºmero positivo, incluyendo optionalmente una unidad de medida HTML vĂ¡lida (px o %).","invalidInlineStyle":"El valor especificado para el estilo debe consistir en uno o mĂ¡s pares con el formato \"nombre: valor\", separados por punto y coma.","cssLengthTooltip":"Introduca un nĂºmero para el valor en pixels o un nĂºmero con una unidad de medida CSS vĂ¡lida (px, %, in, cm, mm, em, ex, pt, o pc).","unavailable":"%1<span class=\"cke_accessibility\">, no disponible</span>"},"about":{"copy":"Copyright &copy; $1. Todos los derechos reservados.","dlgTitle":"Acerca de CKEditor","help":"Lea la $1 para resolver sus dudas.","moreInfo":"Para informaciĂ³n de licencia, por favor visite nuestro sitio web:","title":"Acerca de CKEditor","userGuide":"GuĂ­a de usuario de CKEditor"},"basicstyles":{"bold":"Negrita","italic":"Cursiva","strike":"Tachado","subscript":"SubĂ­ndice","superscript":"SuperĂ­ndice","underline":"Subrayado"},"blockquote":{"toolbar":"Cita"},"clipboard":{"copy":"Copiar","copyError":"La configuraciĂ³n de seguridad de este navegador no permite la ejecuciĂ³n automĂ¡tica de operaciones de copiado.\r\nPor favor use el teclado (Ctrl/Cmd+C).","cut":"Cortar","cutError":"La configuraciĂ³n de seguridad de este navegador no permite la ejecuciĂ³n automĂ¡tica de operaciones de cortado.\r\nPor favor use el teclado (Ctrl/Cmd+X).","paste":"Pegar","pasteArea":"Zona de pegado","pasteMsg":"Por favor pegue dentro del cuadro utilizando el teclado (<STRONG>Ctrl/Cmd+V</STRONG>);\r\nluego presione <STRONG>Aceptar</STRONG>.","securityMsg":"Debido a la configuraciĂ³n de seguridad de su navegador, el editor no tiene acceso al portapapeles.\r\nEs necesario que lo pegue de nuevo en esta ventana.","title":"Pegar"},"contextmenu":{"options":"Opciones del menĂº contextual"},"button":{"selectedLabel":"%1 (Selected)"},"toolbar":{"toolbarCollapse":"Contraer barra de herramientas","toolbarExpand":"Expandir barra de herramientas","toolbarGroups":{"document":"Documento","clipboard":"Portapapeles/Deshacer","editing":"EdiciĂ³n","forms":"Formularios","basicstyles":"Estilos bĂ¡sicos","paragraph":"PĂ¡rrafo","links":"Enlaces","insert":"Insertar","styles":"Estilos","colors":"Colores","tools":"Herramientas"},"toolbars":"Barras de herramientas del editor"},"elementspath":{"eleLabel":"Ruta de los elementos","eleTitle":"%1 elemento"},"format":{"label":"Formato","panelTitle":"Formato","tag_address":"DirecciĂ³n","tag_div":"Normal (DIV)","tag_h1":"Encabezado 1","tag_h2":"Encabezado 2","tag_h3":"Encabezado 3","tag_h4":"Encabezado 4","tag_h5":"Encabezado 5","tag_h6":"Encabezado 6","tag_p":"Normal","tag_pre":"Con formato"},"horizontalrule":{"toolbar":"Insertar LĂ­nea Horizontal"},"image":{"alertUrl":"Por favor escriba la URL de la imagen","alt":"Texto Alternativo","border":"Borde","btnUpload":"Enviar al Servidor","button2Img":"¿Desea convertir el botĂ³n de imagen en una simple imagen?","hSpace":"Esp.Horiz","img2Button":"¿Desea convertir la imagen en un botĂ³n de imagen?","infoTab":"InformaciĂ³n de Imagen","linkTab":"VĂ­nculo","lockRatio":"Proporcional","menu":"Propiedades de Imagen","resetSize":"Tamaño Original","title":"Propiedades de Imagen","titleButton":"Propiedades de BotĂ³n de Imagen","upload":"Cargar","urlMissing":"Debe indicar la URL de la imagen.","vSpace":"Esp.Vert","validateBorder":"El borde debe ser un nĂºmero.","validateHSpace":"El espaciado horizontal debe ser un nĂºmero.","validateVSpace":"El espaciado vertical debe ser un nĂºmero."},"indent":{"indent":"Aumentar SangrĂ­a","outdent":"Disminuir SangrĂ­a"},"fakeobjects":{"anchor":"Ancla","flash":"AnimaciĂ³n flash","hiddenfield":"Campo oculto","iframe":"IFrame","unknown":"Objeto desconocido"},"link":{"acccessKey":"Tecla de Acceso","advanced":"Avanzado","advisoryContentType":"Tipo de Contenido","advisoryTitle":"TĂ­tulo","anchor":{"toolbar":"Referencia","menu":"Propiedades de Referencia","title":"Propiedades de Referencia","name":"Nombre de la Referencia","errorName":"Por favor, complete el nombre de la Referencia","remove":"Quitar Referencia"},"anchorId":"Por ID de elemento","anchorName":"Por Nombre de Referencia","charset":"Fuente de caracteres vinculado","cssClasses":"Clases de hojas de estilo","emailAddress":"DirecciĂ³n de E-Mail","emailBody":"Cuerpo del Mensaje","emailSubject":"TĂ­tulo del Mensaje","id":"Id","info":"InformaciĂ³n de VĂ­nculo","langCode":"CĂ³digo idioma","langDir":"OrientaciĂ³n","langDirLTR":"Izquierda a Derecha (LTR)","langDirRTL":"Derecha a Izquierda (RTL)","menu":"Editar VĂ­nculo","name":"Nombre","noAnchors":"(No hay referencias disponibles en el documento)","noEmail":"Por favor escriba la direcciĂ³n de e-mail","noUrl":"Por favor escriba el vĂ­nculo URL","other":"<otro>","popupDependent":"Dependiente (Netscape)","popupFeatures":"CaracterĂ­sticas de Ventana Emergente","popupFullScreen":"Pantalla Completa (IE)","popupLeft":"PosiciĂ³n Izquierda","popupLocationBar":"Barra de ubicaciĂ³n","popupMenuBar":"Barra de MenĂº","popupResizable":"Redimensionable","popupScrollBars":"Barras de desplazamiento","popupStatusBar":"Barra de Estado","popupToolbar":"Barra de Herramientas","popupTop":"PosiciĂ³n Derecha","rel":"RelaciĂ³n","selectAnchor":"Seleccionar una referencia","styles":"Estilo","tabIndex":"Indice de tabulaciĂ³n","target":"Destino","targetFrame":"<marco>","targetFrameName":"Nombre del Marco Destino","targetPopup":"<ventana emergente>","targetPopupName":"Nombre de Ventana Emergente","title":"VĂ­nculo","toAnchor":"Referencia en esta pĂ¡gina","toEmail":"E-Mail","toUrl":"URL","toolbar":"Insertar/Editar VĂ­nculo","type":"Tipo de vĂ­nculo","unlink":"Eliminar VĂ­nculo","upload":"Cargar"},"list":{"bulletedlist":"Viñetas","numberedlist":"NumeraciĂ³n"},"magicline":{"title":"Insertar pĂ¡rrafo aquĂ­"},"maximize":{"maximize":"Maximizar","minimize":"Minimizar"},"pastetext":{"button":"Pegar como Texto Plano","title":"Pegar como Texto Plano"},"pastefromword":{"confirmCleanup":"El texto que desea parece provenir de Word.\r\n¿Desea depurarlo antes de pegarlo?","error":"No ha sido posible limpiar los datos debido a un error interno","title":"Pegar desde Word","toolbar":"Pegar desde Word"},"removeformat":{"toolbar":"Eliminar Formato"},"sourcearea":{"toolbar":"Fuente HTML"},"specialchar":{"options":"Opciones de caracteres especiales","title":"Seleccione un caracter especial","toolbar":"Insertar Caracter Especial"},"scayt":{"btn_about":"Acerca de Corrector","btn_dictionaries":"Diccionarios","btn_disable":"Desactivar Corrector","btn_enable":"Activar Corrector","btn_langs":"Idiomas","btn_options":"Opciones","text_title":"Comprobar OrtografĂ­a Mientras Escribe"},"stylescombo":{"label":"Estilo","panelTitle":"Estilos para formatear","panelTitle1":"Estilos de pĂ¡rrafo","panelTitle2":"Estilos de carĂ¡cter","panelTitle3":"Estilos de objeto"},"table":{"border":"Tamaño de Borde","caption":"TĂ­tulo","cell":{"menu":"Celda","insertBefore":"Insertar celda a la izquierda","insertAfter":"Insertar celda a la derecha","deleteCell":"Eliminar Celdas","merge":"Combinar Celdas","mergeRight":"Combinar a la derecha","mergeDown":"Combinar hacia abajo","splitHorizontal":"Dividir la celda horizontalmente","splitVertical":"Dividir la celda verticalmente","title":"Propiedades de celda","cellType":"Tipo de Celda","rowSpan":"Expandir filas","colSpan":"Expandir columnas","wordWrap":"Ajustar al contenido","hAlign":"AlineaciĂ³n Horizontal","vAlign":"AlineaciĂ³n Vertical","alignBaseline":"Linea de base","bgColor":"Color de fondo","borderColor":"Color de borde","data":"Datos","header":"Encabezado","yes":"SĂ­","no":"No","invalidWidth":"La anchura de celda debe ser un nĂºmero.","invalidHeight":"La altura de celda debe ser un nĂºmero.","invalidRowSpan":"La expansiĂ³n de filas debe ser un nĂºmero entero.","invalidColSpan":"La expansiĂ³n de columnas debe ser un nĂºmero entero.","chooseColor":"Elegir"},"cellPad":"Esp. interior","cellSpace":"Esp. e/celdas","column":{"menu":"Columna","insertBefore":"Insertar columna a la izquierda","insertAfter":"Insertar columna a la derecha","deleteColumn":"Eliminar Columnas"},"columns":"Columnas","deleteTable":"Eliminar Tabla","headers":"Encabezados","headersBoth":"Ambas","headersColumn":"Primera columna","headersNone":"Ninguno","headersRow":"Primera fila","invalidBorder":"El tamaño del borde debe ser un nĂºmero.","invalidCellPadding":"El espaciado interior debe ser un nĂºmero.","invalidCellSpacing":"El espaciado entre celdas debe ser un nĂºmero.","invalidCols":"El nĂºmero de columnas debe ser un nĂºmero mayor que 0.","invalidHeight":"La altura de tabla debe ser un nĂºmero.","invalidRows":"El nĂºmero de filas debe ser un nĂºmero mayor que 0.","invalidWidth":"La anchura de tabla debe ser un nĂºmero.","menu":"Propiedades de Tabla","row":{"menu":"Fila","insertBefore":"Insertar fila en la parte superior","insertAfter":"Insertar fila en la parte inferior","deleteRow":"Eliminar Filas"},"rows":"Filas","summary":"SĂ­ntesis","title":"Propiedades de Tabla","toolbar":"Tabla","widthPc":"porcentaje","widthPx":"pixeles","widthUnit":"unidad de la anchura"},"undo":{"redo":"Rehacer","undo":"Deshacer"},"wsc":{"btnIgnore":"Ignorar","btnIgnoreAll":"Ignorar Todo","btnReplace":"Reemplazar","btnReplaceAll":"Reemplazar Todo","btnUndo":"Deshacer","changeTo":"Cambiar a","errorLoading":"Error cargando la aplicaciĂ³n del servidor: %s.","ieSpellDownload":"MĂ³dulo de Control de OrtografĂ­a no instalado.\r\n¿Desea descargarlo ahora?","manyChanges":"Control finalizado: se ha cambiado %1 palabras","noChanges":"Control finalizado: no se ha cambiado ninguna palabra","noMispell":"Control finalizado: no se encontraron errores","noSuggestions":"- No hay sugerencias -","notAvailable":"Lo sentimos pero el servicio no estĂ¡ disponible.","notInDic":"No se encuentra en el Diccionario","oneChange":"Control finalizado: se ha cambiado una palabra","progress":"Control de OrtografĂ­a en progreso...","title":"Comprobar ortografĂ­a","toolbar":"OrtografĂ­a"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/et.js b/js/ckeditor/lang/et.js
new file mode 100644
index 0000000..58297dd
--- /dev/null
+++ b/js/ckeditor/lang/et.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['et']={"editor":"Rikkalik tekstiredaktor","editorPanel":"Rikkaliku tekstiredaktori paneel","common":{"editorHelp":"Abi saamiseks vajuta ALT 0","browseServer":"Serveri sirvimine","url":"URL","protocol":"Protokoll","upload":"Laadi Ă¼les","uploadSubmit":"Saada serverisse","image":"Pilt","flash":"Flash","form":"Vorm","checkbox":"Märkeruut","radio":"Raadionupp","textField":"Tekstilahter","textarea":"Tekstiala","hiddenField":"Varjatud lahter","button":"Nupp","select":"Valiklahter","imageButton":"Piltnupp","notSet":"<määramata>","id":"ID","name":"Nimi","langDir":"Keele suund","langDirLtr":"Vasakult paremale (LTR)","langDirRtl":"Paremalt vasakule (RTL)","langCode":"Keele kood","longDescr":"Pikk kirjeldus URL","cssClass":"Stiilistiku klassid","advisoryTitle":"Soovituslik pealkiri","cssStyle":"Laad","ok":"Olgu","cancel":"Loobu","close":"Sulge","preview":"Eelvaade","resize":"Suuruse muutmiseks lohista","generalTab":"Ăœldine","advancedTab":"Täpsemalt","validateNumberFailed":"See väärtus pole number.","confirmNewPage":"Kõik salvestamata muudatused lähevad kaotsi. Kas oled kindel, et tahad laadida uue lehe?","confirmCancel":"Mõned valikud on muudetud. Kas oled kindel, et tahad dialoogi sulgeda?","options":"Valikud","target":"Sihtkoht","targetNew":"Uus aken (_blank)","targetTop":"Kõige Ă¼lemine aken (_top)","targetSelf":"Sama aken (_self)","targetParent":"Vanemaken (_parent)","langDirLTR":"Vasakult paremale (LTR)","langDirRTL":"Paremalt vasakule (RTL)","styles":"Stiili","cssClasses":"Stiililehe klassid","width":"Laius","height":"Kõrgus","align":"Joondus","alignLeft":"Vasak","alignRight":"Paremale","alignCenter":"Kesk","alignJustify":"Rööpjoondus","alignTop":"Ăœles","alignMiddle":"Keskele","alignBottom":"Alla","alignNone":"None","invalidValue":"Vigane väärtus.","invalidHeight":"Kõrgus peab olema number.","invalidWidth":"Laius peab olema number.","invalidCssLength":"\"%1\" välja jaoks määratud väärtus peab olema positiivne täisarv CSS Ă¼hikuga (px, %, in, cm, mm, em, ex, pt või pc) või ilma.","invalidHtmlLength":"\"%1\" välja jaoks määratud väärtus peab olema positiivne täisarv HTML Ă¼hikuga (px või %) või ilma.","invalidInlineStyle":"Reasisese stiili määrangud peavad koosnema paarisväärtustest (tuples), mis on semikoolonitega eraldatult järgnevas vormingus: \"nimi : väärtus\".","cssLengthTooltip":"Sisesta väärtus pikslites või number koos sobiva CSS-i Ă¼hikuga (px, %, in, cm, mm, em, ex, pt või pc).","unavailable":"%1<span class=\"cke_accessibility\">, pole saadaval</span>"},"about":{"copy":"Copyright &copy; $1. Kõik õigused kaitstud.","dlgTitle":"CKEditorist","help":"Abi jaoks vaata $1.","moreInfo":"Litsentsi andmed leiab meie veebilehelt:","title":"CKEditorist","userGuide":"CKEditori kasutusjuhendit"},"basicstyles":{"bold":"Paks","italic":"Kursiiv","strike":"Läbijoonitud","subscript":"Allindeks","superscript":"Ăœlaindeks","underline":"Allajoonitud"},"blockquote":{"toolbar":"Blokktsitaat"},"clipboard":{"copy":"Kopeeri","copyError":"Sinu veebisirvija turvaseaded ei luba redaktoril automaatselt kopeerida. Palun kasutage selleks klaviatuuri klahvikombinatsiooni (Ctrl/Cmd+C).","cut":"Lõika","cutError":"Sinu veebisirvija turvaseaded ei luba redaktoril automaatselt lõigata. Palun kasutage selleks klaviatuuri klahvikombinatsiooni (Ctrl/Cmd+X).","paste":"Aseta","pasteArea":"Asetamise ala","pasteMsg":"Palun aseta tekst järgnevasse kasti kasutades klaviatuuri klahvikombinatsiooni (<STRONG>Ctrl/Cmd+V</STRONG>) ja vajuta seejärel <STRONG>OK</STRONG>.","securityMsg":"Sinu veebisirvija turvaseadete tõttu ei oma redaktor otsest ligipääsu lõikelaua andmetele. Sa pead asetama need uuesti siia aknasse.","title":"Asetamine"},"contextmenu":{"options":"KontekstimenĂ¼Ă¼ valikud"},"button":{"selectedLabel":"%1 (Selected)"},"toolbar":{"toolbarCollapse":"Tööriistariba peitmine","toolbarExpand":"Tööriistariba näitamine","toolbarGroups":{"document":"Dokument","clipboard":"Lõikelaud/tagasivõtmine","editing":"Muutmine","forms":"Vormid","basicstyles":"Põhistiilid","paragraph":"Lõik","links":"Lingid","insert":"Sisesta","styles":"Stiilid","colors":"Värvid","tools":"Tööriistad"},"toolbars":"Redaktori tööriistaribad"},"elementspath":{"eleLabel":"Elementide asukoht","eleTitle":"%1 element"},"format":{"label":"Vorming","panelTitle":"Vorming","tag_address":"Aadress","tag_div":"Tavaline (DIV)","tag_h1":"Pealkiri 1","tag_h2":"Pealkiri 2","tag_h3":"Pealkiri 3","tag_h4":"Pealkiri 4","tag_h5":"Pealkiri 5","tag_h6":"Pealkiri 6","tag_p":"Tavaline","tag_pre":"Vormindatud"},"horizontalrule":{"toolbar":"Horisontaaljoone sisestamine"},"image":{"alertUrl":"Palun kirjuta pildi URL","alt":"Alternatiivne tekst","border":"Joon","btnUpload":"Saada serverisse","button2Img":"Kas tahad teisendada valitud pildiga nupu tavaliseks pildiks?","hSpace":"H. vaheruum","img2Button":"Kas tahad teisendada valitud tavalise pildi pildiga nupuks?","infoTab":"Pildi info","linkTab":"Link","lockRatio":"Lukusta kuvasuhe","menu":"Pildi omadused","resetSize":"Lähtesta suurus","title":"Pildi omadused","titleButton":"Piltnupu omadused","upload":"Lae Ă¼les","urlMissing":"Pildi lähte-URL on puudu.","vSpace":"V. vaheruum","validateBorder":"Äärise laius peab olema täisarv.","validateHSpace":"Horisontaalne vaheruum peab olema täisarv.","validateVSpace":"Vertikaalne vaheruum peab olema täisarv."},"indent":{"indent":"Taande suurendamine","outdent":"Taande vähendamine"},"fakeobjects":{"anchor":"Ankur","flash":"Flashi animatsioon","hiddenfield":"Varjatud väli","iframe":"IFrame","unknown":"Tundmatu objekt"},"link":{"acccessKey":"Juurdepääsu võti","advanced":"Täpsemalt","advisoryContentType":"Juhendava sisu tĂ¼Ă¼p","advisoryTitle":"Juhendav tiitel","anchor":{"toolbar":"Ankru sisestamine/muutmine","menu":"Ankru omadused","title":"Ankru omadused","name":"Ankru nimi","errorName":"Palun sisesta ankru nimi","remove":"Eemalda ankur"},"anchorId":"Elemendi id järgi","anchorName":"Ankru nime järgi","charset":"Lingitud ressursi märgistik","cssClasses":"Stiilistiku klassid","emailAddress":"E-posti aadress","emailBody":"Sõnumi tekst","emailSubject":"Sõnumi teema","id":"ID","info":"Lingi info","langCode":"Keele suund","langDir":"Keele suund","langDirLTR":"Vasakult paremale (LTR)","langDirRTL":"Paremalt vasakule (RTL)","menu":"Muuda linki","name":"Nimi","noAnchors":"(Selles dokumendis pole ankruid)","noEmail":"Palun kirjuta e-posti aadress","noUrl":"Palun kirjuta lingi URL","other":"<muu>","popupDependent":"Sõltuv (Netscape)","popupFeatures":"HĂ¼pikakna omadused","popupFullScreen":"Täisekraan (IE)","popupLeft":"Vasak asukoht","popupLocationBar":"Aadressiriba","popupMenuBar":"MenĂ¼Ă¼riba","popupResizable":"Suurust saab muuta","popupScrollBars":"Kerimisribad","popupStatusBar":"Olekuriba","popupToolbar":"Tööriistariba","popupTop":"Ăœlemine asukoht","rel":"Suhe","selectAnchor":"Vali ankur","styles":"Laad","tabIndex":"Tab indeks","target":"Sihtkoht","targetFrame":"<raam>","targetFrameName":"Sihtmärk raami nimi","targetPopup":"<hĂ¼pikaken>","targetPopupName":"HĂ¼pikakna nimi","title":"Link","toAnchor":"Ankur sellel lehel","toEmail":"E-post","toUrl":"URL","toolbar":"Lingi lisamine/muutmine","type":"Lingi liik","unlink":"Lingi eemaldamine","upload":"Lae Ă¼les"},"list":{"bulletedlist":"Punktloend","numberedlist":"Numberloend"},"magicline":{"title":"Sisesta siia lõigu tekst"},"maximize":{"maximize":"Maksimeerimine","minimize":"Minimeerimine"},"pastetext":{"button":"Asetamine tavalise tekstina","title":"Asetamine tavalise tekstina"},"pastefromword":{"confirmCleanup":"Tekst, mida tahad asetada näib pärinevat Wordist. Kas tahad selle enne asetamist puhastada?","error":"Asetatud andmete puhastamine ei olnud sisemise vea tõttu võimalik","title":"Asetamine Wordist","toolbar":"Asetamine Wordist"},"removeformat":{"toolbar":"Vormingu eemaldamine"},"sourcearea":{"toolbar":"Lähtekood"},"specialchar":{"options":"Erimärkide valikud","title":"Erimärgi valimine","toolbar":"Erimärgi sisestamine"},"scayt":{"btn_about":"SCAYT-ist lähemalt","btn_dictionaries":"Sõnaraamatud","btn_disable":"SCAYT keelatud","btn_enable":"SCAYT lubatud","btn_langs":"Keeled","btn_options":"Valikud","text_title":"Ă•igekirjakontroll kirjutamise ajal"},"stylescombo":{"label":"Stiil","panelTitle":"Vormindusstiilid","panelTitle1":"Blokkstiilid","panelTitle2":"Reasisesed stiilid","panelTitle3":"Objektistiilid"},"table":{"border":"Joone suurus","caption":"Tabeli tiitel","cell":{"menu":"Lahter","insertBefore":"Sisesta lahter enne","insertAfter":"Sisesta lahter peale","deleteCell":"Eemalda lahtrid","merge":"Ăœhenda lahtrid","mergeRight":"Ăœhenda paremale","mergeDown":"Ăœhenda alla","splitHorizontal":"Poolita lahter horisontaalselt","splitVertical":"Poolita lahter vertikaalselt","title":"Lahtri omadused","cellType":"Lahtri liik","rowSpan":"Ridade vahe","colSpan":"Tulpade vahe","wordWrap":"Sõnade murdmine","hAlign":"Horisontaalne joondus","vAlign":"Vertikaalne joondus","alignBaseline":"Baasjoon","bgColor":"Tausta värv","borderColor":"Äärise värv","data":"Andmed","header":"Päis","yes":"Jah","no":"Ei","invalidWidth":"Lahtri laius peab olema number.","invalidHeight":"Lahtri kõrgus peab olema number.","invalidRowSpan":"Ridade vahe peab olema täisarv.","invalidColSpan":"Tulpade vahe peab olema täisarv.","chooseColor":"Vali"},"cellPad":"Lahtri täidis","cellSpace":"Lahtri vahe","column":{"menu":"Veerg","insertBefore":"Sisesta veerg enne","insertAfter":"Sisesta veerg peale","deleteColumn":"Eemalda veerud"},"columns":"Veerud","deleteTable":"Kustuta tabel","headers":"Päised","headersBoth":"Mõlemad","headersColumn":"Esimene tulp","headersNone":"Puudub","headersRow":"Esimene rida","invalidBorder":"Äärise suurus peab olema number.","invalidCellPadding":"Lahtrite polsterdus (padding) peab olema positiivne arv.","invalidCellSpacing":"Lahtrite vahe peab olema positiivne arv.","invalidCols":"Tulpade arv peab olema nullist suurem.","invalidHeight":"Tabeli kõrgus peab olema number.","invalidRows":"Ridade arv peab olema nullist suurem.","invalidWidth":"Tabeli laius peab olema number.","menu":"Tabeli omadused","row":{"menu":"Rida","insertBefore":"Sisesta rida enne","insertAfter":"Sisesta rida peale","deleteRow":"Eemalda read"},"rows":"Read","summary":"Kokkuvõte","title":"Tabeli omadused","toolbar":"Tabel","widthPc":"protsenti","widthPx":"pikslit","widthUnit":"laiuse Ă¼hik"},"undo":{"redo":"Toimingu kordamine","undo":"Tagasivõtmine"},"wsc":{"btnIgnore":"Ignoreeri","btnIgnoreAll":"Ignoreeri kõiki","btnReplace":"Asenda","btnReplaceAll":"Asenda kõik","btnUndo":"Võta tagasi","changeTo":"Muuda","errorLoading":"Viga rakenduse teenushosti laadimisel: %s.","ieSpellDownload":"Ă•igekirja kontrollija ei ole paigaldatud. Soovid sa selle alla laadida?","manyChanges":"Ă•igekirja kontroll sooritatud: %1 sõna muudetud","noChanges":"Ă•igekirja kontroll sooritatud: Ă¼htegi sõna ei muudetud","noMispell":"Ă•igekirja kontroll sooritatud: õigekirjuvigu ei leitud","noSuggestions":"- Soovitused puuduvad -","notAvailable":"Kahjuks ei ole teenus praegu saadaval.","notInDic":"Puudub sõnastikust","oneChange":"Ă•igekirja kontroll sooritatud: Ă¼ks sõna muudeti","progress":"Toimub õigekirja kontroll...","title":"Ă•igekirjakontroll","toolbar":"Ă•igekirjakontroll"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/eu.js b/js/ckeditor/lang/eu.js
new file mode 100644
index 0000000..f6d33ab
--- /dev/null
+++ b/js/ckeditor/lang/eu.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['eu']={"editor":"Testu Aberastuko Editorea","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"ALT 0 sakatu laguntza jasotzeko","browseServer":"Zerbitzaria arakatu","url":"URL","protocol":"Protokoloa","upload":"Gora kargatu","uploadSubmit":"Zerbitzarira bidali","image":"Irudia","flash":"Flasha","form":"Formularioa","checkbox":"Kontrol-laukia","radio":"Aukera-botoia","textField":"Testu Eremua","textarea":"Testu-area","hiddenField":"Ezkutuko Eremua","button":"Botoia","select":"Hautespen Eremua","imageButton":"Irudi Botoia","notSet":"<Ezarri gabe>","id":"Id","name":"Izena","langDir":"Hizkuntzaren Norabidea","langDirLtr":"Ezkerretik Eskumara(LTR)","langDirRtl":"Eskumatik Ezkerrera (RTL)","langCode":"Hizkuntza Kodea","longDescr":"URL Deskribapen Luzea","cssClass":"Estilo-orriko Klaseak","advisoryTitle":"Izenburua","cssStyle":"Estiloa","ok":"Ados","cancel":"Utzi","close":"Itxi","preview":"Aurrebista","resize":"Arrastatu tamaina aldatzeko","generalTab":"Orokorra","advancedTab":"Aurreratua","validateNumberFailed":"Balio hau ez da zenbaki bat.","confirmNewPage":"Eduki honetan gorde gabe dauden aldaketak galduko dira. Ziur zaude orri berri bat kargatu nahi duzula?","confirmCancel":"Aukera batzuk aldatu egin dira. Ziur zaude elkarrizketa-koadroa itxi nahi duzula?","options":"Aukerak","target":"Target (Helburua)","targetNew":"Leiho Berria (_blank)","targetTop":"Goieneko Leihoan (_top)","targetSelf":"Leiho Berdinean (_self)","targetParent":"Leiho Gurasoan (_parent)","langDirLTR":"Ezkerretik Eskumara(LTR)","langDirRTL":"Eskumatik Ezkerrera (RTL)","styles":"Estiloa","cssClasses":"Estilo-orriko Klaseak","width":"Zabalera","height":"Altuera","align":"Lerrokatu","alignLeft":"Ezkerrera","alignRight":"Eskuman","alignCenter":"Erdian","alignJustify":"Justifikatu","alignTop":"Goian","alignMiddle":"Erdian","alignBottom":"Behean","alignNone":"None","invalidValue":"Balio ezegokia.","invalidHeight":"Altuera zenbaki bat izan behar da.","invalidWidth":"Zabalera zenbaki bat izan behar da.","invalidCssLength":"\"%1\" eremurako zehaztutako balioa zenbaki positibo bat izan behar du, aukeran CSS neurri unitate batekin (px, %, in, cm, mm, em, ex, pt edo pc).","invalidHtmlLength":"\"%1\" eremurako zehaztutako balioa zenbaki positibo bat izan behar du, aukeran HTML neurri unitate batekin (px edo %).","invalidInlineStyle":"Lerroko estiloan zehazten dena tupla \"name : value\" formatuko eta puntu eta komaz bereiztutako tupla bat edo gehiago izan behar dira.","cssLengthTooltip":"Zenbakia bakarrik zehazten bada pixeletan egongo da. CSS neurri unitatea ere zehaztu ahal da (px, %, in, cm, mm, em, ex, pt, edo pc).","unavailable":"%1<span class=\"cke_accessibility\">, erabilezina</span>"},"about":{"copy":"Copyright &copy; $1. Eskubide guztiak erreserbaturik.","dlgTitle":"CKEditor(r)i buruz","help":"$1 aztertu laguntza jasotzeko.","moreInfo":"Lizentziari buruzko informazioa gure webgunean:","title":"CKEditor(r)i buruz","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Lodia","italic":"Etzana","strike":"Marratua","subscript":"Azpi-indize","superscript":"Goi-indize","underline":"Azpimarratu"},"blockquote":{"toolbar":"Aipamen blokea"},"clipboard":{"copy":"Kopiatu","copyError":"Zure web nabigatzailearen segurtasun ezarpenak testuak automatikoki kopiatzea ez dute baimentzen. Mesedez teklatua erabili ezazu (Ctrl/Cmd+C).","cut":"Ebaki","cutError":"Zure web nabigatzailearen segurtasun ezarpenak testuak automatikoki moztea ez dute baimentzen. Mesedez teklatua erabili ezazu (Ctrl/Cmd+X).","paste":"Itsatsi","pasteArea":"Itsasteko Area","pasteMsg":"Mesedez teklatua erabilita (<STRONG>Ctrl/Cmd+V</STRONG>) ondorego eremuan testua itsatsi eta <STRONG>OK</STRONG> sakatu.","securityMsg":"Nabigatzailearen segurtasun ezarpenak direla eta, editoreak ezin du arbela zuzenean erabili. Leiho honetan berriro itsatsi behar duzu.","title":"Itsatsi"},"contextmenu":{"options":"Testuingurko Menuaren Aukerak"},"button":{"selectedLabel":"%1 (Selected)"},"toolbar":{"toolbarCollapse":"Tresna-barra Txikitu","toolbarExpand":"Tresna-barra Luzatu","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":"Editorearen Tresna-barra"},"elementspath":{"eleLabel":"Elementu bidea","eleTitle":"%1 elementua"},"format":{"label":"Formatua","panelTitle":"Formatua","tag_address":"Helbidea","tag_div":"Paragrafoa (DIV)","tag_h1":"Izenburua 1","tag_h2":"Izenburua 2","tag_h3":"Izenburua 3","tag_h4":"Izenburua 4","tag_h5":"Izenburua 5","tag_h6":"Izenburua 6","tag_p":"Arrunta","tag_pre":"Formateatua"},"horizontalrule":{"toolbar":"Txertatu Marra Horizontala"},"image":{"alertUrl":"Mesedez Irudiaren URLa idatzi","alt":"Ordezko Testua","border":"Ertza","btnUpload":"Zerbitzarira bidalia","button2Img":"Aukeratutako irudi botoia, irudi normal batean eraldatu nahi duzu?","hSpace":"HSpace","img2Button":"Aukeratutako irudia, irudi botoi batean eraldatu nahi duzu?","infoTab":"Irudi informazioa","linkTab":"Esteka","lockRatio":"Erlazioa Blokeatu","menu":"Irudi Ezaugarriak","resetSize":"Tamaina Berrezarri","title":"Irudi Ezaugarriak","titleButton":"Irudi Botoiaren Ezaugarriak","upload":"Gora Kargatu","urlMissing":"Irudiaren iturburu URL-a falta da.","vSpace":"VSpace","validateBorder":"Ertza zenbaki oso bat izan behar da.","validateHSpace":"HSpace zenbaki oso bat izan behar da.","validateVSpace":"VSpace zenbaki oso bat izan behar da."},"indent":{"indent":"Handitu Koska","outdent":"Txikitu Koska"},"fakeobjects":{"anchor":"Aingura","flash":"Flash Animazioa","hiddenfield":"Ezkutuko Eremua","iframe":"IFrame","unknown":"Objektu ezezaguna"},"link":{"acccessKey":"Sarbide-gakoa","advanced":"Aurreratua","advisoryContentType":"Eduki Mota (Content Type)","advisoryTitle":"Izenburua","anchor":{"toolbar":"Aingura","menu":"Ainguraren Ezaugarriak","title":"Ainguraren Ezaugarriak","name":"Ainguraren Izena","errorName":"Idatzi ainguraren izena","remove":"Remove Anchor"},"anchorId":"Elementuaren ID-gatik","anchorName":"Aingura izenagatik","charset":"Estekatutako Karaktere Multzoa","cssClasses":"Estilo-orriko Klaseak","emailAddress":"ePosta Helbidea","emailBody":"Mezuaren Gorputza","emailSubject":"Mezuaren Gaia","id":"Id","info":"Estekaren Informazioa","langCode":"Hizkuntzaren Norabidea","langDir":"Hizkuntzaren Norabidea","langDirLTR":"Ezkerretik Eskumara(LTR)","langDirRTL":"Eskumatik Ezkerrera (RTL)","menu":"Aldatu Esteka","name":"Izena","noAnchors":"(Ez daude aingurak eskuragarri dokumentuan)","noEmail":"Mesedez ePosta helbidea idatzi","noUrl":"Mesedez URL esteka idatzi","other":"<bestelakoa>","popupDependent":"Menpekoa (Netscape)","popupFeatures":"Popup Leihoaren Ezaugarriak","popupFullScreen":"Pantaila Osoa (IE)","popupLeft":"Ezkerreko Posizioa","popupLocationBar":"Kokaleku Barra","popupMenuBar":"Menu Barra","popupResizable":"Tamaina Aldakorra","popupScrollBars":"Korritze Barrak","popupStatusBar":"Egoera Barra","popupToolbar":"Tresna Barra","popupTop":"Goiko Posizioa","rel":"Erlazioa","selectAnchor":"Aingura bat hautatu","styles":"Estiloa","tabIndex":"Tabulazio Indizea","target":"Target (Helburua)","targetFrame":"<marko>","targetFrameName":"Marko Helburuaren Izena","targetPopup":"<popup leihoa>","targetPopupName":"Popup Leihoaren Izena","title":"Esteka","toAnchor":"Aingura orrialde honetan","toEmail":"ePosta","toUrl":"URL","toolbar":"Txertatu/Editatu Esteka","type":"Esteka Mota","unlink":"Kendu Esteka","upload":"Gora kargatu"},"list":{"bulletedlist":"Buletdun Zerrenda","numberedlist":"Zenbakidun Zerrenda"},"magicline":{"title":"Txertatu paragrafoa hemen"},"maximize":{"maximize":"Maximizatu","minimize":"Minimizatu"},"pastetext":{"button":"Testu Arrunta bezala Itsatsi","title":"Testu Arrunta bezala Itsatsi"},"pastefromword":{"confirmCleanup":"Itsatsi nahi duzun testua Wordetik hartua dela dirudi. Itsatsi baino lehen garbitu nahi duzu?","error":"Barneko errore bat dela eta ezin izan da testua garbitu","title":"Itsatsi Word-etik","toolbar":"Itsatsi Word-etik"},"removeformat":{"toolbar":"Kendu Formatua"},"sourcearea":{"toolbar":"HTML Iturburua"},"specialchar":{"options":"Karaktere Berezien Aukerak","title":"Karaktere Berezia Aukeratu","toolbar":"Txertatu Karaktere Berezia"},"scayt":{"btn_about":"SCAYTi buruz","btn_dictionaries":"Hiztegiak","btn_disable":"Desgaitu SCAYT","btn_enable":"Gaitu SCAYT","btn_langs":"Hizkuntzak","btn_options":"Aukerak","text_title":"Ortografia Zuzenketa Idatzi Ahala (SCAYT)"},"stylescombo":{"label":"Estiloa","panelTitle":"Formatu Estiloak","panelTitle1":"Bloke Estiloak","panelTitle2":"Inline Estiloak","panelTitle3":"Objektu Estiloak"},"table":{"border":"Ertzaren Zabalera","caption":"Epigrafea","cell":{"menu":"Gelaxka","insertBefore":"Txertatu Gelaxka Aurretik","insertAfter":"Txertatu Gelaxka Ostean","deleteCell":"Kendu Gelaxkak","merge":"Batu Gelaxkak","mergeRight":"Elkartu Eskumara","mergeDown":"Elkartu Behera","splitHorizontal":"Banatu Gelaxkak Horizontalki","splitVertical":"Banatu Gelaxkak Bertikalki","title":"Gelaxken Ezaugarriak","cellType":"Gelaxka Mota","rowSpan":"Hedatutako Lerroak","colSpan":"Hedatutako Zutabeak","wordWrap":"Itzulbira","hAlign":"Lerrokatze Horizontala","vAlign":"Lerrokatze Bertikala","alignBaseline":"Oinarri-lerroan","bgColor":"Fondoaren Kolorea","borderColor":"Ertzaren Kolorea","data":"Data","header":"Goiburua","yes":"Bai","no":"Ez","invalidWidth":"Gelaxkaren zabalera zenbaki bat izan behar da.","invalidHeight":"Gelaxkaren altuera zenbaki bat izan behar da.","invalidRowSpan":"Lerroen hedapena zenbaki osoa izan behar da.","invalidColSpan":"Zutabeen hedapena zenbaki osoa izan behar da.","chooseColor":"Choose"},"cellPad":"Gelaxken betegarria","cellSpace":"Gelaxka arteko tartea","column":{"menu":"Zutabea","insertBefore":"Txertatu Zutabea Aurretik","insertAfter":"Txertatu Zutabea Ostean","deleteColumn":"Ezabatu Zutabeak"},"columns":"Zutabeak","deleteTable":"Ezabatu Taula","headers":"Goiburuak","headersBoth":"Biak","headersColumn":"Lehen zutabea","headersNone":"Bat ere ez","headersRow":"Lehen lerroa","invalidBorder":"Ertzaren tamaina zenbaki bat izan behar da.","invalidCellPadding":"Gelaxken betegarria zenbaki bat izan behar da.","invalidCellSpacing":"Gelaxka arteko tartea zenbaki bat izan behar da.","invalidCols":"Zutabe kopurua 0 baino handiagoa den zenbakia izan behar da.","invalidHeight":"Taularen altuera zenbaki bat izan behar da.","invalidRows":"Lerro kopurua 0 baino handiagoa den zenbakia izan behar da.","invalidWidth":"Taularen zabalera zenbaki bat izan behar da.","menu":"Taularen Ezaugarriak","row":{"menu":"Lerroa","insertBefore":"Txertatu Lerroa Aurretik","insertAfter":"Txertatu Lerroa Ostean","deleteRow":"Ezabatu Lerroak"},"rows":"Lerroak","summary":"Laburpena","title":"Taularen Ezaugarriak","toolbar":"Taula","widthPc":"ehuneko","widthPx":"pixel","widthUnit":"zabalera unitatea"},"undo":{"redo":"Berregin","undo":"Desegin"},"wsc":{"btnIgnore":"Ezikusi","btnIgnoreAll":"Denak Ezikusi","btnReplace":"Ordezkatu","btnReplaceAll":"Denak Ordezkatu","btnUndo":"Desegin","changeTo":"Honekin ordezkatu","errorLoading":"Errorea gertatu da aplikazioa zerbitzaritik kargatzean: %s.","ieSpellDownload":"Zuzentzaile ortografikoa ez dago instalatuta. Deskargatu nahi duzu?","manyChanges":"Zuzenketa ortografikoa bukatuta: %1 hitz aldatu dira","noChanges":"Zuzenketa ortografikoa bukatuta: Ez da ezer aldatu","noMispell":"Zuzenketa ortografikoa bukatuta: Akatsik ez","noSuggestions":"- Iradokizunik ez -","notAvailable":"Barkatu baina momentu honetan zerbitzua ez dago erabilgarri.","notInDic":"Ez dago hiztegian","oneChange":"Zuzenketa ortografikoa bukatuta: Hitz bat aldatu da","progress":"Zuzenketa ortografikoa martxan...","title":"Ortografia zuzenketa","toolbar":"Ortografia"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/fa.js b/js/ckeditor/lang/fa.js
new file mode 100644
index 0000000..acf140f
--- /dev/null
+++ b/js/ckeditor/lang/fa.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['fa']={"editor":"ویرایش‌گر متن غنی","editorPanel":"پنل ویرایشگر متن غنی","common":{"editorHelp":"کلید Alt+0 را برای راهنمایی بÙشارید","browseServer":"Ùهرست​نمایی سرور","url":"URL","protocol":"قرارداد","upload":"بالاگذاری","uploadSubmit":"به سرور بÙرست","image":"تصویر","flash":"Ùلش","form":"Ùرم","checkbox":"چک‌باکس","radio":"دکمه‌ی رادیویی","textField":"Ùیلد متنی","textarea":"ناحیهٴ متنی","hiddenField":"Ùیلد پنهان","button":"دکمه","select":"Ùیلد انتخاب چند گزینه​ای","imageButton":"دکمه‌ی تصویری","notSet":"<تعیین‌نشده>","id":"شناسه","name":"نام","langDir":"جهت زبان","langDirLtr":"Ú†Ù¾ به راست","langDirRtl":"راست به Ú†Ù¾","langCode":"کد زبان","longDescr":"URL توصی٠طولانی","cssClass":"کلاس​های شیوه​نامه (Stylesheet)","advisoryTitle":"عنوان Ú©Ù…Ú©ÛŒ","cssStyle":"سبک","ok":"پذیرش","cancel":"انصراÙ","close":"بستن","preview":"پیش‌نمایش","resize":"تغییر اندازه","generalTab":"عمومی","advancedTab":"پیش‌رÙته","validateNumberFailed":"این مقدار یک عدد نیست.","confirmNewPage":"هر تغییر ایجاد شده​ی ذخیره نشده از بین خواهد رÙت. آیا اطمینان دارید Ú©Ù‡ قصد بارگیری صÙحه جدیدی را دارید؟","confirmCancel":"برخی از گزینه‌ها تغییر کرده‌اند. آیا واقعا قصد بستن این پنجره را دارید؟","options":"گزینه​ها","target":"مقصد","targetNew":"پنجره جدید","targetTop":"بالاترین پنجره","targetSelf":"همان پنجره","targetParent":"پنجره والد","langDirLTR":"Ú†Ù¾ به راست","langDirRTL":"راست به Ú†Ù¾","styles":"سبک","cssClasses":"کلاس‌های سبک‌نامه","width":"عرض","height":"طول","align":"چینش","alignLeft":"Ú†Ù¾","alignRight":"راست","alignCenter":"وسط","alignJustify":"بلوک چین","alignTop":"بالا","alignMiddle":"میانه","alignBottom":"پائین","alignNone":"هیچ","invalidValue":"مقدار نامعتبر.","invalidHeight":"ارتÙاع باید یک عدد باشد.","invalidWidth":"عرض باید یک عدد باشد.","invalidCssLength":"عدد تعیین شده برای Ùیلد \"%1\" باید یک عدد مثبت با یا بدون یک واحد اندازه گیری CSS معتبر باشد (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"عدد تعیین شده برای Ùیلد \"%1\" باید یک عدد مثبت با یا بدون یک واحد اندازه گیری HTML معتبر باشد (px or %).","invalidInlineStyle":"عدد تعیین شده برای سبک درون​خطی -Inline Style- باید دارای یک یا چند چندتایی با Ø´Ú©Ù„ÛŒ شبیه \"name : value\" Ú©Ù‡ باید با یک \";\" از هم جدا شوند.","cssLengthTooltip":"یک عدد برای یک مقدار بر حسب پیکسل Ùˆ یا یک عدد با یک واحد CSS معتبر وارد کنید (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">ØŒ غیر قابل دسترس</span>"},"about":{"copy":"حق نشر &copy; $1. کلیه حقوق محÙوظ است.","dlgTitle":"درباره CKEditor","help":" برای راهنمایی $1 را ملاحظه کنید.","moreInfo":"برای کسب اطلاعات مجوز لطÙا به وب سایت ما مراجعه کنید:","title":"درباره CKEditor","userGuide":"راهنمای کاربران CKEditor"},"basicstyles":{"bold":"درشت","italic":"خمیده","strike":"خط‌خورده","subscript":"زیرنویس","superscript":"بالانویس","underline":"زیرخط‌دار"},"blockquote":{"toolbar":"بلوک نقل قول"},"clipboard":{"copy":"رونوشت","copyError":"تنظیمات امنیتی مرورگر شما اجازه نمیدهد Ú©Ù‡ ویرایشگر به طور خودکار عملکردهای Ú©Ù¾ÛŒ کردن را انجام دهد. لطÙا با دکمههای صÙحه کلید این کار را انجام دهید (Ctrl/Cmd+C).","cut":"برش","cutError":"تنظیمات امنیتی مرورگر شما اجازه نمیدهد Ú©Ù‡ ویرایشگر به طور خودکار عملکردهای برش را انجام دهد. لطÙا با دکمههای صÙحه کلید این کار را انجام دهید (Ctrl/Cmd+X).","paste":"چسباندن","pasteArea":"محل چسباندن","pasteMsg":"لطÙا متن را با کلیدهای (<STRONG>Ctrl/Cmd+V</STRONG>) در این جعبهٴ متنی بچسبانید Ùˆ <STRONG>پذیرش</STRONG> را بزنید.","securityMsg":"به خاطر تنظیمات امنیتی مرورگر شما، ویرایشگر نمیتواند دسترسی مستقیم به دادههای clipboard داشته باشد. شما باید دوباره آنرا در این پنجره بچسبانید.","title":"چسباندن"},"contextmenu":{"options":"گزینه​های منوی زمینه"},"button":{"selectedLabel":"%1 (انتخاب شده)"},"toolbar":{"toolbarCollapse":"بستن نوار ابزار","toolbarExpand":"بازکردن نوار ابزار","toolbarGroups":{"document":"سند","clipboard":"حاÙظه موقت/برگشت","editing":"در حال ویرایش","forms":"Ùرم​ها","basicstyles":"سبک‌های پایه","paragraph":"بند","links":"پیوندها","insert":"ورود","styles":"سبک‌ها","colors":"رنگ​ها","tools":"ابزارها"},"toolbars":"نوار ابزارهای ویرایش‌گر"},"elementspath":{"eleLabel":"مسیر عناصر","eleTitle":"%1 عنصر"},"format":{"label":"قالب","panelTitle":"قالب بند","tag_address":"نشانی","tag_div":"بند","tag_h1":"سرنویس Û±","tag_h2":"سرنویس Û²","tag_h3":"سرنویس Û³","tag_h4":"سرنویس Û´","tag_h5":"سرنویس Ûµ","tag_h6":"سرنویس Û¶","tag_p":"معمولی","tag_pre":"قالب‌دار"},"horizontalrule":{"toolbar":"گنجاندن خط اÙÙ‚ÛŒ"},"image":{"alertUrl":"لطÙا URL تصویر را بنویسید","alt":"متن جایگزین","border":"لبه","btnUpload":"به سرور بÙرست","button2Img":"آیا مایلید از یک تصویر ساده روی دکمه تصویری انتخاب شده استÙاده کنید؟","hSpace":"Ùاصلهٴ اÙÙ‚ÛŒ","img2Button":"آیا مایلید از یک دکمه تصویری روی تصویر انتخاب شده استÙاده کنید؟","infoTab":"اطلاعات تصویر","linkTab":"پیوند","lockRatio":"Ù‚ÙÙ„ کردن نسبت","menu":"ویژگی​های تصویر","resetSize":"بازنشانی اندازه","title":"ویژگی​های تصویر","titleButton":"ویژگی​های دکمهٴ تصویری","upload":"انتقال به سرور","urlMissing":"آدرس URL اصلی تصویر یاÙت نشد.","vSpace":"Ùاصلهٴ عمودی","validateBorder":"مقدار خطوط باید یک عدد باشد.","validateHSpace":"مقدار Ùاصله گذاری اÙÙ‚ÛŒ باید یک عدد باشد.","validateVSpace":"مقدار Ùاصله گذاری عمودی باید یک عدد باشد."},"indent":{"indent":"اÙزایش تورÙتگی","outdent":"کاهش تورÙتگی"},"fakeobjects":{"anchor":"لنگر","flash":"انیمشن Ùلش","hiddenfield":"Ùیلد پنهان","iframe":"IFrame","unknown":"شیء ناشناخته"},"link":{"acccessKey":"کلید دستیابی","advanced":"پیشرÙته","advisoryContentType":"نوع محتوای Ú©Ù…Ú©ÛŒ","advisoryTitle":"عنوان Ú©Ù…Ú©ÛŒ","anchor":{"toolbar":"گنجاندن/ویرایش لنگر","menu":"ویژگی​های لنگر","title":"ویژگی​های لنگر","name":"نام لنگر","errorName":"لطÙا نام لنگر را بنویسید","remove":"حذ٠لنگر"},"anchorId":"با شناسهٴ المان","anchorName":"با نام لنگر","charset":"نویسه​گان منبع پیوند شده","cssClasses":"کلاس​های شیوه​نامه(Stylesheet)","emailAddress":"نشانی پست الکترونیکی","emailBody":"متن پیام","emailSubject":"موضوع پیام","id":"شناسه","info":"اطلاعات پیوند","langCode":"جهت​نمای زبان","langDir":"جهت​نمای زبان","langDirLTR":"Ú†Ù¾ به راست (LTR)","langDirRTL":"راست به Ú†Ù¾ (RTL)","menu":"ویرایش پیوند","name":"نام","noAnchors":"(در این سند لنگری دردسترس نیست)","noEmail":"لطÙا نشانی پست الکترونیکی را بنویسید","noUrl":"لطÙا URL پیوند را بنویسید","other":"<سایر>","popupDependent":"وابسته (Netscape)","popupFeatures":"ویژگی​های پنجرهٴ پاپاپ","popupFullScreen":"تمام صÙحه (IE)","popupLeft":"موقعیت Ú†Ù¾","popupLocationBar":"نوار موقعیت","popupMenuBar":"نوار منو","popupResizable":"قابل تغییر اندازه","popupScrollBars":"میله​های پیمایش","popupStatusBar":"نوار وضعیت","popupToolbar":"نوار ابزار","popupTop":"موقعیت بالا","rel":"وابستگی","selectAnchor":"یک لنگر برگزینید","styles":"شیوه (style)","tabIndex":"نمایهٴ دسترسی با برگه","target":"مقصد","targetFrame":"<Ùریم>","targetFrameName":"نام Ùریم مقصد","targetPopup":"<پنجرهٴ پاپاپ>","targetPopupName":"نام پنجرهٴ پاپاپ","title":"پیوند","toAnchor":"لنگر در همین صÙحه","toEmail":"پست الکترونیکی","toUrl":"URL","toolbar":"گنجاندن/ویرایش پیوند","type":"نوع پیوند","unlink":"برداشتن پیوند","upload":"انتقال به سرور"},"list":{"bulletedlist":"Ùهرست نقطه​ای","numberedlist":"Ùهرست شماره​دار"},"magicline":{"title":"قرار دادن بند در اینجا"},"maximize":{"maximize":"بیشنه کردن","minimize":"کمینه کردن"},"pastetext":{"button":"چسباندن به عنوان متن ساده","title":"چسباندن به عنوان متن ساده"},"pastefromword":{"confirmCleanup":"متنی Ú©Ù‡ میخواهید بچسبانید به نظر میرسد Ú©Ù‡ از Word Ú©Ù¾ÛŒ شده است. آیا میخواهید قبل از چسباندن آن را پاکسازی کنید؟","error":"به دلیل بروز خطای داخلی امکان پاکسازی اطلاعات بازنشانی شده وجود ندارد.","title":"چسباندن از Word","toolbar":"چسباندن از Word"},"removeformat":{"toolbar":"برداشتن Ùرمت"},"sourcearea":{"toolbar":"منبع"},"specialchar":{"options":"گزینه‌های نویسه‌های ویژه","title":"گزینش نویسه‌ی ویژه","toolbar":"گنجاندن نویسه‌ی ویژه"},"scayt":{"btn_about":"درباره SCAYT","btn_dictionaries":"دیکشنریها","btn_disable":"غیرÙعالسازی SCAYT","btn_enable":"Ùعالسازی SCAYT","btn_langs":"زبانها","btn_options":"گزینهها","text_title":"بررسی املای تایپ شما"},"stylescombo":{"label":"سبک","panelTitle":"سبکهای قالببندی","panelTitle1":"سبکهای بلوک","panelTitle2":"سبکهای درونخطی","panelTitle3":"سبکهای شیء"},"table":{"border":"اندازهٴ لبه","caption":"عنوان","cell":{"menu":"سلول","insertBefore":"اÙزودن سلول قبل از","insertAfter":"اÙزودن سلول بعد از","deleteCell":"حذ٠سلولها","merge":"ادغام سلولها","mergeRight":"ادغام به راست","mergeDown":"ادغام به پایین","splitHorizontal":"جدا کردن اÙÙ‚ÛŒ سلول","splitVertical":"جدا کردن عمودی سلول","title":"ویژگیهای سلول","cellType":"نوع سلول","rowSpan":"محدوده ردیÙها","colSpan":"محدوده ستونها","wordWrap":"شکستن کلمه","hAlign":"چینش اÙÙ‚ÛŒ","vAlign":"چینش عمودی","alignBaseline":"خط مبنا","bgColor":"رنگ زمینه","borderColor":"رنگ خطوط","data":"اطلاعات","header":"سرنویس","yes":"بله","no":"خیر","invalidWidth":"عرض سلول باید یک عدد باشد.","invalidHeight":"ارتÙاع سلول باید عدد باشد.","invalidRowSpan":"مقدار محدوده ردیÙها باید یک عدد باشد.","invalidColSpan":"مقدار محدوده ستونها باید یک عدد باشد.","chooseColor":"انتخاب"},"cellPad":"Ùاصلهٴ پرشده در سلول","cellSpace":"Ùاصلهٴ میان سلولها","column":{"menu":"ستون","insertBefore":"اÙزودن ستون قبل از","insertAfter":"اÙزودن ستون بعد از","deleteColumn":"حذ٠ستونها"},"columns":"ستونها","deleteTable":"پاک کردن جدول","headers":"سرنویسها","headersBoth":"هردو","headersColumn":"اولین ستون","headersNone":"هیچ","headersRow":"اولین ردیÙ","invalidBorder":"مقدار اندازه خطوط باید یک عدد باشد.","invalidCellPadding":"بالشتک سلول باید یک عدد باشد.","invalidCellSpacing":"مقدار Ùاصلهگذاری سلول باید یک عدد باشد.","invalidCols":"تعداد ستونها باید یک عدد بزرگتر از 0 باشد.","invalidHeight":"مقدار ارتÙاع جدول باید یک عدد باشد.","invalidRows":"تعداد ردیÙها باید یک عدد بزرگتر از 0 باشد.","invalidWidth":"مقدار پهنای جدول باید یک عدد باشد.","menu":"ویژگیهای جدول","row":{"menu":"سطر","insertBefore":"اÙزودن سطر قبل از","insertAfter":"اÙزودن سطر بعد از","deleteRow":"حذ٠سطرها"},"rows":"سطرها","summary":"خلاصه","title":"ویژگیهای جدول","toolbar":"جدول","widthPc":"درصد","widthPx":"پیکسل","widthUnit":"واحد پهنا"},"undo":{"redo":"بازچیدن","undo":"واچیدن"},"wsc":{"btnIgnore":"چشمپوشی","btnIgnoreAll":"چشمپوشی همه","btnReplace":"جایگزینی","btnReplaceAll":"جایگزینی همه","btnUndo":"واچینش","changeTo":"تغییر به","errorLoading":"خطا در بارگیری برنامه خدمات میزبان: %s.","ieSpellDownload":"بررسی کنندهٴ املا نصب نشده است. آیا میخواهید آن را هماکنون دریاÙت کنید؟","manyChanges":"بررسی املا انجام شد. %1 واژه تغییر یاÙت","noChanges":"بررسی املا انجام شد. هیچ واژهای تغییر نیاÙت","noMispell":"بررسی املا انجام شد. هیچ غلط املائی یاÙت نشد","noSuggestions":"- پیشنهادی نیست -","notAvailable":"با عرض پوزش خدمات الان در دسترس نیستند.","notInDic":"در واژه~نامه یاÙت نشد","oneChange":"بررسی املا انجام شد. یک واژه تغییر یاÙت","progress":"بررسی املا در حال انجام...","title":"بررسی املا","toolbar":"بررسی املا"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/fi.js b/js/ckeditor/lang/fi.js
new file mode 100644
index 0000000..5967040
--- /dev/null
+++ b/js/ckeditor/lang/fi.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['fi']={"editor":"Rikastekstieditori","editorPanel":"Rikastekstieditoripaneeli","common":{"editorHelp":"Paina ALT 0 nähdäksesi ohjeen","browseServer":"Selaa palvelinta","url":"Osoite","protocol":"Protokolla","upload":"Lisää tiedosto","uploadSubmit":"Lähetä palvelimelle","image":"Kuva","flash":"Flash-animaatio","form":"Lomake","checkbox":"Valintaruutu","radio":"Radiopainike","textField":"Tekstikenttä","textarea":"Tekstilaatikko","hiddenField":"Piilokenttä","button":"Painike","select":"Valintakenttä","imageButton":"Kuvapainike","notSet":"<ei asetettu>","id":"Tunniste","name":"Nimi","langDir":"Kielen suunta","langDirLtr":"Vasemmalta oikealle (LTR)","langDirRtl":"Oikealta vasemmalle (RTL)","langCode":"Kielikoodi","longDescr":"Pitkän kuvauksen URL","cssClass":"Tyyliluokat","advisoryTitle":"Avustava otsikko","cssStyle":"Tyyli","ok":"OK","cancel":"Peruuta","close":"Sulje","preview":"Esikatselu","resize":"Raahaa muuttaaksesi kokoa","generalTab":"Yleinen","advancedTab":"Lisäominaisuudet","validateNumberFailed":"Arvon pitää olla numero.","confirmNewPage":"Kaikki tallentamattomat muutokset tähän sisältöön menetetään. Oletko varma, että haluat ladata uuden sivun?","confirmCancel":"Jotkut asetuksista on muuttuneet. Oletko varma, että haluat sulkea valintaikkunan?","options":"Asetukset","target":"Kohde","targetNew":"Uusi ikkuna (_blank)","targetTop":"Päällimmäinen ikkuna (_top)","targetSelf":"Sama ikkuna (_self)","targetParent":"Ylemmän tason ikkuna (_parent)","langDirLTR":"Vasemmalta oikealle (LTR)","langDirRTL":"Oikealta vasemmalle (RTL)","styles":"Tyyli","cssClasses":"Tyylitiedoston luokat","width":"Leveys","height":"Korkeus","align":"Kohdistus","alignLeft":"Vasemmalle","alignRight":"Oikealle","alignCenter":"Keskelle","alignJustify":"Tasaa molemmat reunat","alignTop":"Ylös","alignMiddle":"Keskelle","alignBottom":"Alas","alignNone":"Ei asetettu","invalidValue":"Virheellinen arvo.","invalidHeight":"Korkeuden täytyy olla numero.","invalidWidth":"Leveyden täytyy olla numero.","invalidCssLength":"Kentän \"%1\" arvon täytyy olla positiivinen luku CSS mittayksikön (px, %, in, cm, mm, em, ex, pt tai pc) kanssa tai ilman.","invalidHtmlLength":"Kentän \"%1\" arvon täytyy olla positiivinen luku HTML mittayksikön (px tai %) kanssa tai ilman.","invalidInlineStyle":"Tyylille annetun arvon täytyy koostua yhdestä tai useammasta \"nimi : arvo\" parista, jotka ovat eroteltuna toisistaan puolipisteillä.","cssLengthTooltip":"Anna numeroarvo pikseleinä tai numeroarvo CSS mittayksikön kanssa (px, %, in, cm, mm, em, ex, pt, tai pc).","unavailable":"%1<span class=\"cke_accessibility\">, ei saatavissa</span>"},"about":{"copy":"Copyright &copy; $1. Kaikki oikeuden pidätetään.","dlgTitle":"Tietoa CKEditorista","help":"Katso ohjeet: $1.","moreInfo":"Lisenssitiedot löytyvät kotisivuiltamme:","title":"Tietoa CKEditorista","userGuide":"CKEditorin käyttäjäopas"},"basicstyles":{"bold":"Lihavoitu","italic":"Kursivoitu","strike":"Yliviivattu","subscript":"Alaindeksi","superscript":"Yläindeksi","underline":"Alleviivattu"},"blockquote":{"toolbar":"Lainaus"},"clipboard":{"copy":"Kopioi","copyError":"Selaimesi turva-asetukset eivät salli editorin toteuttaa kopioimista. Käytä näppäimistöä kopioimiseen (Ctrl+C).","cut":"Leikkaa","cutError":"Selaimesi turva-asetukset eivät salli editorin toteuttaa leikkaamista. Käytä näppäimistöä leikkaamiseen (Ctrl+X).","paste":"Liitä","pasteArea":"Leikealue","pasteMsg":"Liitä painamalla (<STRONG>Ctrl+V</STRONG>) ja painamalla <STRONG>OK</STRONG>.","securityMsg":"Selaimesi turva-asetukset eivät salli editorin käyttää leikepöytää suoraan. Sinun pitää suorittaa liittäminen tässä ikkunassa.","title":"Liitä"},"contextmenu":{"options":"Pikavalikon ominaisuudet"},"button":{"selectedLabel":"%1 (Valittu)"},"toolbar":{"toolbarCollapse":"Kutista työkalupalkki","toolbarExpand":"Laajenna työkalupalkki","toolbarGroups":{"document":"Dokumentti","clipboard":"Leikepöytä/Kumoa","editing":"Muokkaus","forms":"Lomakkeet","basicstyles":"Perustyylit","paragraph":"Kappale","links":"Linkit","insert":"Lisää","styles":"Tyylit","colors":"Värit","tools":"Työkalut"},"toolbars":"Editorin työkalupalkit"},"elementspath":{"eleLabel":"Elementin polku","eleTitle":"%1 elementti"},"format":{"label":"Muotoilu","panelTitle":"Muotoilu","tag_address":"Osoite","tag_div":"Normaali (DIV)","tag_h1":"Otsikko 1","tag_h2":"Otsikko 2","tag_h3":"Otsikko 3","tag_h4":"Otsikko 4","tag_h5":"Otsikko 5","tag_h6":"Otsikko 6","tag_p":"Normaali","tag_pre":"Muotoiltu"},"horizontalrule":{"toolbar":"Lisää murtoviiva"},"image":{"alertUrl":"Kirjoita kuvan osoite (URL)","alt":"Vaihtoehtoinen teksti","border":"Kehys","btnUpload":"Lähetä palvelimelle","button2Img":"Haluatko muuntaa valitun kuvanäppäimen kuvaksi?","hSpace":"Vaakatila","img2Button":"Haluatko muuntaa valitun kuvan kuvanäppäimeksi?","infoTab":"Kuvan tiedot","linkTab":"Linkki","lockRatio":"Lukitse suhteet","menu":"Kuvan ominaisuudet","resetSize":"Alkuperäinen koko","title":"Kuvan ominaisuudet","titleButton":"Kuvapainikkeen ominaisuudet","upload":"Lisää kuva","urlMissing":"Kuvan lähdeosoite puuttuu.","vSpace":"Pystytila","validateBorder":"Kehyksen täytyy olla kokonaisluku.","validateHSpace":"HSpace-määrityksen täytyy olla kokonaisluku.","validateVSpace":"VSpace-määrityksen täytyy olla kokonaisluku."},"indent":{"indent":"Suurenna sisennystä","outdent":"Pienennä sisennystä"},"fakeobjects":{"anchor":"Ankkuri","flash":"Flash animaatio","hiddenfield":"Piilokenttä","iframe":"IFrame-kehys","unknown":"Tuntematon objekti"},"link":{"acccessKey":"Pikanäppäin","advanced":"Lisäominaisuudet","advisoryContentType":"Avustava sisällön tyyppi","advisoryTitle":"Avustava otsikko","anchor":{"toolbar":"Lisää ankkuri/muokkaa ankkuria","menu":"Ankkurin ominaisuudet","title":"Ankkurin ominaisuudet","name":"Nimi","errorName":"Ankkurille on kirjoitettava nimi","remove":"Poista ankkuri"},"anchorId":"Ankkurin ID:n mukaan","anchorName":"Ankkurin nimen mukaan","charset":"Linkitetty kirjaimisto","cssClasses":"Tyyliluokat","emailAddress":"Sähköpostiosoite","emailBody":"Viesti","emailSubject":"Aihe","id":"Tunniste","info":"Linkin tiedot","langCode":"Kielen suunta","langDir":"Kielen suunta","langDirLTR":"Vasemmalta oikealle (LTR)","langDirRTL":"Oikealta vasemmalle (RTL)","menu":"Muokkaa linkkiä","name":"Nimi","noAnchors":"(Ei ankkureita tässä dokumentissa)","noEmail":"Kirjoita sähköpostiosoite","noUrl":"Linkille on kirjoitettava URL","other":"<muu>","popupDependent":"Riippuva (Netscape)","popupFeatures":"Popup ikkunan ominaisuudet","popupFullScreen":"Täysi ikkuna (IE)","popupLeft":"Vasemmalta (px)","popupLocationBar":"Osoiterivi","popupMenuBar":"Valikkorivi","popupResizable":"Venytettävä","popupScrollBars":"Vierityspalkit","popupStatusBar":"Tilarivi","popupToolbar":"Vakiopainikkeet","popupTop":"Ylhäältä (px)","rel":"Suhde","selectAnchor":"Valitse ankkuri","styles":"Tyyli","tabIndex":"Tabulaattori indeksi","target":"Kohde","targetFrame":"<kehys>","targetFrameName":"Kohdekehyksen nimi","targetPopup":"<popup ikkuna>","targetPopupName":"Popup ikkunan nimi","title":"Linkki","toAnchor":"Ankkuri tässä sivussa","toEmail":"Sähköposti","toUrl":"Osoite","toolbar":"Lisää linkki/muokkaa linkkiä","type":"Linkkityyppi","unlink":"Poista linkki","upload":"Lisää tiedosto"},"list":{"bulletedlist":"Luettelomerkit","numberedlist":"Numerointi"},"magicline":{"title":"Lisää kappale tähän."},"maximize":{"maximize":"Suurenna","minimize":"Pienennä"},"pastetext":{"button":"Liitä tekstinä","title":"Liitä tekstinä"},"pastefromword":{"confirmCleanup":"Liittämäsi teksti näyttäisi olevan Word-dokumentista. Haluatko siivota sen ennen liittämistä? (Suositus: Kyllä)","error":"Liitetyn tiedon siivoaminen ei onnistunut sisäisen virheen takia","title":"Liitä Word-dokumentista","toolbar":"Liitä Word-dokumentista"},"removeformat":{"toolbar":"Poista muotoilu"},"sourcearea":{"toolbar":"Koodi"},"specialchar":{"options":"Erikoismerkin ominaisuudet","title":"Valitse erikoismerkki","toolbar":"Lisää erikoismerkki"},"scayt":{"btn_about":"Tietoja oikoluvusta kirjoitetaessa","btn_dictionaries":"Sanakirjat","btn_disable":"Poista käytöstä oikoluku kirjoitetaessa","btn_enable":"Ota käyttöön oikoluku kirjoitettaessa","btn_langs":"Kielet","btn_options":"Asetukset","text_title":"Oikolue kirjoitettaessa"},"stylescombo":{"label":"Tyyli","panelTitle":"Muotoilujen tyylit","panelTitle1":"Lohkojen tyylit","panelTitle2":"Rivinsisäiset tyylit","panelTitle3":"Objektien tyylit"},"table":{"border":"Rajan paksuus","caption":"Otsikko","cell":{"menu":"Solu","insertBefore":"Lisää solu eteen","insertAfter":"Lisää solu perään","deleteCell":"Poista solut","merge":"Yhdistä solut","mergeRight":"Yhdistä oikealla olevan kanssa","mergeDown":"Yhdistä alla olevan kanssa","splitHorizontal":"Jaa solu vaakasuunnassa","splitVertical":"Jaa solu pystysuunnassa","title":"Solun ominaisuudet","cellType":"Solun tyyppi","rowSpan":"Rivin jatkuvuus","colSpan":"Solun jatkuvuus","wordWrap":"Rivitys","hAlign":"Horisontaali kohdistus","vAlign":"Vertikaali kohdistus","alignBaseline":"Alas (teksti)","bgColor":"Taustan väri","borderColor":"Reunan väri","data":"Data","header":"Ylätunniste","yes":"Kyllä","no":"Ei","invalidWidth":"Solun leveyden täytyy olla numero.","invalidHeight":"Solun korkeuden täytyy olla numero.","invalidRowSpan":"Rivin jatkuvuuden täytyy olla kokonaisluku.","invalidColSpan":"Solun jatkuvuuden täytyy olla kokonaisluku.","chooseColor":"Valitse"},"cellPad":"Solujen sisennys","cellSpace":"Solujen väli","column":{"menu":"Sarake","insertBefore":"Lisää sarake vasemmalle","insertAfter":"Lisää sarake oikealle","deleteColumn":"Poista sarakkeet"},"columns":"Sarakkeet","deleteTable":"Poista taulu","headers":"Ylätunnisteet","headersBoth":"Molemmat","headersColumn":"Ensimmäinen sarake","headersNone":"Ei","headersRow":"Ensimmäinen rivi","invalidBorder":"Reunan koon täytyy olla numero.","invalidCellPadding":"Solujen sisennyksen täytyy olla numero.","invalidCellSpacing":"Solujen välin täytyy olla numero.","invalidCols":"Sarakkeiden määrän täytyy olla suurempi kuin 0.","invalidHeight":"Taulun korkeuden täytyy olla numero.","invalidRows":"Rivien määrän täytyy olla suurempi kuin 0.","invalidWidth":"Taulun leveyden täytyy olla numero.","menu":"Taulun ominaisuudet","row":{"menu":"Rivi","insertBefore":"Lisää rivi yläpuolelle","insertAfter":"Lisää rivi alapuolelle","deleteRow":"Poista rivit"},"rows":"Rivit","summary":"Yhteenveto","title":"Taulun ominaisuudet","toolbar":"Taulu","widthPc":"prosenttia","widthPx":"pikseliä","widthUnit":"leveysyksikkö"},"undo":{"redo":"Toista","undo":"Kumoa"},"wsc":{"btnIgnore":"Jätä huomioimatta","btnIgnoreAll":"Jätä kaikki huomioimatta","btnReplace":"Korvaa","btnReplaceAll":"Korvaa kaikki","btnUndo":"Kumoa","changeTo":"Vaihda","errorLoading":"Virhe ladattaessa oikolukupalvelua isännältä: %s.","ieSpellDownload":"Oikeinkirjoituksen tarkistusta ei ole asennettu. Haluatko ladata sen nyt?","manyChanges":"Tarkistus valmis: %1 sanaa muutettiin","noChanges":"Tarkistus valmis: Yhtään sanaa ei muutettu","noMispell":"Tarkistus valmis: Ei virheitä","noSuggestions":"Ei ehdotuksia","notAvailable":"Valitettavasti oikoluku ei ole käytössä tällä hetkellä.","notInDic":"Ei sanakirjassa","oneChange":"Tarkistus valmis: Yksi sana muutettiin","progress":"Tarkistus käynnissä...","title":"Oikoluku","toolbar":"Tarkista oikeinkirjoitus"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/fo.js b/js/ckeditor/lang/fo.js
new file mode 100644
index 0000000..a4fb781
--- /dev/null
+++ b/js/ckeditor/lang/fo.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['fo']={"editor":"Rich Text Editor","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"TrĂ½st ALT og 0 fyri vegleiĂ°ing","browseServer":"Ambætarakagi","url":"URL","protocol":"Protokoll","upload":"Send til ambætaran","uploadSubmit":"Send til ambætaran","image":"Myndir","flash":"Flash","form":"Formur","checkbox":"Flugubein","radio":"Radioknøttur","textField":"Tekstteigur","textarea":"TekstumrĂ¡Ă°i","hiddenField":"Fjaldur teigur","button":"Knøttur","select":"ValskrĂ¡","imageButton":"Myndaknøttur","notSet":"<ikki sett>","id":"Id","name":"Navn","langDir":"TekstkĂ³s","langDirLtr":"FrĂ¡ vinstru til høgru (LTR)","langDirRtl":"FrĂ¡ høgru til vinstru (RTL)","langCode":"MĂ¡lkoda","longDescr":"VĂ­Ă°kaĂ° URL frĂ¡greiĂ°ing","cssClass":"Typografi klassar","advisoryTitle":"VegleiĂ°andi heiti","cssStyle":"Typografi","ok":"GĂ³Ă°kent","cancel":"AvlĂ½st","close":"Lat aftur","preview":"FrumsĂ½n","resize":"Drag fyri at broyta stødd","generalTab":"Generelt","advancedTab":"Fjølbroytt","validateNumberFailed":"Hetta er ikki eitt tal.","confirmNewPage":"Allar ikki goymdar broytingar Ă­ hesum innihaldiĂ° hvørva. Skal nĂ½ggj sĂ­Ă°a lesast kortini?","confirmCancel":"Nakrir valmøguleikar eru broyttir. Ert tĂº vĂ­sur Ă­, at dialogurin skal latast aftur?","options":"Options","target":"Target","targetNew":"NĂ½tt vindeyga (_blank)","targetTop":"Vindeyga ovast (_top)","targetSelf":"Sama vindeyga (_self)","targetParent":"Upphavligt vindeyga (_parent)","langDirLTR":"FrĂ¡ vinstru til høgru (LTR)","langDirRTL":"FrĂ¡ høgru til vinstru (RTL)","styles":"Style","cssClasses":"Stylesheet Classes","width":"Breidd","height":"Hædd","align":"Justering","alignLeft":"Vinstra","alignRight":"Høgra","alignCenter":"MiĂ°sett","alignJustify":"Javnir tekstkantar","alignTop":"Ovast","alignMiddle":"MiĂ°ja","alignBottom":"Botnur","alignNone":"None","invalidValue":"Invalid value.","invalidHeight":"Hædd mĂ¡ vera eitt tal.","invalidWidth":"Breidd mĂ¡ vera eitt tal.","invalidCssLength":"VirĂ°iĂ° sett Ă­ \"%1\" feltiĂ° mĂ¡ vera eitt positivt tal, viĂ° ella uttan gyldugum CSS mĂ¡tieind (px, %, in, cm, mm, em, ex, pt, ella pc).","invalidHtmlLength":"VirĂ°iĂ° sett Ă­ \"%1\" feltiĂ°ield mĂ¡ vera eitt positivt tal, viĂ° ella uttan gyldugum CSS mĂ¡tieind (px ella %).","invalidInlineStyle":"VirĂ°i specifiseraĂ° fyri inline style mĂ¡ hava eitt ella fleiri pør (tuples) skrivaĂ° sum \"name : value\", hvørt pariĂ° sundurskilt viĂ° semi-colon.","cssLengthTooltip":"Skriva eitt tal fyri eitt virĂ°i Ă­ pixels ella eitt tal viĂ° gyldigum CSS eind (px, %, in, cm, mm, em, ex, pt, ella pc).","unavailable":"%1<span class=\"cke_accessibility\">, ikki tøkt</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"Um CKEditor","help":"Kekka $1 fyri hjĂ¡lp.","moreInfo":"Licens upplĂ½singar finnast Ă¡ heimasĂ­Ă°u okkara:","title":"Um CKEditor","userGuide":"CKEditor BrĂºkaravegleiĂ°ing"},"basicstyles":{"bold":"Feit skrift","italic":"SkrĂ¡skrift","strike":"YvirstrikaĂ°","subscript":"LækkaĂ° skrift","superscript":"HækkaĂ° skrift","underline":"UndirstrikaĂ°"},"blockquote":{"toolbar":"Blockquote"},"clipboard":{"copy":"Avrita","copyError":"Trygdaruppseting alnĂ³tskagans forĂ°ar tekstviĂ°geranum Ă­ at avrita tekstin. Vinarliga nĂ½t knappaborĂ°iĂ° til at avrita tekstin (Ctrl/Cmd+C).","cut":"Kvett","cutError":"Trygdaruppseting alnĂ³tskagans forĂ°ar tekstviĂ°geranum Ă­ at kvetta tekstin. Vinarliga nĂ½t knappaborĂ°iĂ° til at kvetta tekstin (Ctrl/Cmd+X).","paste":"Innrita","pasteArea":"AvritingarumrĂ¡Ă°i","pasteMsg":"Vinarliga koyr tekstin Ă­ hendan rĂºtin viĂ° knappaborĂ°inum (<strong>Ctrl/Cmd+V</strong>) og klikk Ă¡ <strong>GĂ³Ă°tak</strong>.","securityMsg":"Trygdaruppseting alnĂ³tskagans forĂ°ar tekstviĂ°geranum Ă­ beinleiĂ°is atgongd til avritingarminniĂ°. Tygum mugu royna aftur Ă­ hesum rĂºtinum.","title":"Innrita"},"contextmenu":{"options":"Context Menu Options"},"button":{"selectedLabel":"%1 (Selected)"},"toolbar":{"toolbarCollapse":"Lat Toolbar aftur","toolbarExpand":"VĂ­s Toolbar","toolbarGroups":{"document":"Dokument","clipboard":"Clipboard/Undo","editing":"Editering","forms":"Formar","basicstyles":"Grundleggjandi Styles","paragraph":"Reglubrot","links":"Leinkjur","insert":"Set inn","styles":"Styles","colors":"Litir","tools":"TĂ³l"},"toolbars":"Editor toolbars"},"elementspath":{"eleLabel":"SlĂ³Ă° til elementir","eleTitle":"%1 element"},"format":{"label":"SkriftsniĂ°","panelTitle":"SkriftsniĂ°","tag_address":"Adressa","tag_div":"Vanligt (DIV)","tag_h1":"Yvirskrift 1","tag_h2":"Yvirskrift 2","tag_h3":"Yvirskrift 3","tag_h4":"Yvirskrift 4","tag_h5":"Yvirskrift 5","tag_h6":"Yvirskrift 6","tag_p":"Vanligt","tag_pre":"SniĂ°giviĂ°"},"horizontalrule":{"toolbar":"Ger vatnrætta linju"},"image":{"alertUrl":"Rita slĂ³Ă°ina til myndina","alt":"Alternativur tekstur","border":"Bordi","btnUpload":"Send til ambætaran","button2Img":"Skal valdi myndaknøttur gerast til vanliga mynd?","hSpace":"Høgri breddi","img2Button":"Skal valda mynd gerast til myndaknøtt?","infoTab":"MyndaupplĂ½singar","linkTab":"TilknĂ½ti","lockRatio":"Læs lutfalliĂ°","menu":"Myndaeginleikar","resetSize":"Upprunastødd","title":"Myndaeginleikar","titleButton":"Eginleikar fyri myndaknøtt","upload":"Send","urlMissing":"URL til mynd manglar.","vSpace":"Vinstri breddi","validateBorder":"Bordi mĂ¡ vera eitt heiltal.","validateHSpace":"HSpace mĂ¡ vera eitt heiltal.","validateVSpace":"VSpace mĂ¡ vera eitt heiltal."},"indent":{"indent":"Ă˜kja reglubrotarinntriv","outdent":"Minka reglubrotarinntriv"},"fakeobjects":{"anchor":"Anchor","flash":"Flash Animation","hiddenfield":"Fjaldur teigur","iframe":"IFrame","unknown":"Ă“kent Object"},"link":{"acccessKey":"Snarvegisknöttur","advanced":"Fjølbroytt","advisoryContentType":"VegleiĂ°andi innihaldsslag","advisoryTitle":"VegleiĂ°andi heiti","anchor":{"toolbar":"Ger/broyt marknastein","menu":"Eginleikar fyri marknastein","title":"Eginleikar fyri marknastein","name":"Heiti marknasteinsins","errorName":"Vinarliga rita marknasteinsins heiti","remove":"Strika marknastein"},"anchorId":"Eftir element Id","anchorName":"Eftir navni Ă¡ marknasteini","charset":"AtknĂ½tt teknsett","cssClasses":"Typografi klassar","emailAddress":"Teldupost-adressa","emailBody":"BreyĂ°tekstur","emailSubject":"Evni","id":"Id","info":"TilknĂ½tis upplĂ½singar","langCode":"TekstkĂ³s","langDir":"TekstkĂ³s","langDirLTR":"FrĂ¡ vinstru til høgru (LTR)","langDirRTL":"FrĂ¡ høgru til vinstru (RTL)","menu":"Broyt tilknĂ½ti","name":"Navn","noAnchors":"(Eingir marknasteinar eru Ă­ hesum dokumentiĂ°)","noEmail":"Vinarliga skriva teldupost-adressu","noUrl":"Vinarliga skriva tilknĂ½ti (URL)","other":"<annaĂ°>","popupDependent":"BundiĂ° (Netscape)","popupFeatures":"Popup vindeygans vĂ­Ă°kaĂ°u eginleikar","popupFullScreen":"Fullur skermur (IE)","popupLeft":"FrĂ¡støða frĂ¡ vinstru","popupLocationBar":"Adressulinja","popupMenuBar":"SkrĂ¡bjĂ¡lki","popupResizable":"Stødd kann broytast","popupScrollBars":"RullibjĂ¡lki","popupStatusBar":"StøðufrĂ¡greiĂ°ingarbjĂ¡lki","popupToolbar":"AmboĂ°sbjĂ¡lki","popupTop":"FrĂ¡støða frĂ¡ Ă­erva","rel":"RelatiĂ³n","selectAnchor":"Vel ein marknastein","styles":"Typografi","tabIndex":"Tabulator indeks","target":"Target","targetFrame":"<ramma>","targetFrameName":"VĂ­s navn vindeygans","targetPopup":"<popup vindeyga>","targetPopupName":"Popup vindeygans navn","title":"TilknĂ½ti","toAnchor":"TilknĂ½ti til marknastein Ă­ tekstinum","toEmail":"Teldupostur","toUrl":"URL","toolbar":"Ger/broyt tilknĂ½ti","type":"TilknĂ½tisslag","unlink":"Strika tilknĂ½ti","upload":"Send til ambætaran"},"list":{"bulletedlist":"Punktmerktur listi","numberedlist":"Talmerktur listi"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maksimera","minimize":"Minimera"},"pastetext":{"button":"Innrita som reinan tekst","title":"Innrita som reinan tekst"},"pastefromword":{"confirmCleanup":"Teksturin, tĂº roynir at seta inn, sĂ½nist at stava frĂ¡ Word. Skal teksturin reinsast fyrst?","error":"TaĂ° eydnaĂ°ist ikki at reinsa tekstin vegna ein internan feil","title":"Innrita frĂ¡ Word","toolbar":"Innrita frĂ¡ Word"},"removeformat":{"toolbar":"Strika sniĂ°geving"},"sourcearea":{"toolbar":"Kelda"},"specialchar":{"options":"Møguleikar viĂ° serteknum","title":"Vel sertekn","toolbar":"Set inn sertekn"},"scayt":{"btn_about":"Um SCAYT","btn_dictionaries":"OrĂ°abøkur","btn_disable":"Nokta SCAYT","btn_enable":"Loyv SCAYT","btn_langs":"TungumĂ¡l","btn_options":"Uppseting","text_title":"Kanna stavseting, meĂ°an tĂº skrivar"},"stylescombo":{"label":"Typografi","panelTitle":"Formatterings stĂ­lir","panelTitle1":"Blokk stĂ­lir","panelTitle2":"Inline stĂ­lir","panelTitle3":"Object stĂ­lir"},"table":{"border":"Bordabreidd","caption":"TabellfrĂ¡greiĂ°ing","cell":{"menu":"Meski","insertBefore":"Set meska inn Ă¡Ă°renn","insertAfter":"Set meska inn aftanĂ¡","deleteCell":"Strika meskar","merge":"Flætta meskar","mergeRight":"Flætta meskar til høgru","mergeDown":"Flætta saman","splitHorizontal":"Kloyv meska vatnrætt","splitVertical":"Kloyv meska loddrætt","title":"Mesku eginleikar","cellType":"Mesku slag","rowSpan":"Ræð spenni","colSpan":"Kolonnu spenni","wordWrap":"OrĂ°kloyving","hAlign":"Horisontal plasering","vAlign":"Loddrøtt plasering","alignBaseline":"Basislinja","bgColor":"Bakgrundslitur","borderColor":"Bordalitur","data":"Data","header":"Header","yes":"Ja","no":"Nei","invalidWidth":"Meskubreidd mĂ¡ vera eitt tal.","invalidHeight":"Meskuhædd mĂ¡ vera eitt tal.","invalidRowSpan":"RaĂ°spenniĂ° mĂ¡ vera eitt heiltal.","invalidColSpan":"KolonnuspenniĂ° mĂ¡ vera eitt heiltal.","chooseColor":"Vel"},"cellPad":"Meskubreddi","cellSpace":"Fjarstøða millum meskar","column":{"menu":"Kolonna","insertBefore":"Set kolonnu inn Ă¡Ă°renn","insertAfter":"Set kolonnu inn aftanĂ¡","deleteColumn":"Strika kolonnur"},"columns":"Kolonnur","deleteTable":"Strika tabell","headers":"Yvirskriftir","headersBoth":"BĂ¡Ă°ir","headersColumn":"Fyrsta kolonna","headersNone":"Eingin","headersRow":"Fyrsta raĂ°","invalidBorder":"Borda-stødd mĂ¡ vera eitt tal.","invalidCellPadding":"Cell padding mĂ¡ vera eitt tal.","invalidCellSpacing":"Cell spacing mĂ¡ vera eitt tal.","invalidCols":"TaliĂ° av kolonnum mĂ¡ vera eitt tal størri enn 0.","invalidHeight":"Tabell-hædd mĂ¡ vera eitt tal.","invalidRows":"TaliĂ° av røðum mĂ¡ vera eitt tal størri enn 0.","invalidWidth":"Tabell-breidd mĂ¡ vera eitt tal.","menu":"Eginleikar fyri tabell","row":{"menu":"RaĂ°","insertBefore":"Set raĂ° inn Ă¡Ă°renn","insertAfter":"Set raĂ° inn aftanĂ¡","deleteRow":"Strika røðir"},"rows":"Røðir","summary":"SamandrĂ¡ttur","title":"Eginleikar fyri tabell","toolbar":"Tabell","widthPc":"prosent","widthPx":"pixels","widthUnit":"breiddar unit"},"undo":{"redo":"Vend aftur","undo":"Angra"},"wsc":{"btnIgnore":"ForfjĂ³na","btnIgnoreAll":"ForfjĂ³na alt","btnReplace":"Yvirskriva","btnReplaceAll":"Yvirskriva alt","btnUndo":"Angra","changeTo":"Broyt til","errorLoading":"Feilur viĂ° innlesing av application service host: %s.","ieSpellDownload":"Rættstavarin er ikki tøkur Ă­ tekstviĂ°geranum. Vilt tĂº heinta hann nĂº?","manyChanges":"Rættstavarin liĂ°ugur: %1 orĂ° broytt","noChanges":"Rættstavarin liĂ°ugur: Einki orĂ° varĂ° broytt","noMispell":"Rættstavarin liĂ°ugur: Eingin feilur funnin","noSuggestions":"- Einki uppskot -","notAvailable":"TĂ­verri, ikki tøkt Ă­ løtuni.","notInDic":"Finst ikki Ă­ orĂ°abĂ³kini","oneChange":"Rættstavarin liĂ°ugur: Eitt orĂ° er broytt","progress":"Rættstavarin arbeiĂ°ir...","title":"Kanna stavseting","toolbar":"Kanna stavseting"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/fr-ca.js b/js/ckeditor/lang/fr-ca.js
new file mode 100644
index 0000000..0437bc2
--- /dev/null
+++ b/js/ckeditor/lang/fr-ca.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['fr-ca']={"editor":"Éditeur de texte enrichi","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Appuyez sur 0 pour de l'aide","browseServer":"Parcourir le serveur","url":"URL","protocol":"Protocole","upload":"Envoyer","uploadSubmit":"Envoyer au serveur","image":"Image","flash":"Animation Flash","form":"Formulaire","checkbox":"Case Ă  cocher","radio":"Bouton radio","textField":"Champ texte","textarea":"Zone de texte","hiddenField":"Champ cachĂ©","button":"Bouton","select":"Liste dĂ©roulante","imageButton":"Bouton image","notSet":"<Par dĂ©faut>","id":"Id","name":"Nom","langDir":"Sens d'Ă©criture","langDirLtr":"De gauche Ă  droite (LTR)","langDirRtl":"De droite Ă  gauche (RTL)","langCode":"Code langue","longDescr":"URL de description longue","cssClass":"Classes CSS","advisoryTitle":"Titre","cssStyle":"Style","ok":"OK","cancel":"Annuler","close":"Fermer","preview":"Aperçu","resize":"Redimensionner","generalTab":"GĂ©nĂ©ral","advancedTab":"AvancĂ©","validateNumberFailed":"Cette valeur n'est pas un nombre.","confirmNewPage":"Les changements non sauvegardĂ©s seront perdus. Ătes-vous certain de vouloir charger une nouvelle page?","confirmCancel":"Certaines options ont Ă©tĂ© modifiĂ©es. Ătes-vous certain de vouloir fermer?","options":"Options","target":"Cible","targetNew":"Nouvelle fenĂªtre (_blank)","targetTop":"FenĂªtre supĂ©rieur (_top)","targetSelf":"Cette fenĂªtre (_self)","targetParent":"FenĂªtre parent (_parent)","langDirLTR":"De gauche Ă  droite (LTR)","langDirRTL":"De droite Ă  gauche (RTL)","styles":"Style","cssClasses":"Classe CSS","width":"Largeur","height":"Hauteur","align":"Alignement","alignLeft":"Gauche","alignRight":"Droite","alignCenter":"CentrĂ©","alignJustify":"JustifiĂ©","alignTop":"Haut","alignMiddle":"Milieu","alignBottom":"Bas","alignNone":"None","invalidValue":"Valeur invalide.","invalidHeight":"La hauteur doit Ăªtre un nombre.","invalidWidth":"La largeur doit Ăªtre un nombre.","invalidCssLength":"La valeur spĂ©cifiĂ©e pour le champ \"%1\" doit Ăªtre un nombre positif avec ou sans unitĂ© de mesure CSS valide (px, %, in, cm, mm, em, ex, pt, ou pc).","invalidHtmlLength":"La valeur spĂ©cifiĂ©e pour le champ \"%1\" doit Ăªtre un nombre positif avec ou sans unitĂ© de mesure HTML valide (px ou %).","invalidInlineStyle":"La valeur spĂ©cifiĂ©e pour le style intĂ©grĂ© doit Ăªtre composĂ©e d'un ou plusieurs couples de valeur au format \"nom : valeur\", separĂ©s par des points-virgules.","cssLengthTooltip":"Entrer un nombre pour la valeur en pixel ou un nombre avec une unitĂ© CSS valide (px, %, in, cm, mm, em, ex, pt, ou pc).","unavailable":"%1<span class=\"cke_accessibility\">, indisponible</span>"},"about":{"copy":"Copyright &copy; $1. Tous droits rĂ©servĂ©s.","dlgTitle":"Ă€ propos de CKEditor","help":"Consulter $1 pour l'aide.","moreInfo":"Pour les informations de licence, consulter notre site internet:","title":"Ă€ propos de CKEditor","userGuide":"Guide utilisateur de CKEditor"},"basicstyles":{"bold":"Gras","italic":"Italique","strike":"BarrĂ©","subscript":"Indice","superscript":"Exposant","underline":"SoulignĂ©"},"blockquote":{"toolbar":"Citation"},"clipboard":{"copy":"Copier","copyError":"Les paramètres de sĂ©curitĂ© de votre navigateur empĂªchent l'Ă©diteur de copier automatiquement vos donnĂ©es. Veuillez utiliser les Ă©quivalents claviers (Ctrl/Cmd+C).","cut":"Couper","cutError":"Les paramètres de sĂ©curitĂ© de votre navigateur empĂªchent l'Ă©diteur de couper automatiquement vos donnĂ©es. Veuillez utiliser les Ă©quivalents claviers (Ctrl/Cmd+X).","paste":"Coller","pasteArea":"Coller la zone","pasteMsg":"Veuillez coller dans la zone ci-dessous en utilisant le clavier (<STRONG>Ctrl/Cmd+V</STRONG>) et appuyer sur <STRONG>OK</STRONG>.","securityMsg":"A cause des paramètres de sĂ©curitĂ© de votre navigateur, l'Ă©diteur ne peut accĂ©der au presse-papier directement. Vous devez coller Ă  nouveau le contenu dans cette fenĂªtre.","title":"Coller"},"contextmenu":{"options":"Options du menu contextuel"},"button":{"selectedLabel":"%1 (Selected)"},"toolbar":{"toolbarCollapse":"Enrouler la barre d'outils","toolbarExpand":"DĂ©rouler la barre d'outils","toolbarGroups":{"document":"Document","clipboard":"Presse papier/Annuler","editing":"Édition","forms":"Formulaires","basicstyles":"Styles de base","paragraph":"Paragraphe","links":"Liens","insert":"InsĂ©rer","styles":"Styles","colors":"Couleurs","tools":"Outils"},"toolbars":"Barre d'outils de l'Ă©diteur"},"elementspath":{"eleLabel":"Chemin d'Ă©lĂ©ments","eleTitle":"element %1"},"format":{"label":"Format","panelTitle":"Format de paragraphe","tag_address":"Adresse","tag_div":"Normal (DIV)","tag_h1":"En-tĂªte 1","tag_h2":"En-tĂªte 2","tag_h3":"En-tĂªte 3","tag_h4":"En-tĂªte 4","tag_h5":"En-tĂªte 5","tag_h6":"En-tĂªte 6","tag_p":"Normal","tag_pre":"FormatĂ©"},"horizontalrule":{"toolbar":"InsĂ©rer un sĂ©parateur horizontale"},"image":{"alertUrl":"Veuillez saisir l'URL de l'image","alt":"Texte alternatif","border":"Bordure","btnUpload":"Envoyer sur le serveur","button2Img":"DĂ©sirez-vous transformer l'image sĂ©lectionnĂ©e en image simple?","hSpace":"Espacement horizontal","img2Button":"DĂ©sirez-vous transformer l'image sĂ©lectionnĂ©e en bouton image?","infoTab":"Informations sur l'image","linkTab":"Lien","lockRatio":"Verrouiller les proportions","menu":"PropriĂ©tĂ©s de l'image","resetSize":"Taille originale","title":"PropriĂ©tĂ©s de l'image","titleButton":"PropriĂ©tĂ©s du bouton image","upload":"TĂ©lĂ©verser","urlMissing":"L'URL de la source de l'image est manquant.","vSpace":"Espacement vertical","validateBorder":"La bordure doit Ăªtre un entier.","validateHSpace":"L'espacement horizontal doit Ăªtre un entier.","validateVSpace":"L'espacement vertical doit Ăªtre un entier."},"indent":{"indent":"Augmenter le retrait","outdent":"Diminuer le retrait"},"fakeobjects":{"anchor":"Ancre","flash":"Animation Flash","hiddenfield":"Champ cachĂ©","iframe":"IFrame","unknown":"Objet inconnu"},"link":{"acccessKey":"Touche d'accessibilitĂ©","advanced":"AvancĂ©","advisoryContentType":"Type de contenu","advisoryTitle":"Description","anchor":{"toolbar":"Ancre","menu":"Modifier l'ancre","title":"PropriĂ©tĂ©s de l'ancre","name":"Nom de l'ancre","errorName":"Veuillez saisir le nom de l'ancre","remove":"Supprimer l'ancre"},"anchorId":"Par ID","anchorName":"Par nom","charset":"Encodage de la cible","cssClasses":"Classes CSS","emailAddress":"Courriel","emailBody":"Corps du message","emailSubject":"Objet du message","id":"ID","info":"Informations sur le lien","langCode":"Code de langue","langDir":"Sens d'Ă©criture","langDirLTR":"De gauche Ă  droite (LTR)","langDirRTL":"De droite Ă  gauche (RTL)","menu":"Modifier le lien","name":"Nom","noAnchors":"(Pas d'ancre disponible dans le document)","noEmail":"Veuillez saisir le courriel","noUrl":"Veuillez saisir l'URL","other":"<autre>","popupDependent":"DĂ©pendante (Netscape)","popupFeatures":"CaractĂ©ristiques de la fenĂªtre popup","popupFullScreen":"Plein Ă©cran (IE)","popupLeft":"Position de la gauche","popupLocationBar":"Barre d'adresse","popupMenuBar":"Barre de menu","popupResizable":"Redimensionnable","popupScrollBars":"Barres de dĂ©filement","popupStatusBar":"Barre d'Ă©tat","popupToolbar":"Barre d'outils","popupTop":"Position Ă  partir du haut","rel":"Relation","selectAnchor":"SĂ©lectionner une ancre","styles":"Style","tabIndex":"Ordre de tabulation","target":"Destination","targetFrame":"<Cadre>","targetFrameName":"Nom du cadre de destination","targetPopup":"<fenĂªtre popup>","targetPopupName":"Nom de la fenĂªtre popup","title":"Lien","toAnchor":"Ancre dans cette page","toEmail":"Courriel","toUrl":"URL","toolbar":"Lien","type":"Type de lien","unlink":"Supprimer le lien","upload":"TĂ©lĂ©verser"},"list":{"bulletedlist":"Liste Ă  puces","numberedlist":"Liste numĂ©rotĂ©e"},"magicline":{"title":"InsĂ©rer le paragraphe ici"},"maximize":{"maximize":"Maximizer","minimize":"Minimizer"},"pastetext":{"button":"Coller comme texte","title":"Coller comme texte"},"pastefromword":{"confirmCleanup":"Le texte que vous tentez de coller semble provenir de Word. DĂ©sirez vous le nettoyer avant de coller?","error":"Il n'a pas Ă©tĂ© possible de nettoyer les donnĂ©es collĂ©es du Ă  une erreur interne","title":"Coller de Word","toolbar":"Coller de Word"},"removeformat":{"toolbar":"Supprimer le formatage"},"sourcearea":{"toolbar":"Source"},"specialchar":{"options":"Option des caractères spĂ©ciaux","title":"SĂ©lectionner un caractère spĂ©cial","toolbar":"InsĂ©rer un caractère spĂ©cial"},"scayt":{"btn_about":"About SCAYT","btn_dictionaries":"Dictionaries","btn_disable":"Disable SCAYT","btn_enable":"Enable SCAYT","btn_langs":"Languages","btn_options":"Options","text_title":"Spell Check As You Type"},"stylescombo":{"label":"Styles","panelTitle":"Styles de formattage","panelTitle1":"Styles de block","panelTitle2":"Styles en ligne","panelTitle3":"Styles d'objet"},"table":{"border":"Taille de la bordure","caption":"Titre","cell":{"menu":"Cellule","insertBefore":"InsĂ©rer une cellule avant","insertAfter":"InsĂ©rer une cellule après","deleteCell":"Supprimer des cellules","merge":"Fusionner les cellules","mergeRight":"Fusionner Ă  droite","mergeDown":"Fusionner en bas","splitHorizontal":"Scinder la cellule horizontalement","splitVertical":"Scinder la cellule verticalement","title":"PropriĂ©tĂ©s de la cellule","cellType":"Type de cellule","rowSpan":"Fusion de lignes","colSpan":"Fusion de colonnes","wordWrap":"Retour Ă  la ligne","hAlign":"Alignement horizontal","vAlign":"Alignement vertical","alignBaseline":"Bas du texte","bgColor":"Couleur d'arrière plan","borderColor":"Couleur de bordure","data":"DonnĂ©es","header":"En-tĂªte","yes":"Oui","no":"Non","invalidWidth":"La largeur de cellule doit Ăªtre un nombre.","invalidHeight":"La hauteur de cellule doit Ăªtre un nombre.","invalidRowSpan":"La fusion de lignes doit Ăªtre un nombre entier.","invalidColSpan":"La fusion de colonnes doit Ăªtre un nombre entier.","chooseColor":"SĂ©lectionner"},"cellPad":"Marge interne des cellules","cellSpace":"Espacement des cellules","column":{"menu":"Colonne","insertBefore":"InsĂ©rer une colonne avant","insertAfter":"InsĂ©rer une colonne après","deleteColumn":"Supprimer des colonnes"},"columns":"Colonnes","deleteTable":"Supprimer le tableau","headers":"En-tĂªtes","headersBoth":"Les deux.","headersColumn":"Première colonne","headersNone":"Aucun","headersRow":"Première ligne","invalidBorder":"La taille de bordure doit Ăªtre un nombre.","invalidCellPadding":"La marge interne des cellules doit Ăªtre un nombre positif.","invalidCellSpacing":"L'espacement des cellules doit Ăªtre un nombre positif.","invalidCols":"Le nombre de colonnes doit Ăªtre supĂ©rieur Ă  0.","invalidHeight":"La hauteur du tableau doit Ăªtre un nombre.","invalidRows":"Le nombre de lignes doit Ăªtre supĂ©rieur Ă  0.","invalidWidth":"La largeur du tableau doit Ăªtre un nombre.","menu":"PropriĂ©tĂ©s du tableau","row":{"menu":"Ligne","insertBefore":"InsĂ©rer une ligne avant","insertAfter":"InsĂ©rer une ligne après","deleteRow":"Supprimer des lignes"},"rows":"Lignes","summary":"RĂ©sumĂ©","title":"PropriĂ©tĂ©s du tableau","toolbar":"Tableau","widthPc":"pourcentage","widthPx":"pixels","widthUnit":"unitĂ© de largeur"},"undo":{"redo":"Refaire","undo":"Annuler"},"wsc":{"btnIgnore":"Ignorer","btnIgnoreAll":"Ignorer tout","btnReplace":"Remplacer","btnReplaceAll":"Remplacer tout","btnUndo":"Annuler","changeTo":"Changer en","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Le Correcteur d'orthographe n'est pas installĂ©. Souhaitez-vous le tĂ©lĂ©charger maintenant?","manyChanges":"VĂ©rification d'orthographe terminĂ©e: %1 mots modifiĂ©s","noChanges":"VĂ©rification d'orthographe terminĂ©e: Pas de modifications","noMispell":"VĂ©rification d'orthographe terminĂ©e: pas d'erreur trouvĂ©e","noSuggestions":"- Pas de suggestion -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Pas dans le dictionnaire","oneChange":"VĂ©rification d'orthographe terminĂ©e: Un mot modifiĂ©","progress":"VĂ©rification d'orthographe en cours...","title":"Spell Checker","toolbar":"Orthographe"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/fr.js b/js/ckeditor/lang/fr.js
new file mode 100644
index 0000000..32f7937
--- /dev/null
+++ b/js/ckeditor/lang/fr.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['fr']={"editor":"Éditeur de Texte Enrichi","editorPanel":"Tableau de bord de l'Ă©diteur de texte enrichi","common":{"editorHelp":"Appuyez sur ALT-0 pour l'aide","browseServer":"Explorer le serveur","url":"URL","protocol":"Protocole","upload":"Envoyer","uploadSubmit":"Envoyer sur le serveur","image":"Image","flash":"Flash","form":"Formulaire","checkbox":"Case Ă  cocher","radio":"Bouton Radio","textField":"Champ texte","textarea":"Zone de texte","hiddenField":"Champ cachĂ©","button":"Bouton","select":"Liste dĂ©roulante","imageButton":"Bouton image","notSet":"<non dĂ©fini>","id":"Id","name":"Nom","langDir":"Sens d'Ă©criture","langDirLtr":"Gauche Ă  droite (LTR)","langDirRtl":"Droite Ă  gauche (RTL)","langCode":"Code de langue","longDescr":"URL de description longue (longdesc => malvoyant)","cssClass":"Classe CSS","advisoryTitle":"Description (title)","cssStyle":"Style","ok":"OK","cancel":"Annuler","close":"Fermer","preview":"Aperçu","resize":"DĂ©placer pour modifier la taille","generalTab":"GĂ©nĂ©ral","advancedTab":"AvancĂ©","validateNumberFailed":"Cette valeur n'est pas un nombre.","confirmNewPage":"Les changements non sauvegardĂ©s seront perdus. Ătes-vous sĂ»r de vouloir charger une nouvelle page?","confirmCancel":"Certaines options ont Ă©tĂ© modifiĂ©es. Ătes-vous sĂ»r de vouloir fermer?","options":"Options","target":"Cible (Target)","targetNew":"Nouvelle fenĂªtre (_blank)","targetTop":"FenĂªtre supĂ©rieure (_top)","targetSelf":"MĂªme fenĂªtre (_self)","targetParent":"FenĂªtre parent (_parent)","langDirLTR":"Gauche Ă  Droite (LTR)","langDirRTL":"Droite Ă  Gauche (RTL)","styles":"Style","cssClasses":"Classes de style","width":"Largeur","height":"Hauteur","align":"Alignement","alignLeft":"Gauche","alignRight":"Droite","alignCenter":"CentrĂ©","alignJustify":"Justifier","alignTop":"Haut","alignMiddle":"Milieu","alignBottom":"Bas","alignNone":"Aucun","invalidValue":"Valeur incorrecte.","invalidHeight":"La hauteur doit Ăªtre un nombre.","invalidWidth":"La largeur doit Ăªtre un nombre.","invalidCssLength":"La valeur spĂ©cifiĂ©e pour le champ \"%1\" doit Ăªtre un nombre positif avec ou sans unitĂ© de mesure CSS valide (px, %, in, cm, mm, em, ex, pt, ou pc).","invalidHtmlLength":"La valeur spĂ©cifiĂ©e pour le champ \"%1\" doit Ăªtre un nombre positif avec ou sans unitĂ© de mesure HTML valide (px ou %).","invalidInlineStyle":"La valeur spĂ©cifiĂ©e pour le style inline doit Ăªtre composĂ©e d'un ou plusieurs couples de valeur au format \"nom : valeur\", separĂ©s par des points-virgules.","cssLengthTooltip":"Entrer un nombre pour une valeur en pixels ou un nombre avec une unitĂ© de mesure CSS valide (px, %, in, cm, mm, em, ex, pt, ou pc).","unavailable":"%1<span class=\"cke_accessibility\">, Indisponible</span>"},"about":{"copy":"Copyright &copy; $1. Tous droits rĂ©servĂ©s.","dlgTitle":"Ă€ propos de CKEditor","help":"Consulter $1 pour l'aide.","moreInfo":"Pour les informations de licence, veuillez visiter notre site web:","title":"Ă€ propos de CKEditor","userGuide":"Guide de l'utilisateur CKEditor en anglais"},"basicstyles":{"bold":"Gras","italic":"Italique","strike":"BarrĂ©","subscript":"Indice","superscript":"Exposant","underline":"SoulignĂ©"},"blockquote":{"toolbar":"Citation"},"clipboard":{"copy":"Copier","copyError":"Les paramètres de sĂ©curitĂ© de votre navigateur ne permettent pas Ă  l'Ă©diteur d'exĂ©cuter automatiquement des opĂ©rations de copie. Veuillez utiliser le raccourci clavier (Ctrl/Cmd+C).","cut":"Couper","cutError":"Les paramètres de sĂ©curitĂ© de votre navigateur ne permettent pas Ă  l'Ă©diteur d'exĂ©cuter automatiquement l'opĂ©ration \"couper\". Veuillez utiliser le raccourci clavier (Ctrl/Cmd+X).","paste":"Coller","pasteArea":"Coller la zone","pasteMsg":"Veuillez coller le texte dans la zone suivante en utilisant le raccourci clavier (<strong>Ctrl/Cmd+V</strong>) et cliquez sur OK.","securityMsg":"A cause des paramètres de sĂ©curitĂ© de votre navigateur, l'Ă©diteur n'est pas en mesure d'accĂ©der directement Ă  vos donnĂ©es contenues dans le presse-papier. Vous devriez rĂ©essayer de coller les donnĂ©es dans la fenĂªtre.","title":"Coller"},"contextmenu":{"options":"Options du menu contextuel"},"button":{"selectedLabel":"%1 (SĂ©lectionnĂ©)"},"toolbar":{"toolbarCollapse":"Enrouler la barre d'outils","toolbarExpand":"DĂ©rouler la barre d'outils","toolbarGroups":{"document":"Document","clipboard":"Presse-papier/DĂ©faire","editing":"Editer","forms":"Formulaires","basicstyles":"Styles de base","paragraph":"Paragraphe","links":"Liens","insert":"InsĂ©rer","styles":"Styles","colors":"Couleurs","tools":"Outils"},"toolbars":"Barre d'outils de l'Ă©diteur"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 Ă©lĂ©ments"},"format":{"label":"Format","panelTitle":"Format de paragraphe","tag_address":"Adresse","tag_div":"Normal (DIV)","tag_h1":"Titre 1","tag_h2":"Titre 2","tag_h3":"Titre 3","tag_h4":"Titre 4","tag_h5":"Titre 5","tag_h6":"Titre 6","tag_p":"Normal","tag_pre":"FormatĂ©"},"horizontalrule":{"toolbar":"Ligne horizontale"},"image":{"alertUrl":"Veuillez entrer l'adresse de l'image","alt":"Texte de remplacement","border":"Bordure","btnUpload":"Envoyer sur le serveur","button2Img":"Voulez-vous transformer le bouton image sĂ©lectionnĂ© en simple image?","hSpace":"Espacement horizontal","img2Button":"Voulez-vous transformer l'image en bouton image?","infoTab":"Informations sur l'image","linkTab":"Lien","lockRatio":"Conserver les proportions","menu":"PropriĂ©tĂ©s de l'image","resetSize":"Taille d'origine","title":"PropriĂ©tĂ©s de l'image","titleButton":"PropriĂ©tĂ©s du bouton image","upload":"Envoyer","urlMissing":"L'adresse source de l'image est manquante.","vSpace":"Espacement vertical","validateBorder":"Bordure doit Ăªtre un entier.","validateHSpace":"HSpace doit Ăªtre un entier.","validateVSpace":"VSpace doit Ăªtre un entier."},"indent":{"indent":"Augmenter le retrait (tabulation)","outdent":"Diminuer le retrait (tabulation)"},"fakeobjects":{"anchor":"Ancre","flash":"Animation Flash","hiddenfield":"Champ cachĂ©","iframe":"IFrame","unknown":"Objet inconnu"},"link":{"acccessKey":"Touche d'accessibilitĂ©","advanced":"AvancĂ©","advisoryContentType":"Type de contenu (ex: text/html)","advisoryTitle":"Description (title)","anchor":{"toolbar":"Ancre","menu":"Editer l'ancre","title":"PropriĂ©tĂ©s de l'ancre","name":"Nom de l'ancre","errorName":"Veuillez entrer le nom de l'ancre.","remove":"Supprimer l'ancre"},"anchorId":"Par ID d'Ă©lĂ©ment","anchorName":"Par nom d'ancre","charset":"Charset de la cible","cssClasses":"Classe CSS","emailAddress":"Adresse E-Mail","emailBody":"Corps du message","emailSubject":"Sujet du message","id":"Id","info":"Infos sur le lien","langCode":"Code de langue","langDir":"Sens d'Ă©criture","langDirLTR":"Gauche Ă  droite","langDirRTL":"Droite Ă  gauche","menu":"Editer le lien","name":"Nom","noAnchors":"(Aucune ancre disponible dans ce document)","noEmail":"Veuillez entrer l'adresse e-mail","noUrl":"Veuillez entrer l'adresse du lien","other":"<autre>","popupDependent":"DĂ©pendante (Netscape)","popupFeatures":"Options de la fenĂªtre popup","popupFullScreen":"Plein Ă©cran (IE)","popupLeft":"Position gauche","popupLocationBar":"Barre d'adresse","popupMenuBar":"Barre de menu","popupResizable":"Redimensionnable","popupScrollBars":"Barres de dĂ©filement","popupStatusBar":"Barre de status","popupToolbar":"Barre d'outils","popupTop":"Position haute","rel":"Relation","selectAnchor":"SĂ©lectionner l'ancre","styles":"Style","tabIndex":"Index de tabulation","target":"Cible","targetFrame":"<cadre>","targetFrameName":"Nom du Cadre destination","targetPopup":"<fenĂªtre popup>","targetPopupName":"Nom de la fenĂªtre popup","title":"Lien","toAnchor":"Ancre","toEmail":"E-mail","toUrl":"URL","toolbar":"Lien","type":"Type de lien","unlink":"Supprimer le lien","upload":"Envoyer"},"list":{"bulletedlist":"InsĂ©rer/Supprimer la liste Ă  puces","numberedlist":"InsĂ©rer/Supprimer la liste numĂ©rotĂ©e"},"magicline":{"title":"InsĂ©rez un paragraphe ici"},"maximize":{"maximize":"Agrandir","minimize":"Minimiser"},"pastetext":{"button":"Coller comme texte sans mise en forme","title":"Coller comme texte sans mise en forme"},"pastefromword":{"confirmCleanup":"Le texte Ă  coller semble provenir de Word. DĂ©sirez-vous le nettoyer avant de coller?","error":"Il n'a pas Ă©tĂ© possible de nettoyer les donnĂ©es collĂ©es Ă  la suite d'une erreur interne.","title":"Coller depuis Word","toolbar":"Coller depuis Word"},"removeformat":{"toolbar":"Supprimer la mise en forme"},"sourcearea":{"toolbar":"Source"},"specialchar":{"options":"Options des caractères spĂ©ciaux","title":"SĂ©lectionnez un caractère","toolbar":"InsĂ©rer un caractère spĂ©cial"},"scayt":{"btn_about":"A propos de SCAYT","btn_dictionaries":"Dictionnaires","btn_disable":"DĂ©sactiver SCAYT","btn_enable":"Activer SCAYT","btn_langs":"Langues","btn_options":"Options","text_title":"VĂ©rification de l'Orthographe en Cours de Frappe (SCAYT)"},"stylescombo":{"label":"Styles","panelTitle":"Styles de mise en page","panelTitle1":"Styles de blocs","panelTitle2":"Styles en ligne","panelTitle3":"Styles d'objet"},"table":{"border":"Taille de la bordure","caption":"Titre du tableau","cell":{"menu":"Cellule","insertBefore":"InsĂ©rer une cellule avant","insertAfter":"InsĂ©rer une cellule après","deleteCell":"Supprimer les cellules","merge":"Fusionner les cellules","mergeRight":"Fusionner Ă  droite","mergeDown":"Fusionner en bas","splitHorizontal":"Fractionner horizontalement","splitVertical":"Fractionner verticalement","title":"PropriĂ©tĂ©s de la cellule","cellType":"Type de cellule","rowSpan":"Fusion de lignes","colSpan":"Fusion de colonnes","wordWrap":"CĂ©sure","hAlign":"Alignement Horizontal","vAlign":"Alignement Vertical","alignBaseline":"Bas du texte","bgColor":"Couleur d'arrière-plan","borderColor":"Couleur de Bordure","data":"DonnĂ©es","header":"EntĂªte","yes":"Oui","no":"Non","invalidWidth":"La Largeur de Cellule doit Ăªtre un nombre.","invalidHeight":"La Hauteur de Cellule doit Ăªtre un nombre.","invalidRowSpan":"La fusion de lignes doit Ăªtre un nombre entier.","invalidColSpan":"La fusion de colonnes doit Ăªtre un nombre entier.","chooseColor":"Choisissez"},"cellPad":"Marge interne des cellules","cellSpace":"Espacement des cellules","column":{"menu":"Colonnes","insertBefore":"InsĂ©rer une colonne avant","insertAfter":"InsĂ©rer une colonne après","deleteColumn":"Supprimer les colonnes"},"columns":"Colonnes","deleteTable":"Supprimer le tableau","headers":"En-TĂªtes","headersBoth":"Les deux","headersColumn":"Première colonne","headersNone":"Aucunes","headersRow":"Première ligne","invalidBorder":"La taille de la bordure doit Ăªtre un nombre.","invalidCellPadding":"La marge intĂ©rieure des cellules doit Ăªtre un nombre positif.","invalidCellSpacing":"L'espacement des cellules doit Ăªtre un nombre positif.","invalidCols":"Le nombre de colonnes doit Ăªtre supĂ©rieur Ă  0.","invalidHeight":"La hauteur du tableau doit Ăªtre un nombre.","invalidRows":"Le nombre de lignes doit Ăªtre supĂ©rieur Ă  0.","invalidWidth":"La largeur du tableau doit Ăªtre un nombre.","menu":"PropriĂ©tĂ©s du tableau","row":{"menu":"Ligne","insertBefore":"InsĂ©rer une ligne avant","insertAfter":"InsĂ©rer une ligne après","deleteRow":"Supprimer les lignes"},"rows":"Lignes","summary":"RĂ©sumĂ© (description)","title":"PropriĂ©tĂ©s du tableau","toolbar":"Tableau","widthPc":"% pourcents","widthPx":"pixels","widthUnit":"unitĂ© de largeur"},"undo":{"redo":"RĂ©tablir","undo":"Annuler"},"wsc":{"btnIgnore":"Ignorer","btnIgnoreAll":"Ignorer tout","btnReplace":"Remplacer","btnReplaceAll":"Remplacer tout","btnUndo":"Annuler","changeTo":"Modifier pour","errorLoading":"Erreur du chargement du service depuis l'hĂ´te : %s.","ieSpellDownload":"La vĂ©rification d'orthographe n'est pas installĂ©e. Voulez-vous la tĂ©lĂ©charger maintenant?","manyChanges":"VĂ©rification de l'orthographe terminĂ©e : %1 mots corrigĂ©s.","noChanges":"VĂ©rification de l'orthographe terminĂ©e : Aucun mot corrigĂ©.","noMispell":"VĂ©rification de l'orthographe terminĂ©e : aucune erreur trouvĂ©e.","noSuggestions":"- Aucune suggestion -","notAvailable":"DĂ©solĂ©, le service est indisponible actuellement.","notInDic":"N'existe pas dans le dictionnaire.","oneChange":"VĂ©rification de l'orthographe terminĂ©e : Un seul mot corrigĂ©.","progress":"VĂ©rification de l'orthographe en cours...","title":"VĂ©rifier l'orthographe","toolbar":"VĂ©rifier l'orthographe"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/gl.js b/js/ckeditor/lang/gl.js
new file mode 100644
index 0000000..00f3a5e
--- /dev/null
+++ b/js/ckeditor/lang/gl.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['gl']={"editor":"Editor de texto mellorado","editorPanel":"Panel do editor de texto mellorado","common":{"editorHelp":"Prema ALT 0 para obter axuda","browseServer":"Examinar o servidor","url":"URL","protocol":"Protocolo","upload":"Enviar","uploadSubmit":"Enviar ao servidor","image":"Imaxe","flash":"Flash","form":"Formulario","checkbox":"Caixa de selecciĂ³n","radio":"BotĂ³n de opciĂ³n","textField":"Campo de texto","textarea":"Ărea de texto","hiddenField":"Campo agochado","button":"BotĂ³n","select":"Campo de selecciĂ³n","imageButton":"BotĂ³n de imaxe","notSet":"<sen estabelecer>","id":"ID","name":"Nome","langDir":"DirecciĂ³n de escritura do idioma","langDirLtr":"Esquerda a dereita (LTR)","langDirRtl":"Dereita a esquerda (RTL)","langCode":"CĂ³digo do idioma","longDescr":"DescriciĂ³n completa do URL","cssClass":"Clases da folla de estilos","advisoryTitle":"TĂ­tulo","cssStyle":"Estilo","ok":"Aceptar","cancel":"Cancelar","close":"Pechar","preview":"Vista previa","resize":"Redimensionar","generalTab":"Xeral","advancedTab":"Avanzado","validateNumberFailed":"Este valor non Ă© un nĂºmero.","confirmNewPage":"Calquera cambio que non gardara neste contido perderase.\r\nConfirma que quere cargar unha pĂ¡xina nova?","confirmCancel":"Algunhas das opciĂ³ns foron cambiadas.\r\nConfirma que quere pechar o diĂ¡logo?","options":"OpciĂ³ns","target":"Destino","targetNew":"Nova xanela (_blank)","targetTop":"Xanela principal (_top)","targetSelf":"Mesma xanela (_self)","targetParent":"Xanela superior (_parent)","langDirLTR":"Esquerda a dereita (LTR)","langDirRTL":"Dereita a esquerda (RTL)","styles":"Estilo","cssClasses":"Clases da folla de estilos","width":"Largo","height":"Alto","align":"Aliñamento","alignLeft":"Esquerda","alignRight":"Dereita","alignCenter":"Centro","alignJustify":"Xustificado","alignTop":"Arriba","alignMiddle":"Centro","alignBottom":"Abaixo","alignNone":"None","invalidValue":"Valor incorrecto.","invalidHeight":"O alto debe ser un nĂºmero.","invalidWidth":"O largo debe ser un nĂºmero.","invalidCssLength":"O valor especificado para o campo «%1» debe ser un nĂºmero positivo con ou sen unha unidade de medida CSS correcta (px, %, in, cm, mm, em, ex, pt, ou pc).","invalidHtmlLength":"O valor especificado para o campo «%1» debe ser un nĂºmero positivo con ou sen unha unidade de medida HTML correcta (px ou %).","invalidInlineStyle":"O valor especificado no estilo en liña debe consistir nunha ou mĂ¡is tuplas co formato «nome : valor», separadas por punto e coma.","cssLengthTooltip":"Escriba un nĂºmero para o valor en pĂ­xeles ou un nĂºmero cunha unidade CSS correcta (px, %, in, cm, mm, em, ex, pt, ou pc).","unavailable":"%1<span class=\"cke_accessibility\">, non dispoñíbel</span>"},"about":{"copy":"Copyright &copy; $1. Todos os dereitos reservados.","dlgTitle":"Sobre o CKEditor","help":"Consulte $1 para obter axuda.","moreInfo":"Para obter informaciĂ³n sobre a licenza, visite o noso sitio web:","title":"Sobre o CKEditor","userGuide":"GuĂ­a do usuario do CKEditor"},"basicstyles":{"bold":"Negra","italic":"Cursiva","strike":"Riscado","subscript":"SubĂ­ndice","superscript":"SuperĂ­ndice","underline":"Subliñado"},"blockquote":{"toolbar":"Cita"},"clipboard":{"copy":"Copiar","copyError":"Os axustes de seguranza do seu navegador non permiten que o editor realice automaticamente as tarefas de copia. Use o teclado para iso (Ctrl/Cmd+C).","cut":"Cortar","cutError":"Os axustes de seguranza do seu navegador non permiten que o editor realice automaticamente as tarefas de corte. Use o teclado para iso (Ctrl/Cmd+X).","paste":"Pegar","pasteArea":"Zona de pegado","pasteMsg":"Pegue dentro do seguinte cadro usando o teclado (<STRONG>Ctrl/Cmd+V</STRONG>) e prema en Aceptar","securityMsg":"Por mor da configuraciĂ³n de seguranza do seu navegador, o editor non ten acceso ao portapapeis. É necesario pegalo novamente nesta xanela.","title":"Pegar"},"contextmenu":{"options":"OpciĂ³ns do menĂº contextual"},"button":{"selectedLabel":"%1 (seleccionado)"},"toolbar":{"toolbarCollapse":"Contraer a barra de ferramentas","toolbarExpand":"Expandir a barra de ferramentas","toolbarGroups":{"document":"Documento","clipboard":"Portapapeis/desfacer","editing":"EdiciĂ³n","forms":"Formularios","basicstyles":"Estilos bĂ¡sicos","paragraph":"Paragrafo","links":"LigazĂ³ns","insert":"Inserir","styles":"Estilos","colors":"Cores","tools":"Ferramentas"},"toolbars":"Barras de ferramentas do editor"},"elementspath":{"eleLabel":"Ruta dos elementos","eleTitle":"Elemento %1"},"format":{"label":"Formato","panelTitle":"Formato do parĂ¡grafo","tag_address":"Enderezo","tag_div":"Normal (DIV)","tag_h1":"Enacabezado 1","tag_h2":"Encabezado 2","tag_h3":"Encabezado 3","tag_h4":"Encabezado 4","tag_h5":"Encabezado 5","tag_h6":"Encabezado 6","tag_p":"Normal","tag_pre":"Formatado"},"horizontalrule":{"toolbar":"Inserir unha liña horizontal"},"image":{"alertUrl":"Escriba o URL da imaxe","alt":"Texto alternativo","border":"Bordo","btnUpload":"Enviar ao servidor","button2Img":"Quere converter o botĂ³n da imaxe seleccionada nunha imaxe sinxela?","hSpace":"Esp.Horiz.","img2Button":"Quere converter a imaxe seleccionada nun botĂ³n de imaxe?","infoTab":"InformaciĂ³n da imaxe","linkTab":"LigazĂ³n","lockRatio":"Proporcional","menu":"Propiedades da imaxe","resetSize":"Tamaño orixinal","title":"Propiedades da imaxe","titleButton":"Propiedades do botĂ³n de imaxe","upload":"Cargar","urlMissing":"Non se atopa o URL da imaxe.","vSpace":"Esp.Vert.","validateBorder":"O bordo debe ser un nĂºmero.","validateHSpace":"O espazado horizontal debe ser un nĂºmero.","validateVSpace":"O espazado vertical debe ser un nĂºmero."},"indent":{"indent":"Aumentar a sangrĂ­a","outdent":"Reducir a sangrĂ­a"},"fakeobjects":{"anchor":"Ancoraxe","flash":"AnimaciĂ³n «Flash»","hiddenfield":"Campo agochado","iframe":"IFrame","unknown":"Obxecto descoñecido"},"link":{"acccessKey":"Chave de acceso","advanced":"Avanzado","advisoryContentType":"Tipo de contido informativo","advisoryTitle":"TĂ­tulo","anchor":{"toolbar":"Ancoraxe","menu":"Editar a ancoraxe","title":"Propiedades da ancoraxe","name":"Nome da ancoraxe","errorName":"Escriba o nome da ancoraxe","remove":"Retirar a ancoraxe"},"anchorId":"Polo ID do elemento","anchorName":"Polo nome da ancoraxe","charset":"CodificaciĂ³n do recurso ligado","cssClasses":"Clases da folla de estilos","emailAddress":"Enderezo de correo","emailBody":"Corpo da mensaxe","emailSubject":"Asunto da mensaxe","id":"ID","info":"InformaciĂ³n da ligazĂ³n","langCode":"CĂ³digo do idioma","langDir":"DirecciĂ³n de escritura do idioma","langDirLTR":"Esquerda a dereita (LTR)","langDirRTL":"Dereita a esquerda (RTL)","menu":"Editar a ligazĂ³n","name":"Nome","noAnchors":"(Non hai ancoraxes dispoñíbeis no documento)","noEmail":"Escriba o enderezo de correo","noUrl":"Escriba a ligazĂ³n URL","other":"<outro>","popupDependent":"Dependente (Netscape)","popupFeatures":"CaracterĂ­sticas da xanela emerxente","popupFullScreen":"Pantalla completa (IE)","popupLeft":"PosiciĂ³n esquerda","popupLocationBar":"Barra de localizaciĂ³n","popupMenuBar":"Barra do menĂº","popupResizable":"RedimensionĂ¡bel","popupScrollBars":"Barras de desprazamento","popupStatusBar":"Barra de estado","popupToolbar":"Barra de ferramentas","popupTop":"PosiciĂ³n superior","rel":"RelaciĂ³n","selectAnchor":"Seleccionar unha ancoraxe","styles":"Estilo","tabIndex":"Ăndice de tabulaciĂ³n","target":"Destino","targetFrame":"<marco>","targetFrameName":"Nome do marco de destino","targetPopup":"<xanela emerxente>","targetPopupName":"Nome da xanela emerxente","title":"LigazĂ³n","toAnchor":"Ligar coa ancoraxe no testo","toEmail":"Correo","toUrl":"URL","toolbar":"LigazĂ³n","type":"Tipo de ligazĂ³n","unlink":"Eliminar a ligazĂ³n","upload":"Enviar"},"list":{"bulletedlist":"Inserir/retirar lista viñeteada","numberedlist":"Inserir/retirar lista numerada"},"magicline":{"title":"Inserir aquĂ­ o parĂ¡grafo"},"maximize":{"maximize":"Maximizar","minimize":"Minimizar"},"pastetext":{"button":"Pegar como texto simple","title":"Pegar como texto simple"},"pastefromword":{"confirmCleanup":"O texto que quere pegar semella ser copiado desde o Word. Quere depuralo antes de pegalo?","error":"Non foi posĂ­bel depurar os datos pegados por mor dun erro interno","title":"Pegar desde Word","toolbar":"Pegar desde Word"},"removeformat":{"toolbar":"Retirar o formato"},"sourcearea":{"toolbar":"Orixe"},"specialchar":{"options":"OpciĂ³ns de caracteres especiais","title":"Seleccione un carĂ¡cter especial","toolbar":"Inserir un carĂ¡cter especial"},"scayt":{"btn_about":"About SCAYT","btn_dictionaries":"Dictionaries","btn_disable":"Disable SCAYT","btn_enable":"Enable SCAYT","btn_langs":"Languages","btn_options":"Options","text_title":"Spell Check As You Type"},"stylescombo":{"label":"Estilos","panelTitle":"Estilos de formatando","panelTitle1":"Estilos de bloque","panelTitle2":"Estilos de carĂ¡cter","panelTitle3":"Estilos de obxecto"},"table":{"border":"Tamaño do bordo","caption":"TĂ­tulo","cell":{"menu":"Cela","insertBefore":"Inserir a cela Ă¡ esquerda","insertAfter":"Inserir a cela Ă¡ dereita","deleteCell":"Eliminar celas","merge":"Combinar celas","mergeRight":"Combinar Ă¡ dereita","mergeDown":"Combinar cara abaixo","splitHorizontal":"Dividir a cela en horizontal","splitVertical":"Dividir a cela en vertical","title":"Propiedades da cela","cellType":"Tipo de cela","rowSpan":"Expandir filas","colSpan":"Expandir columnas","wordWrap":"Axustar ao contido","hAlign":"AliñaciĂ³n horizontal","vAlign":"AliñaciĂ³n vertical","alignBaseline":"Liña de base","bgColor":"Cor do fondo","borderColor":"Cor do bordo","data":"Datos","header":"Cabeceira","yes":"Si","no":"Non","invalidWidth":"O largo da cela debe ser un nĂºmero.","invalidHeight":"O alto da cela debe ser un nĂºmero.","invalidRowSpan":"A expansiĂ³n de filas debe ser un nĂºmero enteiro.","invalidColSpan":"A expansiĂ³n de columnas debe ser un nĂºmero enteiro.","chooseColor":"Escoller"},"cellPad":"Marxe interior da cela","cellSpace":"Marxe entre celas","column":{"menu":"Columna","insertBefore":"Inserir a columna Ă¡ esquerda","insertAfter":"Inserir a columna Ă¡ dereita","deleteColumn":"Borrar Columnas"},"columns":"Columnas","deleteTable":"Borrar TĂ¡boa","headers":"Cabeceiras","headersBoth":"Ambas","headersColumn":"Primeira columna","headersNone":"NingĂºn","headersRow":"Primeira fila","invalidBorder":"O tamaño do bordo debe ser un nĂºmero.","invalidCellPadding":"A marxe interior debe ser un nĂºmero positivo.","invalidCellSpacing":"A marxe entre celas debe ser un nĂºmero positivo.","invalidCols":"O nĂºmero de columnas debe ser un nĂºmero maior que 0.","invalidHeight":"O alto da tĂ¡boa debe ser un nĂºmero.","invalidRows":"O nĂºmero de filas debe ser un nĂºmero maior que 0","invalidWidth":"O largo da tĂ¡boa debe ser un nĂºmero.","menu":"Propiedades da tĂ¡boa","row":{"menu":"Fila","insertBefore":"Inserir a fila por riba","insertAfter":"Inserir a fila por baixo","deleteRow":"Eliminar filas"},"rows":"Filas","summary":"Resumo","title":"Propiedades da tĂ¡boa","toolbar":"Taboa","widthPc":"porcentaxe","widthPx":"pĂ­xeles","widthUnit":"unidade do largo"},"undo":{"redo":"Refacer","undo":"Desfacer"},"wsc":{"btnIgnore":"Ignorar","btnIgnoreAll":"Ignorar Todas","btnReplace":"Substituir","btnReplaceAll":"Substituir Todas","btnUndo":"Desfacer","changeTo":"Cambiar a","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"O corrector ortogrĂ¡fico non estĂ¡ instalado. ¿Quere descargalo agora?","manyChanges":"CorrecciĂ³n ortogrĂ¡fica rematada: %1 verbas substituidas","noChanges":"CorrecciĂ³n ortogrĂ¡fica rematada: Non se substituiu nengunha verba","noMispell":"CorrecciĂ³n ortogrĂ¡fica rematada: Non se atoparon erros","noSuggestions":"- Sen candidatos -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Non estĂ¡ no diccionario","oneChange":"CorrecciĂ³n ortogrĂ¡fica rematada: Unha verba substituida","progress":"CorrecciĂ³n ortogrĂ¡fica en progreso...","title":"Spell Checker","toolbar":"CorrecciĂ³n OrtogrĂ¡fica"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/gu.js b/js/ckeditor/lang/gu.js
new file mode 100644
index 0000000..0299ac0
--- /dev/null
+++ b/js/ckeditor/lang/gu.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['gu']={"editor":"રીઠટેકà«àª·à«àª¤à« àªàª¡à«€àªŸàª°","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"પà«àª°à«‡àª¸ ALT 0 મદદ માટ","browseServer":"સરà«àªµàª° બà«àª°àª¾àª‰àª કરો","url":"URL","protocol":"પà«àª°à«‹àªŸà«‹àª•à«‰àª²","upload":"અપલોડ","uploadSubmit":"આ સરà«àªµàª°àª¨à«‡ મોકલવà«àª‚","image":"àªàª¿àª¤à«àª°","flash":"ફà«àª²à«…શ","form":"ફૉરà«àª®/પતà«àª°àª•","checkbox":"àªà«‡àª• બોકà«àª¸","radio":"રેડિઓ બટન","textField":"ટેકà«àª¸à«àªŸ ફીલà«àª¡, શબà«àª¦ કà«àª·à«‡àª¤à«àª°","textarea":"ટેકà«àª¸à«àªŸ àªàª°àª¿àª†, શબà«àª¦ વિસà«àª¤àª¾àª°","hiddenField":"ગà«àªªà«àª¤ કà«àª·à«‡àª¤à«àª°","button":"બટન","select":"પસંદગી કà«àª·à«‡àª¤à«àª°","imageButton":"àªàª¿àª¤à«àª° બટન","notSet":"<સેટ નથી>","id":"Id","name":"નામ","langDir":"ભાષા લેખવાની પદà«àª§àª¤àª¿","langDirLtr":"ડાબે થી જમણે (LTR)","langDirRtl":"જમણે થી ડાબે (RTL)","langCode":"ભાષા કોડ","longDescr":"વધારે માહિતી માટે URL","cssClass":"સà«àªŸàª¾àª‡àª²-શીટ કà«àª²àª¾àª¸","advisoryTitle":"મà«àª–à«àª¯ મથાળà«àª‚","cssStyle":"સà«àªŸàª¾àª‡àª²","ok":"ઠીક છે","cancel":"રદ કરવà«àª‚","close":"બંધ કરવà«àª‚","preview":"જોવà«àª‚","resize":"ખેંàªà«€ ને યોગà«àª¯ કરવà«àª‚","generalTab":"જનરલ","advancedTab":"અડà«àªµàª¾àª¨à«àª¸àª¡","validateNumberFailed":"આ રકમ આકડો નથી.","confirmNewPage":"સવે કારà«àª¯ વગરનà«àª‚ ફકરો ખોવાઈ જશે. તમને ખાતરી છે કે તમને નવà«àª‚ પાનà«àª‚ ખોલવà«àª‚ છે?","confirmCancel":"ઘણા વિકલà«àªªà«‹ બદલાયા છે. તમારે આ બોકà«àª·à« બંધ કરવà«àª‚ છે?","options":"વિકલà«àªªà«‹","target":"લકà«àª·à«àª¯","targetNew":"નવી વિનà«àª¡à«‹ (_blank)","targetTop":"ઉપરની વિનà«àª¡à«‹ (_top)","targetSelf":"àªàªœ વિનà«àª¡à«‹ (_self)","targetParent":"પેરનટ વિનà«àª¡à«‹ (_parent)","langDirLTR":"ડાબે થી જમણે (LTR)","langDirRTL":"જમણે થી ડાબે (RTL)","styles":"શૈલી","cssClasses":"શૈલી કલાસીસ","width":"પહોળાઈ","height":"àªàª‚àªàª¾àªˆ","align":"લાઇનદોરીમાં ગોઠવવà«àª‚","alignLeft":"ડાબી બાજૠગોઠવવà«àª‚","alignRight":"જમણી","alignCenter":"મધà«àª¯ સેનà«àªŸàª°","alignJustify":"બà«àª²à«‰àª•, અંતરાય જસà«àªŸàª¿àª«àª¾àª‡","alignTop":"ઉપર","alignMiddle":"વàªà«àªà«‡","alignBottom":"નીàªà«‡","alignNone":"None","invalidValue":"Invalid value.","invalidHeight":"ઉંàªàª¾àªˆ àªàª• આંકડો હોવો જોઈàª.","invalidWidth":"પોહળ ઈ àªàª• આંકડો હોવો જોઈàª.","invalidCssLength":"\"%1\" ની વેલà«àª¯à« àªàª• પોસીટીવ આંકડો હોવો જોઈઠઅથવા CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc) વગર.","invalidHtmlLength":"\"%1\" ની વેલà«àª¯à« àªàª• પોસીટીવ આંકડો હોવો જોઈઠઅથવા HTML measurement unit (px or %) વગર.","invalidInlineStyle":"ઈનલાઈન સà«àªŸàª¾àªˆàª² ની વેલà«àª¯à« \"name : value\" ના ફોરà«àª®à«‡àªŸ માં હોવી જોઈàª, વàªà«àªà«‡ સેમી-કોલોન જોઈàª.","cssLengthTooltip":"પિકà«àª·à«àª²à« નો આંકડો CSS unit (px, %, in, cm, mm, em, ex, pt, or pc) માં નાખો.","unavailable":"%1<span class=\"cke_accessibility\">, નથી મળતà«àª‚</span>"},"about":{"copy":"કોપીરાઈટ &copy; $1. ઓલ રાઈટà«àª¸ ","dlgTitle":"CKEditor વિષે","help":"મદદ માટે $1 તપાસો","moreInfo":"લાયસનસની માહિતી માટે અમારી વેબ સાઈટ","title":"CKEditor વિષે","userGuide":"CKEditor યà«àªàª°à«àª¸ ગાઈડ"},"basicstyles":{"bold":"બોલà«àª¡/સà«àªªàª·à«àªŸ","italic":"ઇટેલિક, તà«àª°àª¾àª‚સા","strike":"છેકી નાખવà«àª‚","subscript":"àªàª• àªàª¿àª¹à«àª¨àª¨à«€ નીàªà«‡ કરેલà«àª‚ બીજà«àª‚ àªàª¿àª¹à«àª¨","superscript":"àªàª• àªàª¿àª¹à«àª¨ ઉપર કરેલà«àª‚ બીજà«àª‚ àªàª¿àª¹à«àª¨.","underline":"અનà«àª¡àª°à«àª²àª¾àª‡àª¨, નીàªà«‡ લીટી"},"blockquote":{"toolbar":"બà«àª²à«‰àª•-કોટ, અવતરણàªàª¿àª¹à«àª¨à«‹"},"clipboard":{"copy":"નકલ","copyError":"તમારા બà«àª°àª¾àª‰àªàª° ની સà«àª°àª•à«àª·àª¿àª¤ સેટિંગસ કોપી કરવાની પરવાનગી નથી આપતી. (Ctrl/Cmd+C) का पà¥à¤°à¤¯à¥‹à¤— करें।","cut":"કાપવà«àª‚","cutError":"તમારા બà«àª°àª¾àª‰àªàª° ની સà«àª°àª•à«àª·àª¿àª¤ સેટિંગસ કટ કરવાની પરવાનગી નથી આપતી. (Ctrl/Cmd+X) નો ઉપયોગ કરો.","paste":"પેસà«àªŸ","pasteArea":"પેસà«àªŸ કરવાની જગà«àª¯àª¾","pasteMsg":"Ctrl/Cmd+V નો પà«àª°àª¯à«‹àª— કરી પેસà«àªŸ કરો","securityMsg":"તમારા બà«àª°àª¾àª‰àªàª° ની સà«àª°àª•à«àª·àª¿àª¤ સેટિંગસના કારણે,àªàª¡àª¿àªŸàª° તમારા કિલà«àªªàª¬à«‹àª°à«àª¡ ડેટા ને કોપી નથી કરી શકતો. તમારે આ વિનà«àª¡à«‹àª®àª¾àª‚ ફરીથી પેસà«àªŸ કરવà«àª‚ પડશે.","title":"પેસà«àªŸ"},"contextmenu":{"options":"કોનà«àª¤à«‡àª•à«àª·à«àª¤à« મેનà«àª¨àª¾ વિકલà«àªªà«‹"},"button":{"selectedLabel":"%1 (Selected)"},"toolbar":{"toolbarCollapse":"ટૂલબાર નાનà«àª‚ કરવà«àª‚","toolbarExpand":"ટૂલબાર મોટà«àª‚ કરવà«àª‚","toolbarGroups":{"document":"દસà«àª¤àª¾àªµà«‡àªœ","clipboard":"કà«àª²àª¿àªªàª¬à«‹àª°à«àª¡/અન","editing":"àªàª¡à«€àªŸ કરવà«àª‚","forms":"ફોરà«àª®","basicstyles":"બેસિકૠસà«àªŸàª¾àª‡àª²","paragraph":"ફકરો","links":"લીંક","insert":"ઉમેરવà«àª‚","styles":"સà«àªŸàª¾àª‡àª²","colors":"રંગ","tools":"ટૂલà«àª¸"},"toolbars":"àªàª¡à«€àªŸàª° ટૂલ બાર"},"elementspath":{"eleLabel":"àªàª²à«€àª®à«‡àª¨à«àªŸà«àª¸ નો ","eleTitle":"àªàª²à«€àª®à«‡àª¨à«àªŸ %1"},"format":{"label":"ફૉનà«àªŸ ફૉરà«àª®àªŸ, રàªàª¨àª¾àª¨à«€ શૈલી","panelTitle":"ફૉનà«àªŸ ફૉરà«àª®àªŸ, રàªàª¨àª¾àª¨à«€ શૈલી","tag_address":"સરનામà«àª‚","tag_div":"શીરà«àª·àª• (DIV)","tag_h1":"શીરà«àª·àª• 1","tag_h2":"શીરà«àª·àª• 2","tag_h3":"શીરà«àª·àª• 3","tag_h4":"શીરà«àª·àª• 4","tag_h5":"શીરà«àª·àª• 5","tag_h6":"શીરà«àª·àª• 6","tag_p":"સામાનà«àª¯","tag_pre":"ફૉરà«àª®àªŸà«‡àª¡"},"horizontalrule":{"toolbar":"સમસà«àª¤àª°à«€àª¯ રેખા ઇનà«àª¸àª°à«àªŸ/દાખલ કરવી"},"image":{"alertUrl":"àªàª¿àª¤à«àª°àª¨à«€ URL ટાઇપ કરો","alt":"ઑલà«àªŸàª°à«àª¨àªŸ ટેકà«àª¸à«àªŸ","border":"બોરà«àª¡àª°","btnUpload":"આ સરà«àªµàª°àª¨à«‡ મોકલવà«àª‚","button2Img":"તમારે ઈમેજ બટનને સાદી ઈમેજમાં બદલવà«àª‚ છે.","hSpace":"સમસà«àª¤àª°à«€àª¯ જગà«àª¯àª¾","img2Button":"તમારે સાદી ઈમેજને ઈમેજ બટનમાં બદલવà«àª‚ છે.","infoTab":"àªàª¿àª¤à«àª° ની જાણકારી","linkTab":"લિંક","lockRatio":"લૉક ગà«àª£à«‹àª¤à«àª¤àª°","menu":"àªàª¿àª¤à«àª°àª¨àª¾ ગà«àª£","resetSize":"રીસેટ સાઇàª","title":"àªàª¿àª¤à«àª°àª¨àª¾ ગà«àª£","titleButton":"àªàª¿àª¤à«àª° બટનના ગà«àª£","upload":"અપલોડ","urlMissing":"ઈમેજની મૂળ URL છે નહી.","vSpace":"લંબરૂપ જગà«àª¯àª¾","validateBorder":"બોરà«àª¡à«‡àª° આંકડો હોવો જોઈàª.","validateHSpace":"HSpaceઆંકડો હોવો જોઈàª.","validateVSpace":"VSpace આંકડો હોવો જોઈàª. "},"indent":{"indent":"ઇનà«àª¡à«‡àª¨à«àªŸ, લીટીના આરંભમાં જગà«àª¯àª¾ વધારવી","outdent":"ઇનà«àª¡à«‡àª¨à«àªŸ લીટીના આરંભમાં જગà«àª¯àª¾ ઘટાડવી"},"fakeobjects":{"anchor":"અનકર","flash":"ફà«àª²à«‡àª¶ ","hiddenfield":"હિડન ","iframe":"IFrame","unknown":"અનનોન ઓબà«àªœà«‡àª•à«àªŸ"},"link":{"acccessKey":"àªàª•à«àª¸à«‡àª¸ કી","advanced":"અડà«àªµàª¾àª¨à«àª¸àª¡","advisoryContentType":"મà«àª–à«àª¯ કનà«àªŸà«‡àª¨à«àªŸ પà«àª°àª•àª¾àª°","advisoryTitle":"મà«àª–à«àª¯ મથાળà«àª‚","anchor":{"toolbar":"àªàª‚કર ઇનà«àª¸àª°à«àªŸ/દાખલ કરવી","menu":"àªàª‚કરના ગà«àª£","title":"àªàª‚કરના ગà«àª£","name":"àªàª‚કરનà«àª‚ નામ","errorName":"àªàª‚કરનà«àª‚ નામ ટાઈપ કરો","remove":"સà«àª¥àª¿àª° નકરવà«àª‚"},"anchorId":"àªàª‚કર àªàª²àª¿àª®àª¨à«àªŸ Id થી પસંદ કરો","anchorName":"àªàª‚કર નામથી પસંદ કરો","charset":"લિંક રિસૉરà«àª¸ કૅરિકà«àªŸàª° સેટ","cssClasses":"સà«àªŸàª¾àª‡àª²-શીટ કà«àª²àª¾àª¸","emailAddress":"ઈ-મેલ સરનામà«àª‚","emailBody":"સંદેશ","emailSubject":"ઈ-મેલ વિષય","id":"Id","info":"લિંક ઇનà«àª«à«‰ ટૅબ","langCode":"ભાષા લેખવાની પદà«àª§àª¤àª¿","langDir":"ભાષા લેખવાની પદà«àª§àª¤àª¿","langDirLTR":"ડાબે થી જમણે (LTR)","langDirRTL":"જમણે થી ડાબે (RTL)","menu":" લિંક àªàª¡àª¿àªŸ/માં ફેરફાર કરવો","name":"નામ","noAnchors":"(ડૉકà«àª¯à«àª®àª¨à«àªŸàª®àª¾àª‚ àªàª‚કરની સંખà«àª¯àª¾)","noEmail":"ઈ-મેલ સરનામà«àª‚ ટાઇપ કરો","noUrl":"લિંક URL ટાઇપ કરો","other":"<other> <અનà«àª¯>","popupDependent":"ડિપેનà«àª¡àª¨à«àªŸ (Netscape)","popupFeatures":"પૉપ-અપ વિનà«àª¡à«‹ ફીàªàª°àª¸à«…","popupFullScreen":"ફà«àª² સà«àª•à«àª°à«€àª¨ (IE)","popupLeft":"ડાબી બાજà«","popupLocationBar":"લોકેશન બાર","popupMenuBar":"મેનà«àª¯à«‚ બાર","popupResizable":"રીસાઈàªàªàª¬àª²","popupScrollBars":"સà«àª•à«àª°à«‹àª² બાર","popupStatusBar":"સà«àªŸà«…ટસ બાર","popupToolbar":"ટૂલ બાર","popupTop":"જમણી બાજà«","rel":"સંબંધની સà«àª¥àª¿àª¤àª¿","selectAnchor":"àªàª‚કર પસંદ કરો","styles":"સà«àªŸàª¾àª‡àª²","tabIndex":"ટૅબ ઇનà«àª¡à«‡àª•à«àª¸","target":"ટારà«àª—ેટ/લકà«àª·à«àª¯","targetFrame":"<ફà«àª°à«‡àª®>","targetFrameName":"ટારà«àª—ેટ ફà«àª°à«‡àª® નà«àª‚ નામ","targetPopup":"<પૉપ-અપ વિનà«àª¡à«‹>","targetPopupName":"પૉપ-અપ વિનà«àª¡à«‹ નà«àª‚ નામ","title":"લિંક","toAnchor":"આ પેજનો àªàª‚કર","toEmail":"ઈ-મેલ","toUrl":"URL","toolbar":"લિંક ઇનà«àª¸àª°à«àªŸ/દાખલ કરવી","type":"લિંક પà«àª°àª•àª¾àª°","unlink":"લિંક કાઢવી","upload":"અપલોડ"},"list":{"bulletedlist":"બà«àª²à«‡àªŸ સૂàªàª¿","numberedlist":"સંખà«àª¯àª¾àª‚કન સૂàªàª¿"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"મોટà«àª‚ કરવà«àª‚","minimize":"નાનà«àª‚ કરવà«àª‚"},"pastetext":{"button":"પેસà«àªŸ (ટેકà«àª¸à«àªŸ)","title":"પેસà«àªŸ (ટેકà«àª¸à«àªŸ)"},"pastefromword":{"confirmCleanup":"તમે જે ટેકà«àª·à«àª¤à« કોપી કરી રહà«àª¯àª¾ છો ટે વરà«àª¡ ની છે. કોપી કરતા પેહલા સાફ કરવી છે?","error":"પેસà«àªŸ કરેલો ડેટા ઇનà«àªŸàª°àª¨àª² àªàª°àª° ના લીથે સાફ કરી શકાયો નથી.","title":"પેસà«àªŸ (વડૅ ટેકà«àª¸à«àªŸ)","toolbar":"પેસà«àªŸ (વડૅ ટેકà«àª¸à«àªŸ)"},"removeformat":{"toolbar":"ફૉરà«àª®àªŸ કાઢવà«àª‚"},"sourcearea":{"toolbar":"મૂળ કે પà«àª°àª¾àª¥àª®àª¿àª• દસà«àª¤àª¾àªµà«‡àªœ"},"specialchar":{"options":"સà«àªªà«‡àª¶àª¿àª…લ કરેકà«àªŸàª°àª¨àª¾ વિકલà«àªªà«‹","title":"સà«àªªà«‡àª¶àª¿àª…લ વિશિષà«àªŸ અકà«àª·àª° પસંદ કરો","toolbar":"વિશિષà«àªŸ અકà«àª·àª° ઇનà«àª¸àª°à«àªŸ/દાખલ કરવà«àª‚"},"scayt":{"btn_about":"SCAYT વિષે","btn_dictionaries":"શબà«àª¦àª•à«‹àª¶","btn_disable":"SCAYT ડિસેબલ કરવà«àª‚","btn_enable":"SCAYT àªàª¨à«‡àª¬àª² કરવà«àª‚","btn_langs":"ભાષાઓ","btn_options":"વિકલà«àªªà«‹","text_title":"ટાઈપ કરતા સà«àªªà«‡àª² તપાસો"},"stylescombo":{"label":"શૈલી/રીત","panelTitle":"ફોરà«àª®à«‡àªŸ ","panelTitle1":"બà«àª²à«‹àª• ","panelTitle2":"ઈનલાઈન ","panelTitle3":"ઓબà«àªœà«‡àª•à«àªŸ પદà«àª§àª¤àª¿"},"table":{"border":"કોઠાની બાજà«(બોરà«àª¡àª°) સાઇàª","caption":"મથાળà«àª‚/કૅપà«àª¶àª¨ ","cell":{"menu":"કોષના ખાના","insertBefore":"પહેલાં કોષ ઉમેરવો","insertAfter":"પછી કોષ ઉમેરવો","deleteCell":"કોષ ડિલીટ/કાઢી નાખવો","merge":"કોષ ભેગા કરવા","mergeRight":"જમણી બાજૠભેગા કરવા","mergeDown":"નીàªà«‡ ભેગા કરવા","splitHorizontal":"કોષને સમસà«àª¤àª°à«€àª¯ વિભાજન કરવà«àª‚","splitVertical":"કોષને સીધà«àª‚ ને àªàª­à«àª‚ વિભાજન કરવà«àª‚","title":"સેલના ગà«àª£","cellType":"સેલનો પà«àª°àª•àª¾àª°","rowSpan":"આડી કટારની જગà«àª¯àª¾","colSpan":"àªàª­à«€ કતારની જગà«àª¯àª¾","wordWrap":"વરà«àª¡ રેપ","hAlign":"સપાટ લાઈનદોરી","vAlign":"àªàª­à«€ લાઈનદોરી","alignBaseline":"બસે લાઈન","bgColor":"પાછાળનો રંગ","borderColor":"બોરà«àª¡à«‡àª° રંગ","data":"સà«àªµà«€àª•à«ƒàª¤ માહિતી","header":"મથાળà«àª‚","yes":"હા","no":"ના","invalidWidth":"સેલની પોહલાઈ આંકડો હોવો જોઈàª.","invalidHeight":"સેલની àªàª‚àªàª¾àªˆ આંકડો હોવો જોઈàª.","invalidRowSpan":"રો સà«àªªàª¾àª¨ આંકડો હોવો જોઈàª.","invalidColSpan":"કોલમ સà«àªªàª¾àª¨ આંકડો હોવો જોઈàª.","chooseColor":"પસંદ કરવà«àª‚"},"cellPad":"સેલ પૅડિંગ","cellSpace":"સેલ અંતર","column":{"menu":"કૉલમ/àªàª­à«€ કટાર","insertBefore":"પહેલાં કૉલમ/àªàª­à«€ કટાર ઉમેરવી","insertAfter":"પછી કૉલમ/àªàª­à«€ કટાર ઉમેરવી","deleteColumn":"કૉલમ/àªàª­à«€ કટાર ડિલીટ/કાઢી નાખવી"},"columns":"કૉલમ/àªàª­à«€ કટાર","deleteTable":"કોઠો ડિલીટ/કાઢી નાખવà«àª‚","headers":"મથાળા","headersBoth":"બેવà«àª‚","headersColumn":"પહેલી àªàª­à«€ કટાર","headersNone":"નથી ","headersRow":"પહેલી કટાર","invalidBorder":"બોરà«àª¡àª° àªàª• આંકડો હોવો જોઈàª","invalidCellPadding":"સેલની અંદરની જગà«àª¯àª¾ સà«àª¨à«àª¯ કરતા વધારે હોવી જોઈàª.","invalidCellSpacing":"સેલ વàªà«àªà«‡àª¨à«€ જગà«àª¯àª¾ સà«àª¨à«àª¯ કરતા વધારે હોવી જોઈàª.","invalidCols":"ઉભી કટાર, 0 કરતા વધારે હોવી જોઈàª.","invalidHeight":"ટેબલની àªàª‚àªàª¾àªˆ આંકડો હોવો જોઈàª.","invalidRows":"આડી કટાર, 0 કરતા વધારે હોવી જોઈàª.","invalidWidth":"ટેબલની પોહલાઈ આંકડો હોવો જોઈàª.","menu":"ટેબલ, કોઠાનà«àª‚ મથાળà«àª‚","row":{"menu":"પંકà«àª¤àª¿àª¨àª¾ ખાના","insertBefore":"પહેલાં પંકà«àª¤àª¿ ઉમેરવી","insertAfter":"પછી પંકà«àª¤àª¿ ઉમેરવી","deleteRow":"પંકà«àª¤àª¿àª“ ડિલીટ/કાઢી નાખવી"},"rows":"પંકà«àª¤àª¿àª¨àª¾ ખાના","summary":"ટૂંકો àªàª¹à«‡àªµàª¾àª²","title":"ટેબલ, કોઠાનà«àª‚ મથાળà«àª‚","toolbar":"ટેબલ, કોઠો","widthPc":"પà«àª°àª¤àª¿àª¶àª¤","widthPx":"પિકસલ","widthUnit":"પોહાલાઈ àªàª•àª®"},"undo":{"redo":"રિડૂ; પછી હતી àªàªµà«€ સà«àª¥àª¿àª¤àª¿ પાછી લાવવી","undo":"રદ કરવà«àª‚; પહેલાં હતી àªàªµà«€ સà«àª¥àª¿àª¤àª¿ પાછી લાવવી"},"wsc":{"btnIgnore":"ઇગà«àª¨à«‹àª°/અવગણના કરવી","btnIgnoreAll":"બધાની ઇગà«àª¨à«‹àª°/અવગણના કરવી","btnReplace":"બદલવà«àª‚","btnReplaceAll":"બધા બદલી કરો","btnUndo":"અનà«àª¡à«‚","changeTo":"આનાથી બદલવà«àª‚","errorLoading":"સરà«àªµàª¿àª¸ àªàªªà«àª²à«€àª•à«‡àª¶àª¨ લોડ નથી થ: %s.","ieSpellDownload":"સà«àªªà«‡àª²-àªà«‡àª•àª° ઇનà«àª¸à«àªŸà«‹àª² નથી. શà«àª‚ તમે ડાઉનલોડ કરવા માંગો છો?","manyChanges":"શબà«àª¦àª¨à«€ જોડણી/સà«àªªà«‡àª² àªà«‡àª• પૂરà«àª£: %1 શબà«àª¦ બદલયા છે","noChanges":"શબà«àª¦àª¨à«€ જોડણી/સà«àªªà«‡àª² àªà«‡àª• પૂરà«àª£: àªàª•àªªàª£ શબà«àª¦ બદલયો નથી","noMispell":"શબà«àª¦àª¨à«€ જોડણી/સà«àªªà«‡àª² àªà«‡àª• પૂરà«àª£: ખોટી જોડણી મળી નથી","noSuggestions":"- કઇ સજેશન નથી -","notAvailable":"માફ કરશો, આ સà«àªµàª¿àª§àª¾ ઉપલબà«àª§ નથી","notInDic":"શબà«àª¦àª•à«‹àª¶àª®àª¾àª‚ નથી","oneChange":"શબà«àª¦àª¨à«€ જોડણી/સà«àªªà«‡àª² àªà«‡àª• પૂરà«àª£: àªàª• શબà«àª¦ બદલયો છે","progress":"શબà«àª¦àª¨à«€ જોડણી/સà«àªªà«‡àª² àªà«‡àª• àªàª¾àª²à« છે...","title":"સà«àªªà«‡àª² ","toolbar":"જોડણી (સà«àªªà«‡àª²àª¿àª‚ગ) તપાસવી"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/he.js b/js/ckeditor/lang/he.js
new file mode 100644
index 0000000..1384b8c
--- /dev/null
+++ b/js/ckeditor/lang/he.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['he']={"editor":"×¢×•×¨× ×˜×§×¡×˜ עשיר","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"לחץ ×לט ALT + 0 לעזרה","browseServer":"סייר השרת","url":"כתובת (URL)","protocol":"פרוטוקול","upload":"העל××”","uploadSubmit":"שליחה לשרת","image":"ת×ונה","flash":"פל×ש","form":"טופס","checkbox":"תיבת סי×ון","radio":"לחצן ×פשרויות","textField":"שדה טקסט","textarea":"×יזור טקסט","hiddenField":"שדה חבוי","button":"כפתור","select":"שדה בחירה","imageButton":"כפתור ת×ונה","notSet":"<×œ× × ×§×‘×¢>","id":"זיהוי (ID)","name":"ש×","langDir":"כיוון שפה","langDirLtr":"ש××ל לי×ין (LTR)","langDirRtl":"×™×ין לש××ל (RTL)","langCode":"קוד שפה","longDescr":"קישור לתי×ור ×פורט","cssClass":"×חלקת עיצוב (CSS Class)","advisoryTitle":"כותרת ×וצעת","cssStyle":"סגנון","ok":"×ישור","cancel":"ביטול","close":"סגירה","preview":"תצוגה ×קדי××”","resize":"יש לגרור בכדי לשנות ×ת הגודל","generalTab":"כללי","advancedTab":"×פשרויות ×תקד×ות","validateNumberFailed":"×”×¢×¨× ×—×™×™×‘ להיות ×ספרי.","confirmNewPage":"כל ×”×©×™× ×•×™×™× ×©×œ× × ×©×רו ×™×בדו. ×”×× ×œ×”×¢×œ×•×ª דף חדש?","confirmCancel":"חלק ××”×פשרויות שונו, ×”×× ×œ×¡×’×•×¨ ×ת הדי×לוג?","options":"×פשרויות","target":"×טרה","targetNew":"חלון חדש (_blank)","targetTop":"החלון העליון ביותר (_top)","targetSelf":"×ותו חלון (_self)","targetParent":"חלון ×”×ב (_parent)","langDirLTR":"ש××ל לי×ין (LTR)","langDirRTL":"×™×ין לש××ל (RTL)","styles":"סגנון","cssClasses":"×חלקות גליונות סגנון","width":"רוחב","height":"גובה","align":"יישור","alignLeft":"לש××ל","alignRight":"לי×ין","alignCenter":"×רכז","alignJustify":"יישור לשוליי×","alignTop":"ל×עלה","alignMiddle":"ל××צע","alignBottom":"לתחתית","alignNone":"None","invalidValue":"×¢×¨× ×œ× ×—×•×§×™.","invalidHeight":"הגובה חייב להיות ×ספר.","invalidWidth":"הרוחב חייב להיות ×ספר.","invalidCssLength":"×”×¢×¨× ×©×¦×•×™×Ÿ לשדה \"%1\" חייב להיות ×ספר חיובי ×¢× ×ו ×œ×œ× ×™×—×™×“×ª ×ידה חוקית של CSS (px, %, in, cm, mm, em, ex, pt, ×ו pc).","invalidHtmlLength":"×”×¢×¨× ×©×¦×•×™×Ÿ לשדה \"%1\" חייב להיות ×ספר חיובי ×¢× ×ו ×œ×œ× ×™×—×™×“×ª ×ידה חוקית של HTML (px ×ו %).","invalidInlineStyle":"×”×¢×¨× ×©×¦×•×™×™×Ÿ לשדה הסגנון חייב להכיל זוג ×¢×¨×›×™× ×חד ×ו יותר בפור×ט \"×©× : ער×\", ××•×¤×¨×“×™× ×¢×œ ידי נקודה-פסיק.","cssLengthTooltip":"יש להכניס ×ספר ×”×ייצג ×¤×™×§×¡×œ×™× ×ו ×ספר ×¢× ×™×—×™×“×ª גליונות סגנון תקינה (px, %, in, cm, mm, em, ex, pt, ×ו pc).","unavailable":"%1<span class=\"cke_accessibility\">, ×œ× ×–×ין</span>"},"about":{"copy":"Copyright &copy; $1. כל הזכויות ש×ורות.","dlgTitle":"×ודות CKEditor","help":"היכנסו ל$1 לעזרה.","moreInfo":"ל×ידע נוסף בקרו ב×תרנו:","title":"×ודות CKEditor","userGuide":"××“×¨×™× ×”×שת×ש של CKEditor"},"basicstyles":{"bold":"×ודגש","italic":"נטוי","strike":"כתיב ×חוק","subscript":"כתיב תחתון","superscript":"כתיב עליון","underline":"קו תחתון"},"blockquote":{"toolbar":"בלוק ציטוט"},"clipboard":{"copy":"העתקה","copyError":"הגדרות ×”×בטחה בדפדפן ×©×œ× ×œ× ××פשרות ×œ×¢×•×¨× ×œ×‘×¦×¢ פעולות העתקה ×וטו×טיות. יש להשת×ש ב×קלדת ×œ×©× ×›× (Ctrl/Cmd+C).","cut":"גזירה","cutError":"הגדרות ×”×בטחה בדפדפן ×©×œ× ×œ× ××פשרות ×œ×¢×•×¨× ×œ×‘×¦×¢ פעולות גזירה ×וטו×טיות. יש להשת×ש ב×קלדת ×œ×©× ×›× (Ctrl/Cmd+X).","paste":"הדבקה","pasteArea":"×יזור הדבקה","pasteMsg":"× × ×œ×”×“×‘×™×§ ×‘×ª×•× ×”×§×•×¤×¡×” ב××צעות (<b>Ctrl/Cmd+V</b>) וללחוץ על <b>×ישור</b>.","securityMsg":"עקב הגדרות ×בטחה בדפדפן, ×œ× × ×™×ª×Ÿ לגשת ×ל לוח ×”×’×–×™×¨×™× (Clipboard) בצורה ישירה. × × ×œ×”×“×‘×™×§ שוב בחלון ×–×”.","title":"הדבקה"},"contextmenu":{"options":"×פשרויות תפריט ההקשר"},"button":{"selectedLabel":"1% (סו×ן)"},"toolbar":{"toolbarCollapse":"×זעור סרגל כלי×","toolbarExpand":"הרחבת סרגל כלי×","toolbarGroups":{"document":"×ס××","clipboard":"לוח ×”×’×–×™×¨×™× (Clipboard)/צעד ×חרון","editing":"עריכה","forms":"טפסי×","basicstyles":"עיצוב בסיסי","paragraph":"פסקה","links":"קישורי×","insert":"הכנסה","styles":"עיצוב","colors":"צבעי×","tools":"כלי×"},"toolbars":"סרגלי ×›×œ×™× ×©×œ העור×"},"elementspath":{"eleLabel":"×¢×¥ ×”×ל×נטי×","eleTitle":"%1 ×ל×נט"},"format":{"label":"עיצוב","panelTitle":"עיצוב","tag_address":"כתובת","tag_div":"נור×לי (DIV)","tag_h1":"כותרת","tag_h2":"כותרת 2","tag_h3":"כותרת 3","tag_h4":"כותרת 4","tag_h5":"כותרת 5","tag_h6":"כותרת 6","tag_p":"נור×לי","tag_pre":"קוד"},"horizontalrule":{"toolbar":"הוספת קו ×ופקי"},"image":{"alertUrl":"יש להקליד ×ת כתובת הת×ונה","alt":"טקסט חלופי","border":"×סגרת","btnUpload":"שליחה לשרת","button2Img":"×”×× ×œ×”×¤×•× ×ת ת×ונת הכפתור לת×ונה פשוטה?","hSpace":"×רווח ×ופקי","img2Button":"×”×× ×œ×”×¤×•× ×ת הת×ונה לכפתור ת×ונה?","infoTab":"×ידע על הת×ונה","linkTab":"קישור","lockRatio":"נעילת היחס","menu":"תכונות הת×ונה","resetSize":"×יפוס הגודל","title":"××פייני הת×ונה","titleButton":"××פיני כפתור ת×ונה","upload":"העל××”","urlMissing":"כתובת הת×ונה חסרה.","vSpace":"×רווח ×× ×›×™","validateBorder":"שדה ×”×סגרת חייב להיות ×ספר של×.","validateHSpace":"שדה ×”×רווח ×”×ופקי חייב להיות ×ספר של×.","validateVSpace":"שדה ×”×רווח ×”×× ×›×™ חייב להיות ×ספר של×."},"indent":{"indent":"הגדלת ×”×–×—×”","outdent":"הקטנת ×”×–×—×”"},"fakeobjects":{"anchor":"עוגן","flash":"סרטון פל×ש","hiddenfield":"שדה חבוי","iframe":"חלון פני××™ (iframe)","unknown":"×ובייקט ×œ× ×™×“×•×¢"},"link":{"acccessKey":"×קש גישה","advanced":"×פשרויות ×תקד×ות","advisoryContentType":"Content Type ×וצע","advisoryTitle":"כותרת ×וצעת","anchor":{"toolbar":"הוספת/עריכת נקודת עיגון","menu":"××פייני נקודת עיגון","title":"××פייני נקודת עיגון","name":"×©× ×œ× ×§×•×“×ª עיגון","errorName":"יש להקליד ×©× ×œ× ×§×•×“×ª עיגון","remove":"×חיקת נקודת עיגון"},"anchorId":"עפ\"×™ זיהוי (ID) ×”×ל×נט","anchorName":"עפ\"×™ ×©× ×”×¢×•×’×Ÿ","charset":"קידוד ×”×ש×ב ×”×קושר","cssClasses":"גיליונות עיצוב קבוצות","emailAddress":"כתובת הדו×\"ל","emailBody":"גוף ההודעה","emailSubject":"× ×•×©× ×”×”×•×“×¢×”","id":"זיהוי (ID)","info":"×ידע על הקישור","langCode":"קוד שפה","langDir":"כיוון שפה","langDirLTR":"ש××ל לי×ין (LTR)","langDirRTL":"×™×ין לש××ל (RTL)","menu":"××פייני קישור","name":"ש×","noAnchors":"(×ין ×¢×•×’× ×™× ×–××™× ×™× ×‘×“×£)","noEmail":"יש להקליד ×ת כתובת הדו×\"ל","noUrl":"יש להקליד ×ת כתובת הקישור (URL)","other":"<×חר>","popupDependent":"תלוי (Netscape)","popupFeatures":"תכונות החלון הקופץ","popupFullScreen":"××¡× ××œ× (IE)","popupLeft":"××™×§×•× ×¦×“ ש××ל","popupLocationBar":"סרגל כתובת","popupMenuBar":"סרגל תפריט","popupResizable":"שינוי גודל","popupScrollBars":"ניתן לגלילה","popupStatusBar":"סרגל חיווי","popupToolbar":"סרגל הכלי×","popupTop":"××™×§×•× ×¦×“ עליון","rel":"קשר גו×לין","selectAnchor":"בחירת עוגן","styles":"סגנון","tabIndex":"×ספר ט×ב","target":"×טרה","targetFrame":"<×סגרת>","targetFrameName":"×©× ×סגרת היעד","targetPopup":"<חלון קופץ>","targetPopupName":"×©× ×”×—×œ×•×Ÿ הקופץ","title":"קישור","toAnchor":"עוגן בע×וד ×–×”","toEmail":"דו×\"ל","toUrl":"כתובת (URL)","toolbar":"הוספת/עריכת קישור","type":"סוג קישור","unlink":"הסרת הקישור","upload":"העל××”"},"list":{"bulletedlist":"רשי×ת נקודות","numberedlist":"רשי××” ××וספרת"},"magicline":{"title":"הכנס פסקה ×›×ן"},"maximize":{"maximize":"הגדלה ל×קסי×ו×","minimize":"הקטנה ל××™× ×™×ו×"},"pastetext":{"button":"הדבקה כטקסט פשוט","title":"הדבקה כטקסט פשוט"},"pastefromword":{"confirmCleanup":"נר××” הטקסט ×©×‘×›×•×•× ×ª× ×œ×”×“×‘×™×§ ×קורו בקובץ וורד. ×”×× ×‘×¨×¦×•× × ×œ× ×§×•×ª ×ותו ×˜×¨× ×”×”×“×‘×§×”?","error":"×œ× × ×™×ª×Ÿ ×”×™×” לנקות ×ת ×”×ידע בשל תקלה פני×ית.","title":"הדבקה ×-Word","toolbar":"הדבקה ×-Word"},"removeformat":{"toolbar":"הסרת העיצוב"},"sourcearea":{"toolbar":"×קור"},"specialchar":{"options":"×פשרויות ×ª×•×•×™× ×יוחדי×","title":"בחירת תו ×יוחד","toolbar":"הוספת תו ×יוחד"},"scayt":{"btn_about":"×ודות SCAYT","btn_dictionaries":"×ילון","btn_disable":"בטל SCAYT","btn_enable":"×פשר SCAYT","btn_langs":"שפות","btn_options":"×פשרויות","text_title":"בדיקת ×יות בז×ן כתיבה (SCAYT)"},"stylescombo":{"label":"סגנון","panelTitle":"סגנונות פור×ט","panelTitle1":"סגנונות בלוק","panelTitle2":"סגנונות רצף","panelTitle3":"סגנונות ×ובייקט"},"table":{"border":"גודל ×סגרת","caption":"כיתוב","cell":{"menu":"××פייני ת×","insertBefore":"הוספת ×ª× ×œ×¤× ×™","insertAfter":"הוספת ×ª× ×חרי","deleteCell":"×חיקת ת××™×","merge":"×יזוג ת××™×","mergeRight":"××–×’ ×™××™× ×”","mergeDown":"××–×’ ל×טה","splitHorizontal":"פיצול ×ª× ×ופקית","splitVertical":"פיצול ×ª× ×נכית","title":"תכונות הת×","cellType":"סוג הת×","rowSpan":"×תיחת השורות","colSpan":"×תיחת הת××™×","wordWrap":"×ניעת גלישת שורות","hAlign":"יישור ×ופקי","vAlign":"יישור ×× ×›×™","alignBaseline":"שורת בסיס","bgColor":"צבע רקע","borderColor":"צבע ×סגרת","data":"×ידע","header":"כותרת","yes":"כן","no":"ל×","invalidWidth":"שדה רוחב ×”×ª× ×—×™×™×‘ להיות ×ספר.","invalidHeight":"שדה גובה ×”×ª× ×—×™×™×‘ להיות ×ספר.","invalidRowSpan":"שדה ×תיחת השורות חייב להיות ×ספר של×.","invalidColSpan":"שדה ×תיחת ×”×¢×ודות חייב להיות ×ספר של×.","chooseColor":"בחר"},"cellPad":"ריפוד ת×","cellSpace":"×רווח ת×","column":{"menu":"×¢×ודה","insertBefore":"הוספת ×¢×ודה לפני","insertAfter":"הוספת ×¢×ודה ×חרי","deleteColumn":"×חיקת ×¢×ודות"},"columns":"×¢×ודות","deleteTable":"×חק טבלה","headers":"כותרות","headersBoth":"שניה×","headersColumn":"×¢×ודה ר×שונה","headersNone":"×ין","headersRow":"שורה ר×שונה","invalidBorder":"שדה גודל ×”×סגרת חייב להיות ×ספר.","invalidCellPadding":"שדה ריפוד הת××™× ×—×™×™×‘ להיות ×ספר חיובי.","invalidCellSpacing":"שדה ריווח הת××™× ×—×™×™×‘ להיות ×ספר חיובי.","invalidCols":"שדה ×ספר ×”×¢×ודות חייב להיות ×ספר גדול × 0.","invalidHeight":"שדה גובה הטבלה חייב להיות ×ספר.","invalidRows":"שדה ×ספר השורות חייב להיות ×ספר גדול × 0.","invalidWidth":"שדה רוחב הטבלה חייב להיות ×ספר.","menu":"××פייני טבלה","row":{"menu":"שורה","insertBefore":"הוספת שורה לפני","insertAfter":"הוספת שורה ×חרי","deleteRow":"×חיקת שורות"},"rows":"שורות","summary":"תקציר","title":"××פייני טבלה","toolbar":"טבלה","widthPc":"×חוז","widthPx":"פיקסלי×","widthUnit":"יחידת רוחב"},"undo":{"redo":"חזרה על צעד ×חרון","undo":"ביטול צעד ×חרון"},"wsc":{"btnIgnore":"התעל×ות","btnIgnoreAll":"התעל×ות ×הכל","btnReplace":"החלפה","btnReplaceAll":"החלפת הכל","btnUndo":"החזרה","changeTo":"שינוי ל","errorLoading":"שגי××” בהעל×ת השירות: %s.","ieSpellDownload":"בודק ×”×יות ×œ× ×ותקן, ×”×× ×œ×”×•×¨×™×“×•?","manyChanges":"בדיקות ×יות הסתיי××”: %1 ××™×œ×™× ×©×•× ×•","noChanges":"בדיקות ×יות הסתיי××”: ×œ× ×©×•× ×ª×” ××£ ×ילה","noMispell":"בדיקות ×יות הסתיי××”: ×œ× × ×צ×ו שגי×ות כתיב","noSuggestions":"- ×ין הצעות -","notAvailable":"×œ× × ××¦× ×©×™×¨×•×ª ×–×ין.","notInDic":"×œ× × ××¦× ×‘×ילון","oneChange":"בדיקות ×יות הסתיי××”: שונתה ×ילה ×חת","progress":"בודק ×”×יות ×‘×ª×”×œ×™× ×‘×“×™×§×”....","title":"בדיקת ×יות","toolbar":"בדיקת ×יות"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/hi.js b/js/ckeditor/lang/hi.js
new file mode 100644
index 0000000..521181d
--- /dev/null
+++ b/js/ckeditor/lang/hi.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['hi']={"editor":"रिठटेकà¥à¤¸à¥à¤Ÿ à¤à¤¡à¤¿à¤Ÿà¤°","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"मदद के लिये ALT 0 दबाà¤","browseServer":"सरà¥à¤µà¤° बà¥à¤°à¤¾à¤‰à¥› करें","url":"URL","protocol":"पà¥à¤°à¥‹à¤Ÿà¥‹à¤•à¥‰à¤²","upload":"अपलोड","uploadSubmit":"इसे सरà¥à¤µà¤° को भेजें","image":"तसà¥à¤µà¥€à¤°","flash":"à¥à¥à¤²à¥ˆà¤¶","form":"à¥à¥‰à¤°à¥à¤®","checkbox":"à¤à¥…क बॉकà¥à¤¸","radio":"रेडिओ बटन","textField":"टेकà¥à¤¸à¥à¤Ÿ à¥à¥€à¤²à¥à¤¡","textarea":"टेकà¥à¤¸à¥à¤Ÿ à¤à¤°à¤¿à¤¯à¤¾","hiddenField":"गà¥à¤ªà¥à¤¤ à¥à¥€à¤²à¥à¤¡","button":"बटन","select":"à¤à¥à¤¨à¤¾à¤µ à¥à¥€à¤²à¥à¤¡","imageButton":"तसà¥à¤µà¥€à¤° बटन","notSet":"<सॅट नहीं>","id":"Id","name":"नाम","langDir":"भाषा लिखने की दिशा","langDirLtr":"बायें से दायें (LTR)","langDirRtl":"दायें से बायें (RTL)","langCode":"भाषा कोड","longDescr":"अधिक विवरण के लिठURL","cssClass":"सà¥à¤Ÿà¤¾à¤‡à¤²-शीट कà¥à¤²à¤¾à¤¸","advisoryTitle":"परामरà¥à¤¶ शीरà¥à¤¶à¤•","cssStyle":"सà¥à¤Ÿà¤¾à¤‡à¤²","ok":"ठीक है","cancel":"रदà¥à¤¦ करें","close":"Close","preview":"पà¥à¤°à¥€à¤µà¥à¤¯à¥‚","resize":"Resize","generalTab":"सामानà¥à¤¯","advancedTab":"à¤à¤¡à¥à¤µà¤¾à¤¨à¥à¤¸à¥à¤¡","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":"टारà¥à¤—ेट","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"बायें से दायें (LTR)","langDirRTL":"दायें से बायें (RTL)","styles":"सà¥à¤Ÿà¤¾à¤‡à¤²","cssClasses":"सà¥à¤Ÿà¤¾à¤‡à¤²-शीट कà¥à¤²à¤¾à¤¸","width":"à¤à¥Œà¥œà¤¾à¤ˆ","height":"à¤à¤à¤à¤¾à¤ˆ","align":"à¤à¤²à¤¾à¤‡à¤¨","alignLeft":"दायें","alignRight":"दायें","alignCenter":"बीठमें","alignJustify":"बà¥à¤²à¥‰à¤• जसà¥à¤Ÿà¥€à¥à¤¾à¤ˆ","alignTop":"à¤à¤ªà¤°","alignMiddle":"मधà¥à¤¯","alignBottom":"नीà¤à¥‡","alignNone":"None","invalidValue":"Invalid value.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","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>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"बोलà¥à¤¡","italic":"इटैलिक","strike":"सà¥à¤Ÿà¥à¤°à¤¾à¤‡à¤• थà¥à¤°à¥‚","subscript":"अधोलेख","superscript":"अभिलेख","underline":"रेखांकण"},"blockquote":{"toolbar":"बà¥à¤²à¥‰à¤•-कोट"},"clipboard":{"copy":"कॉपी","copyError":"आपके बà¥à¤°à¤¾à¤†à¤‰à¥›à¤° की सà¥à¤°à¤•à¥à¤·à¤¾ सॅटिनà¥à¤—à¥à¤¸ ने कॉपी करने की अनà¥à¤®à¤¤à¤¿ नहीं पà¥à¤°à¤¦à¤¾à¤¨ की है। (Ctrl/Cmd+C) का पà¥à¤°à¤¯à¥‹à¤— करें।","cut":"कट","cutError":"आपके बà¥à¤°à¤¾à¤‰à¥›à¤° की सà¥à¤°à¤•à¥à¤·à¤¾ सॅटिनà¥à¤—à¥à¤¸ ने कट करने की अनà¥à¤®à¤¤à¤¿ नहीं पà¥à¤°à¤¦à¤¾à¤¨ की है। (Ctrl/Cmd+X) का पà¥à¤°à¤¯à¥‹à¤— करें।","paste":"पेसà¥à¤Ÿ","pasteArea":"Paste Area","pasteMsg":"Ctrl/Cmd+V का पà¥à¤°à¤¯à¥‹à¤— करके पेसà¥à¤Ÿ करें और ठीक है करें.","securityMsg":"आपके बà¥à¤°à¤¾à¤‰à¥›à¤° की सà¥à¤°à¤•à¥à¤·à¤¾ आपके बà¥à¤°à¤¾à¤‰à¥›à¤° की सà¥à¤°Kश सैटिंग के कारण, à¤à¤¡à¤¿à¤Ÿà¤° आपके कà¥à¤²à¤¿à¤ªà¤¬à¥‹à¤°à¥à¤¡ डेटा को नहीं पा सकता है. आपको उसे इस विनà¥à¤¡à¥‹ में दोबारा पेसà¥à¤Ÿ करना होगा.","title":"पेसà¥à¤Ÿ"},"contextmenu":{"options":"Context Menu Options"},"button":{"selectedLabel":"%1 (Selected)"},"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":"à¤à¤¡à¤¿à¤Ÿà¤° टूलबार"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"format":{"label":"à¥à¥‰à¤°à¥à¤®à¥ˆà¤Ÿ","panelTitle":"à¥à¥‰à¤°à¥à¤®à¥ˆà¤Ÿ","tag_address":"पता","tag_div":"शीरà¥à¤·à¤• (DIV)","tag_h1":"शीरà¥à¤·à¤• 1","tag_h2":"शीरà¥à¤·à¤• 2","tag_h3":"शीरà¥à¤·à¤• 3","tag_h4":"शीरà¥à¤·à¤• 4","tag_h5":"शीरà¥à¤·à¤• 5","tag_h6":"शीरà¥à¤·à¤• 6","tag_p":"साधारण","tag_pre":"à¥à¥‰à¤°à¥à¤®à¥ˆà¤Ÿà¥…ड"},"horizontalrule":{"toolbar":"हॉरिज़ॉनà¥à¤Ÿà¤² रेखा इनà¥à¤¸à¤°à¥à¤Ÿ करें"},"image":{"alertUrl":"तसà¥à¤µà¥€à¤° का URL टाइप करें ","alt":"वैकलà¥à¤ªà¤¿à¤• टेकà¥à¤¸à¥à¤Ÿ","border":"बॉरà¥à¤¡à¤°","btnUpload":"इसे सरà¥à¤µà¤° को भेजें","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"हॉरिज़ॉनà¥à¤Ÿà¤² सà¥à¤ªà¥‡à¤¸","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"तसà¥à¤µà¥€à¤° की जानकारी","linkTab":"लिंक","lockRatio":"लॉक अनà¥à¤ªà¤¾à¤¤","menu":"तसà¥à¤µà¥€à¤° पà¥à¤°à¥‰à¤ªà¤°à¥à¤Ÿà¥€à¥›","resetSize":"रीसॅट साइज़","title":"तसà¥à¤µà¥€à¤° पà¥à¤°à¥‰à¤ªà¤°à¥à¤Ÿà¥€à¥›","titleButton":"तसà¥à¤µà¥€à¤° बटन पà¥à¤°à¥‰à¤ªà¤°à¥à¤Ÿà¥€à¥›","upload":"अपलोड","urlMissing":"Image source URL is missing.","vSpace":"वरà¥à¤Ÿà¤¿à¤•à¤² सà¥à¤ªà¥‡à¤¸","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"indent":{"indent":"इनà¥à¤¡à¥…नà¥à¤Ÿ बà¥à¤¾à¤¯à¥‡à¤‚","outdent":"इनà¥à¤¡à¥…नà¥à¤Ÿ कम करें"},"fakeobjects":{"anchor":"à¤à¤‚कर इनà¥à¤¸à¤°à¥à¤Ÿ/संपादन","flash":"Flash Animation","hiddenfield":"गà¥à¤ªà¥à¤¤ à¥à¥€à¤²à¥à¤¡","iframe":"IFrame","unknown":"Unknown Object"},"link":{"acccessKey":"à¤à¤•à¥à¤¸à¥…स की","advanced":"à¤à¤¡à¥à¤µà¤¾à¤¨à¥à¤¸à¥à¤¡","advisoryContentType":"परामरà¥à¤¶ कनà¥à¤Ÿà¥…नà¥à¤Ÿ पà¥à¤°à¤•à¤¾à¤°","advisoryTitle":"परामरà¥à¤¶ शीरà¥à¤¶à¤•","anchor":{"toolbar":"à¤à¤‚कर इनà¥à¤¸à¤°à¥à¤Ÿ/संपादन","menu":"à¤à¤‚कर पà¥à¤°à¥‰à¤ªà¤°à¥à¤Ÿà¥€à¥›","title":"à¤à¤‚कर पà¥à¤°à¥‰à¤ªà¤°à¥à¤Ÿà¥€à¥›","name":"à¤à¤‚कर का नाम","errorName":"à¤à¤‚कर का नाम टाइप करें","remove":"Remove Anchor"},"anchorId":"à¤à¤²à¥€à¤®à¥…नà¥à¤Ÿ Id से","anchorName":"à¤à¤‚कर नाम से","charset":"लिंक रिसोरà¥à¤¸ करॅकà¥à¤Ÿà¤° सॅट","cssClasses":"सà¥à¤Ÿà¤¾à¤‡à¤²-शीट कà¥à¤²à¤¾à¤¸","emailAddress":"ई-मेल पता","emailBody":"संदेश","emailSubject":"संदेश विषय","id":"Id","info":"लिंक ","langCode":"भाषा लिखने की दिशा","langDir":"भाषा लिखने की दिशा","langDirLTR":"बायें से दायें (LTR)","langDirRTL":"दायें से बायें (RTL)","menu":"लिंक संपादन","name":"नाम","noAnchors":"(डॉकà¥à¤¯à¥‚मॅनà¥à¤Ÿ में à¤à¤‚करà¥à¤¸ की संखà¥à¤¯à¤¾)","noEmail":"ई-मेल पता टाइप करें","noUrl":"लिंक URL टाइप करें","other":"<अनà¥à¤¯>","popupDependent":"डिपेनà¥à¤¡à¥…नà¥à¤Ÿ (Netscape)","popupFeatures":"पॉप-अप विनà¥à¤¡à¥‹ à¥à¥€à¤à¤°à¥à¤¸","popupFullScreen":"à¥à¥à¤² सà¥à¤•à¥à¤°à¥€à¤¨ (IE)","popupLeft":"बायीं तरफ","popupLocationBar":"लोकेशन बार","popupMenuBar":"मॅनà¥à¤¯à¥‚ बार","popupResizable":"आकार बदलने लायक","popupScrollBars":"सà¥à¤•à¥à¤°à¥‰à¤² बार","popupStatusBar":"सà¥à¤Ÿà¥‡à¤Ÿà¤¸ बार","popupToolbar":"टूल बार","popupTop":"दायीं तरफ","rel":"संबंध","selectAnchor":"à¤à¤‚कर à¤à¥à¤¨à¥‡à¤‚","styles":"सà¥à¤Ÿà¤¾à¤‡à¤²","tabIndex":"टैब इनà¥à¤¡à¥…कà¥à¤¸","target":"टारà¥à¤—ेट","targetFrame":"<à¥à¥à¤°à¥‡à¤®>","targetFrameName":"टारà¥à¤—ेट à¥à¥à¤°à¥‡à¤® का नाम","targetPopup":"<पॉप-अप विनà¥à¤¡à¥‹>","targetPopupName":"पॉप-अप विनà¥à¤¡à¥‹ का नाम","title":"लिंक","toAnchor":"इस पेज का à¤à¤‚कर","toEmail":"ई-मेल","toUrl":"URL","toolbar":"लिंक इनà¥à¤¸à¤°à¥à¤Ÿ/संपादन","type":"लिंक पà¥à¤°à¤•à¤¾à¤°","unlink":"लिंक हटायें","upload":"अपलोड"},"list":{"bulletedlist":"बà¥à¤²à¥…ट सूà¤à¥€","numberedlist":"अंकीय सूà¤à¥€"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"मेकà¥à¤¸à¤¿à¤®à¤¾à¤ˆà¤œà¤¼","minimize":"मिनिमाईज़"},"pastetext":{"button":"पेसà¥à¤Ÿ (सादा टॅकà¥à¤¸à¥à¤Ÿ)","title":"पेसà¥à¤Ÿ (सादा टॅकà¥à¤¸à¥à¤Ÿ)"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"पेसà¥à¤Ÿ (वरà¥à¤¡ से)","toolbar":"पेसà¥à¤Ÿ (वरà¥à¤¡ से)"},"removeformat":{"toolbar":"à¥à¥‰à¤°à¥à¤®à¥ˆà¤Ÿ हटायें"},"sourcearea":{"toolbar":"सोरà¥à¤¸"},"specialchar":{"options":"विशेष à¤à¤°à¤¿à¤¤à¥à¤° विकलà¥à¤ª","title":"विशेष करॅकà¥à¤Ÿà¤° à¤à¥à¤¨à¥‡à¤‚","toolbar":"विशेष करॅकà¥à¤Ÿà¤° इनà¥à¤¸à¤°à¥à¤Ÿ करें"},"scayt":{"btn_about":"About SCAYT","btn_dictionaries":"Dictionaries","btn_disable":"Disable SCAYT","btn_enable":"Enable SCAYT","btn_langs":"Languages","btn_options":"Options","text_title":"Spell Check As You Type"},"stylescombo":{"label":"सà¥à¤Ÿà¤¾à¤‡à¤²","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"बॉरà¥à¤¡à¤° साइज़","caption":"शीरà¥à¤·à¤•","cell":{"menu":"खाना","insertBefore":"पहले सैल डालें","insertAfter":"बाद में सैल डालें","deleteCell":"सैल डिलीट करें","merge":"सैल मिलायें","mergeRight":"बाà¤à¤¯à¤¾ विलय","mergeDown":"नीà¤à¥‡ विलय करें","splitHorizontal":"सैल को कà¥à¤·à¥ˆà¤¤à¤¿à¤œ सà¥à¤¥à¤¿à¤¤à¤¿ में विभाजित करें","splitVertical":"सैल को लमà¥à¤¬à¤¾à¤•à¤¾à¤° में विभाजित करें","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":"सैल पैडिंग","cellSpace":"सैल अंतर","column":{"menu":"कालम","insertBefore":"पहले कालम डालें","insertAfter":"बाद में कालम डालें","deleteColumn":"कालम डिलीट करें"},"columns":"कालम","deleteTable":"टेबल डिलीट करें","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":"टेबल पà¥à¤°à¥‰à¤ªà¤°à¥à¤Ÿà¥€à¥›","row":{"menu":"पंकà¥à¤¤à¤¿","insertBefore":"पहले पंकà¥à¤¤à¤¿ डालें","insertAfter":"बाद में पंकà¥à¤¤à¤¿ डालें","deleteRow":"पंकà¥à¤¤à¤¿à¤¯à¤¾à¤ डिलीट करें"},"rows":"पंकà¥à¤¤à¤¿à¤¯à¤¾à¤","summary":"सारांश","title":"टेबल पà¥à¤°à¥‰à¤ªà¤°à¥à¤Ÿà¥€à¥›","toolbar":"टेबल","widthPc":"पà¥à¤°à¤¤à¤¿à¤¶à¤¤","widthPx":"पिकà¥à¤¸à¥ˆà¤²","widthUnit":"width unit"},"undo":{"redo":"रीडू","undo":"अनà¥à¤¡à¥‚"},"wsc":{"btnIgnore":"इगà¥à¤¨à¥‹à¤°","btnIgnoreAll":"सभी इगà¥à¤¨à¥‹à¤° करें","btnReplace":"रिपà¥à¤²à¥‡à¤¸","btnReplaceAll":"सभी रिपà¥à¤²à¥‡à¤¸ करें","btnUndo":"अनà¥à¤¡à¥‚","changeTo":"इसमें बदलें","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"सà¥à¤ªà¥…ल-à¤à¥…कर इनà¥à¤¸à¥à¤Ÿà¤¾à¤² नहीं किया गया है। कà¥à¤¯à¤¾ आप इसे डाउनलोड करना à¤à¤¾à¤¹à¥‡à¤‚गे?","manyChanges":"वरà¥à¤¤à¤¨à¥€ की जाà¤à¤ : %1 शबà¥à¤¦ बदले गये","noChanges":"वरà¥à¤¤à¤¨à¥€ की जाà¤à¤ :कोई शबà¥à¤¦ नहीं बदला गया","noMispell":"वरà¥à¤¤à¤¨à¥€ की जाà¤à¤ : कोई गलत वरà¥à¤¤à¤¨à¥€ (सà¥à¤ªà¥…लिंग) नहीं पाई गई","noSuggestions":"- कोई सà¥à¤à¤¾à¤µ नहीं -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"शबà¥à¤¦à¤•à¥‹à¤¶ में नहीं","oneChange":"वरà¥à¤¤à¤¨à¥€ की जाà¤à¤ : à¤à¤• शबà¥à¤¦ बदला गया","progress":"वरà¥à¤¤à¤¨à¥€ की जाà¤à¤ (सà¥à¤ªà¥…ल-à¤à¥…क) जारी है...","title":"Spell Checker","toolbar":"वरà¥à¤¤à¤¨à¥€ (सà¥à¤ªà¥‡à¤²à¤¿à¤‚ग) जाà¤à¤"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/hr.js b/js/ckeditor/lang/hr.js
new file mode 100644
index 0000000..b785cae
--- /dev/null
+++ b/js/ckeditor/lang/hr.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['hr']={"editor":"Bogati ureÄ‘ivaÄ teksta, %1","editorPanel":"PloÄa Bogatog UreÄ‘ivaÄa Teksta","common":{"editorHelp":"Pritisni ALT 0 za pomoć","browseServer":"Pretraži server","url":"URL","protocol":"Protokol","upload":"PoÅ¡alji","uploadSubmit":"PoÅ¡alji na server","image":"Slika","flash":"Flash","form":"Forma","checkbox":"Checkbox","radio":"Radio Button","textField":"Text Field","textarea":"Textarea","hiddenField":"Hidden Field","button":"Button","select":"Selection Field","imageButton":"Image Button","notSet":"<nije postavljeno>","id":"Id","name":"Naziv","langDir":"Smjer jezika","langDirLtr":"S lijeva na desno (LTR)","langDirRtl":"S desna na lijevo (RTL)","langCode":"KĂ´d jezika","longDescr":"DugaÄki opis URL","cssClass":"Klase stilova","advisoryTitle":"Advisory naslov","cssStyle":"Stil","ok":"OK","cancel":"PoniÅ¡ti","close":"Zatvori","preview":"Pregledaj","resize":"Povuci za promjenu veliÄine","generalTab":"Općenito","advancedTab":"Napredno","validateNumberFailed":"Ova vrijednost nije broj.","confirmNewPage":"Sve napravljene promjene će biti izgubljene ukoliko ih niste snimili. Sigurno želite uÄitati novu stranicu?","confirmCancel":"Neke od opcija su promjenjene. Sigurno želite zatvoriti ovaj prozor?","options":"Opcije","target":"OdrediÅ¡te","targetNew":"Novi prozor (_blank)","targetTop":"VrÅ¡ni prozor (_top)","targetSelf":"Isti prozor (_self)","targetParent":"Roditeljski prozor (_parent)","langDirLTR":"S lijeva na desno (LTR)","langDirRTL":"S desna na lijevo (RTL)","styles":"Stil","cssClasses":"Klase stilova","width":"Å irina","height":"Visina","align":"Poravnanje","alignLeft":"Lijevo","alignRight":"Desno","alignCenter":"SrediÅ¡nje","alignJustify":"Blok poravnanje","alignTop":"Vrh","alignMiddle":"Sredina","alignBottom":"Dolje","alignNone":"None","invalidValue":"Neispravna vrijednost.","invalidHeight":"Visina mora biti broj.","invalidWidth":"Å irina mora biti broj.","invalidCssLength":"Vrijednost odreÄ‘ena za \"%1\" polje mora biti pozitivni broj sa ili bez važećih CSS mjernih jedinica (px, %, in, cm, mm, em, ex, pt ili pc).","invalidHtmlLength":"Vrijednost odreÄ‘ena za \"%1\" polje mora biti pozitivni broj sa ili bez važećih HTML mjernih jedinica (px ili %).","invalidInlineStyle":"Vrijednost za linijski stil mora sadržavati jednu ili viÅ¡e definicija s formatom \"naziv:vrijednost\", odvojenih toÄka-zarezom.","cssLengthTooltip":"Unesite broj za vrijednost u pikselima ili broj s važećim CSS mjernim jedinicama (px, %, in, cm, mm, em, ex, pt ili pc).","unavailable":"%1<span class=\"cke_accessibility\">, nedostupno</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"O CKEditoru","help":"Provjeri $1 za pomoć.","moreInfo":"Za informacije o licencama posjetite naÅ¡u web stranicu:","title":"O CKEditoru","userGuide":"VodiÄ za CKEditor korisnike"},"basicstyles":{"bold":"Podebljaj","italic":"Ukosi","strike":"Precrtano","subscript":"Subscript","superscript":"Superscript","underline":"Potcrtano"},"blockquote":{"toolbar":"Blockquote"},"clipboard":{"copy":"Kopiraj","copyError":"Sigurnosne postavke VaÅ¡eg pretraživaÄa ne dozvoljavaju operacije automatskog kopiranja. Molimo koristite kraticu na tipkovnici (Ctrl/Cmd+C).","cut":"Izreži","cutError":"Sigurnosne postavke VaÅ¡eg pretraživaÄa ne dozvoljavaju operacije automatskog izrezivanja. Molimo koristite kraticu na tipkovnici (Ctrl/Cmd+X).","paste":"Zalijepi","pasteArea":"Prostor za ljepljenje","pasteMsg":"Molimo zaljepite unutar doljnjeg okvira koristeći tipkovnicu (<STRONG>Ctrl/Cmd+V</STRONG>) i kliknite <STRONG>OK</STRONG>.","securityMsg":"Zbog sigurnosnih postavki VaÅ¡eg pretraživaÄa, editor nema direktan pristup VaÅ¡em meÄ‘uspremniku. Potrebno je ponovno zalijepiti tekst u ovaj prozor.","title":"Zalijepi"},"contextmenu":{"options":"Opcije izbornika"},"button":{"selectedLabel":"%1 (Selected)"},"toolbar":{"toolbarCollapse":"Smanji alatnu traku","toolbarExpand":"ProÅ¡iri alatnu traku","toolbarGroups":{"document":"Dokument","clipboard":"MeÄ‘uspremnik/PoniÅ¡ti","editing":"UreÄ‘ivanje","forms":"Forme","basicstyles":"Osnovni stilovi","paragraph":"Paragraf","links":"Veze","insert":"Umetni","styles":"Stilovi","colors":"Boje","tools":"Alatke"},"toolbars":"Alatne trake ureÄ‘ivaÄa teksta"},"elementspath":{"eleLabel":"Putanja elemenata","eleTitle":"%1 element"},"format":{"label":"Format","panelTitle":"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":"Formatirano"},"horizontalrule":{"toolbar":"Ubaci vodoravnu liniju"},"image":{"alertUrl":"Unesite URL slike","alt":"Alternativni tekst","border":"Okvir","btnUpload":"PoÅ¡alji na server","button2Img":"Želite li promijeniti odabrani gumb u jednostavnu sliku?","hSpace":"HSpace","img2Button":"Želite li promijeniti odabranu sliku u gumb?","infoTab":"Info slike","linkTab":"Link","lockRatio":"ZakljuÄaj odnos","menu":"Svojstva slika","resetSize":"ObriÅ¡i veliÄinu","title":"Svojstva slika","titleButton":"Image Button svojstva","upload":"PoÅ¡alji","urlMissing":"Nedostaje URL slike.","vSpace":"VSpace","validateBorder":"Okvir mora biti cijeli broj.","validateHSpace":"HSpace mora biti cijeli broj","validateVSpace":"VSpace mora biti cijeli broj."},"indent":{"indent":"Pomakni udesno","outdent":"Pomakni ulijevo"},"fakeobjects":{"anchor":"Sidro","flash":"Flash animacija","hiddenfield":"Sakriveno polje","iframe":"IFrame","unknown":"Nepoznati objekt"},"link":{"acccessKey":"Pristupna tipka","advanced":"Napredno","advisoryContentType":"Advisory vrsta sadržaja","advisoryTitle":"Advisory naslov","anchor":{"toolbar":"Ubaci/promijeni sidro","menu":"Svojstva sidra","title":"Svojstva sidra","name":"Ime sidra","errorName":"Molimo unesite ime sidra","remove":"Ukloni sidro"},"anchorId":"Po Id elementa","anchorName":"Po nazivu sidra","charset":"Kodna stranica povezanih resursa","cssClasses":"Stylesheet klase","emailAddress":"E-Mail adresa","emailBody":"Sadržaj poruke","emailSubject":"Naslov","id":"Id","info":"Link Info","langCode":"Smjer jezika","langDir":"Smjer jezika","langDirLTR":"S lijeva na desno (LTR)","langDirRTL":"S desna na lijevo (RTL)","menu":"Promijeni link","name":"Naziv","noAnchors":"(Nema dostupnih sidra)","noEmail":"Molimo upiÅ¡ite e-mail adresu","noUrl":"Molimo upiÅ¡ite URL link","other":"<drugi>","popupDependent":"Ovisno (Netscape)","popupFeatures":"Mogućnosti popup prozora","popupFullScreen":"Cijeli ekran (IE)","popupLeft":"Lijeva pozicija","popupLocationBar":"Traka za lokaciju","popupMenuBar":"Izborna traka","popupResizable":"Promjenjiva veliÄina","popupScrollBars":"Scroll traka","popupStatusBar":"Statusna traka","popupToolbar":"Traka s alatima","popupTop":"Gornja pozicija","rel":"Veza","selectAnchor":"Odaberi sidro","styles":"Stil","tabIndex":"Tab Indeks","target":"Meta","targetFrame":"<okvir>","targetFrameName":"Ime ciljnog okvira","targetPopup":"<popup prozor>","targetPopupName":"Naziv popup prozora","title":"Link","toAnchor":"Sidro na ovoj stranici","toEmail":"E-Mail","toUrl":"URL","toolbar":"Ubaci/promijeni link","type":"Link vrsta","unlink":"Ukloni link","upload":"PoÅ¡alji"},"list":{"bulletedlist":"ObiÄna lista","numberedlist":"BrojÄana lista"},"magicline":{"title":"Ubaci paragraf ovdje"},"maximize":{"maximize":"Povećaj","minimize":"Smanji"},"pastetext":{"button":"Zalijepi kao Äisti tekst","title":"Zalijepi kao Äisti tekst"},"pastefromword":{"confirmCleanup":"Tekst koji želite zalijepiti Äini se da je kopiran iz Worda. Želite li prije oÄistiti tekst?","error":"Nije moguće oÄistiti podatke za ljepljenje zbog interne greÅ¡ke","title":"Zalijepi iz Worda","toolbar":"Zalijepi iz Worda"},"removeformat":{"toolbar":"Ukloni formatiranje"},"sourcearea":{"toolbar":"KĂ´d"},"specialchar":{"options":"Opcije specijalnih znakova","title":"Odaberite posebni karakter","toolbar":"Ubaci posebne znakove"},"scayt":{"btn_about":"O SCAYT","btn_dictionaries":"RjeÄnici","btn_disable":"Onemogući SCAYT","btn_enable":"Omogući SCAYT","btn_langs":"Jezici","btn_options":"Opcije","text_title":"Provjeri pravopis tijekom tipkanja (SCAYT)"},"stylescombo":{"label":"Stil","panelTitle":"Stilovi formatiranja","panelTitle1":"Block stilovi","panelTitle2":"Inline stilovi","panelTitle3":"Object stilovi"},"table":{"border":"VeliÄina okvira","caption":"Naslov","cell":{"menu":"Ćelija","insertBefore":"Ubaci ćeliju prije","insertAfter":"Ubaci ćeliju poslije","deleteCell":"IzbriÅ¡i ćelije","merge":"Spoji ćelije","mergeRight":"Spoji desno","mergeDown":"Spoji dolje","splitHorizontal":"Podijeli ćeliju vodoravno","splitVertical":"Podijeli ćeliju okomito","title":"Svojstva ćelije","cellType":"Vrsta ćelije","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Prelazak u novi red","hAlign":"Vodoravno poravnanje","vAlign":"Okomito poravnanje","alignBaseline":"Osnovna linija","bgColor":"Boja pozadine","borderColor":"Boja ruba","data":"Podatak","header":"Zaglavlje","yes":"Da","no":"ne","invalidWidth":"Å irina ćelije mora biti broj.","invalidHeight":"Visina ćelije mora biti broj.","invalidRowSpan":"Rows span mora biti cijeli broj.","invalidColSpan":"Columns span mora biti cijeli broj.","chooseColor":"Odaberi"},"cellPad":"Razmak ćelija","cellSpace":"Prostornost ćelija","column":{"menu":"Kolona","insertBefore":"Ubaci kolonu prije","insertAfter":"Ubaci kolonu poslije","deleteColumn":"IzbriÅ¡i kolone"},"columns":"Kolona","deleteTable":"IzbriÅ¡i tablicu","headers":"Zaglavlje","headersBoth":"Oba","headersColumn":"Prva kolona","headersNone":"NiÅ¡ta","headersRow":"Prvi red","invalidBorder":"Debljina ruba mora biti broj.","invalidCellPadding":"Razmak ćelija mora biti broj.","invalidCellSpacing":"Prostornost ćelija mora biti broj.","invalidCols":"Broj kolona mora biti broj veći od 0.","invalidHeight":"Visina tablice mora biti broj.","invalidRows":"Broj redova mora biti broj veći od 0.","invalidWidth":"Å irina tablice mora biti broj.","menu":"Svojstva tablice","row":{"menu":"Red","insertBefore":"Ubaci red prije","insertAfter":"Ubaci red poslije","deleteRow":"IzbriÅ¡i redove"},"rows":"Redova","summary":"Sažetak","title":"Svojstva tablice","toolbar":"Tablica","widthPc":"postotaka","widthPx":"piksela","widthUnit":"jedinica Å¡irine"},"undo":{"redo":"Ponovi","undo":"PoniÅ¡ti"},"wsc":{"btnIgnore":"Zanemari","btnIgnoreAll":"Zanemari sve","btnReplace":"Zamijeni","btnReplaceAll":"Zamijeni sve","btnUndo":"Vrati","changeTo":"Promijeni u","errorLoading":"GreÅ¡ka uÄitavanja aplikacije: %s.","ieSpellDownload":"Provjera pravopisa nije instalirana. Želite li skinuti provjeru pravopisa?","manyChanges":"Provjera zavrÅ¡ena: Promijenjeno %1 rijeÄi","noChanges":"Provjera zavrÅ¡ena: Nije napravljena promjena","noMispell":"Provjera zavrÅ¡ena: Nema greÅ¡aka","noSuggestions":"-Nema preporuke-","notAvailable":"Žao nam je, ali usluga trenutno nije dostupna.","notInDic":"Nije u rjeÄniku","oneChange":"Provjera zavrÅ¡ena: Jedna rijeÄ promjenjena","progress":"Provjera u tijeku...","title":"Provjera pravopisa","toolbar":"Provjeri pravopis"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/hu.js b/js/ckeditor/lang/hu.js
new file mode 100644
index 0000000..4650677
--- /dev/null
+++ b/js/ckeditor/lang/hu.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['hu']={"editor":"HTML szerkesztÅ‘","editorPanel":"Rich Text szerkesztÅ‘ panel","common":{"editorHelp":"SegĂ­tsĂ©gĂ©rt nyomjon ALT 0","browseServer":"BöngĂ©szĂ©s a szerveren","url":"HivatkozĂ¡s","protocol":"Protokoll","upload":"FeltöltĂ©s","uploadSubmit":"KĂ¼ldĂ©s a szerverre","image":"KĂ©p","flash":"Flash","form":"Å°rlap","checkbox":"JelölÅ‘nĂ©gyzet","radio":"VĂ¡lasztĂ³gomb","textField":"SzövegmezÅ‘","textarea":"SzövegterĂ¼let","hiddenField":"RejtettmezÅ‘","button":"Gomb","select":"LegördĂ¼lÅ‘ lista","imageButton":"KĂ©pgomb","notSet":"<nincs beĂ¡llĂ­tva>","id":"AzonosĂ­tĂ³","name":"NĂ©v","langDir":"ĂrĂ¡s irĂ¡nya","langDirLtr":"BalrĂ³l jobbra","langDirRtl":"JobbrĂ³l balra","langCode":"Nyelv kĂ³dja","longDescr":"RĂ©szletes leĂ­rĂ¡s webcĂ­me","cssClass":"StĂ­luskĂ©szlet","advisoryTitle":"SĂºgĂ³cimke","cssStyle":"StĂ­lus","ok":"Rendben","cancel":"MĂ©gsem","close":"BezĂ¡rĂ¡s","preview":"ElÅ‘nĂ©zet","resize":"HĂºzza az Ă¡tmĂ©retezĂ©shez","generalTab":"ĂltalĂ¡nos","advancedTab":"TovĂ¡bbi opciĂ³k","validateNumberFailed":"A mezÅ‘be csak szĂ¡mokat Ă­rhat.","confirmNewPage":"Minden nem mentett vĂ¡ltozĂ¡s el fog veszni! Biztosan be szeretnĂ© tölteni az oldalt?","confirmCancel":"Az űrlap tartalma megvĂ¡ltozott, Ă¡m a vĂ¡ltozĂ¡sokat nem rögzĂ­tette. Biztosan be szeretnĂ© zĂ¡rni az űrlapot?","options":"BeĂ¡llĂ­tĂ¡sok","target":"CĂ©l","targetNew":"Ăj ablak (_blank)","targetTop":"LegfelsÅ‘ ablak (_top)","targetSelf":"AktuĂ¡lis ablakban (_self)","targetParent":"SzĂ¼lÅ‘ ablak (_parent)","langDirLTR":"BalrĂ³l jobbra (LTR)","langDirRTL":"JobbrĂ³l balra (RTL)","styles":"StĂ­lus","cssClasses":"StĂ­luslap osztĂ¡ly","width":"SzĂ©lessĂ©g","height":"MagassĂ¡g","align":"IgazĂ­tĂ¡s","alignLeft":"Bal","alignRight":"Jobbra","alignCenter":"KözĂ©pre","alignJustify":"SorkizĂ¡rt","alignTop":"TetejĂ©re","alignMiddle":"KözĂ©pre","alignBottom":"AljĂ¡ra","alignNone":"None","invalidValue":"ÉrvĂ©nytelen Ă©rtĂ©k.","invalidHeight":"A magassĂ¡g mezÅ‘be csak szĂ¡mokat Ă­rhat.","invalidWidth":"A szĂ©lessĂ©g mezÅ‘be csak szĂ¡mokat Ă­rhat.","invalidCssLength":"\"%1\"-hez megadott Ă©rtĂ©k csakis egy pozitĂ­v szĂ¡m lehet, esetleg egy Ă©rvĂ©nyes CSS egysĂ©ggel megjelölve(px, %, in, cm, mm, em, ex, pt vagy pc).","invalidHtmlLength":"\"%1\"-hez megadott Ă©rtĂ©k csakis egy pozitĂ­v szĂ¡m lehet, esetleg egy Ă©rvĂ©nyes HTML egysĂ©ggel megjelölve(px vagy %).","invalidInlineStyle":"Az inline stĂ­lusnak megadott Ă©rtĂ©knek tartalmaznia kell egy vagy több rekordot a \"name : value\" formĂ¡tumban, pontosvesszÅ‘vel elvĂ¡lasztva.","cssLengthTooltip":"Adjon meg egy szĂ¡mot Ă©rtĂ©knek pixelekben vagy egy szĂ¡mot Ă©rvĂ©nyes CSS mĂ©rtĂ©kegysĂ©gben (px, %, in, cm, mm, em, ex, pt, vagy pc).","unavailable":"%1<span class=\"cke_accessibility\">, nem elĂ©rhetÅ‘</span>"},"about":{"copy":"Copyright &copy; $1. Minden jog fenntartva.","dlgTitle":"CKEditor nĂ©vjegy","help":"Itt talĂ¡lsz segĂ­tsĂ©get: $1","moreInfo":"LicenszelĂ©si informĂ¡ciĂ³kĂ©rt kĂ©rjĂ¼k lĂ¡togassa meg weboldalunkat:","title":"CKEditor nĂ©vjegy","userGuide":"CKEditor FelhasznĂ¡lĂ³i ĂºtmutatĂ³"},"basicstyles":{"bold":"FĂ©lkövĂ©r","italic":"DÅ‘lt","strike":"ĂthĂºzott","subscript":"AlsĂ³ index","superscript":"FelsÅ‘ index","underline":"AlĂ¡hĂºzott"},"blockquote":{"toolbar":"IdĂ©zet blokk"},"clipboard":{"copy":"MĂ¡solĂ¡s","copyError":"A böngĂ©szÅ‘ biztonsĂ¡gi beĂ¡llĂ­tĂ¡sai nem engedĂ©lyezik a szerkesztÅ‘nek, hogy vĂ©grehajtsa a mĂ¡solĂ¡s műveletet. HasznĂ¡lja az alĂ¡bbi billentyűkombinĂ¡ciĂ³t (Ctrl/Cmd+X).","cut":"KivĂ¡gĂ¡s","cutError":"A böngĂ©szÅ‘ biztonsĂ¡gi beĂ¡llĂ­tĂ¡sai nem engedĂ©lyezik a szerkesztÅ‘nek, hogy vĂ©grehajtsa a kivĂ¡gĂ¡s műveletet. HasznĂ¡lja az alĂ¡bbi billentyűkombinĂ¡ciĂ³t (Ctrl/Cmd+X).","paste":"BeillesztĂ©s","pasteArea":"BeszĂºrĂ¡s mezÅ‘","pasteMsg":"MĂ¡solja be az alĂ¡bbi mezÅ‘be a <STRONG>Ctrl/Cmd+V</STRONG> billentyűk lenyomĂ¡sĂ¡val, majd nyomjon <STRONG>Rendben</STRONG>-t.","securityMsg":"A böngĂ©szÅ‘ biztonsĂ¡gi beĂ¡llĂ­tĂ¡sai miatt a szerkesztÅ‘ nem kĂ©pes hozzĂ¡fĂ©rni a vĂ¡gĂ³lap adataihoz. Illeszd be Ăºjra ebben az ablakban.","title":"BeillesztĂ©s"},"contextmenu":{"options":"Helyi menĂ¼ opciĂ³k"},"button":{"selectedLabel":"%1 (KivĂ¡lasztva)"},"toolbar":{"toolbarCollapse":"EszköztĂ¡r összecsukĂ¡sa","toolbarExpand":"EszköztĂ¡r szĂ©tnyitĂ¡sa","toolbarGroups":{"document":"Dokumentum","clipboard":"VĂ¡gĂ³lap/VisszavonĂ¡s","editing":"SzerkesztĂ©s","forms":"Å°rlapok","basicstyles":"AlapstĂ­lusok","paragraph":"BekezdĂ©s","links":"HivatkozĂ¡sok","insert":"BeszĂºrĂ¡s","styles":"StĂ­lusok","colors":"SzĂ­nek","tools":"Eszközök"},"toolbars":"SzerkesztÅ‘ EszköztĂ¡r"},"elementspath":{"eleLabel":"Elem utak","eleTitle":"%1 elem"},"format":{"label":"FormĂ¡tum","panelTitle":"FormĂ¡tum","tag_address":"CĂ­msor","tag_div":"BekezdĂ©s (DIV)","tag_h1":"FejlĂ©c 1","tag_h2":"FejlĂ©c 2","tag_h3":"FejlĂ©c 3","tag_h4":"FejlĂ©c 4","tag_h5":"FejlĂ©c 5","tag_h6":"FejlĂ©c 6","tag_p":"NormĂ¡l","tag_pre":"FormĂ¡zott"},"horizontalrule":{"toolbar":"ElvĂ¡lasztĂ³vonal beillesztĂ©se"},"image":{"alertUrl":"Töltse ki a kĂ©p webcĂ­mĂ©t","alt":"BuborĂ©k szöveg","border":"Keret","btnUpload":"KĂ¼ldĂ©s a szerverre","button2Img":"A kivĂ¡lasztott kĂ©pgombbĂ³l sima kĂ©pet szeretne csinĂ¡lni?","hSpace":"VĂ­zsz. tĂ¡v","img2Button":"A kivĂ¡lasztott kĂ©pbÅ‘l kĂ©pgombot szeretne csinĂ¡lni?","infoTab":"AlaptulajdonsĂ¡gok","linkTab":"HivatkozĂ¡s","lockRatio":"ArĂ¡ny megtartĂ¡sa","menu":"KĂ©p tulajdonsĂ¡gai","resetSize":"Eredeti mĂ©ret","title":"KĂ©p tulajdonsĂ¡gai","titleButton":"KĂ©pgomb tulajdonsĂ¡gai","upload":"FeltöltĂ©s","urlMissing":"HiĂ¡nyzik a kĂ©p URL-je","vSpace":"FĂ¼gg. tĂ¡v","validateBorder":"A keret mĂ©retĂ©nek egĂ©sz szĂ¡mot kell beĂ­rni!","validateHSpace":"VĂ­zszintes tĂ¡volsĂ¡gnak egĂ©sz szĂ¡mot kell beĂ­rni!","validateVSpace":"FĂ¼ggÅ‘leges tĂ¡volsĂ¡gnak egĂ©sz szĂ¡mot kell beĂ­rni!"},"indent":{"indent":"BehĂºzĂ¡s növelĂ©se","outdent":"BehĂºzĂ¡s csökkentĂ©se"},"fakeobjects":{"anchor":"Horgony","flash":"Flash animĂ¡ciĂ³","hiddenfield":"Rejtett mezõ","iframe":"IFrame","unknown":"Ismeretlen objektum"},"link":{"acccessKey":"BillentyűkombinĂ¡ciĂ³","advanced":"TovĂ¡bbi opciĂ³k","advisoryContentType":"SĂºgĂ³ tartalomtĂ­pusa","advisoryTitle":"SĂºgĂ³cimke","anchor":{"toolbar":"Horgony beillesztĂ©se/szerkesztĂ©se","menu":"Horgony tulajdonsĂ¡gai","title":"Horgony tulajdonsĂ¡gai","name":"Horgony neve","errorName":"KĂ©rem adja meg a horgony nevĂ©t","remove":"Horgony eltĂ¡volĂ­tĂ¡sa"},"anchorId":"AzonosĂ­tĂ³ szerint","anchorName":"Horgony nĂ©v szerint","charset":"Hivatkozott tartalom kĂ³dlapja","cssClasses":"StĂ­luskĂ©szlet","emailAddress":"E-Mail cĂ­m","emailBody":"Ăœzenet","emailSubject":"Ăœzenet tĂ¡rgya","id":"Id","info":"AlaptulajdonsĂ¡gok","langCode":"ĂrĂ¡s irĂ¡nya","langDir":"ĂrĂ¡s irĂ¡nya","langDirLTR":"BalrĂ³l jobbra","langDirRTL":"JobbrĂ³l balra","menu":"HivatkozĂ¡s mĂ³dosĂ­tĂ¡sa","name":"NĂ©v","noAnchors":"(Nincs horgony a dokumentumban)","noEmail":"Adja meg az E-Mail cĂ­met","noUrl":"Adja meg a hivatkozĂ¡s webcĂ­mĂ©t","other":"<mĂ¡s>","popupDependent":"SzĂ¼lÅ‘höz kapcsolt (csak Netscape)","popupFeatures":"FelugrĂ³ ablak jellemzÅ‘i","popupFullScreen":"Teljes kĂ©pernyÅ‘ (csak IE)","popupLeft":"Bal pozĂ­ciĂ³","popupLocationBar":"CĂ­msor","popupMenuBar":"MenĂ¼ sor","popupResizable":"ĂtmĂ©retezĂ©s","popupScrollBars":"GördĂ­tÅ‘sĂ¡v","popupStatusBar":"Ăllapotsor","popupToolbar":"EszköztĂ¡r","popupTop":"FelsÅ‘ pozĂ­ciĂ³","rel":"Kapcsolat tĂ­pusa","selectAnchor":"Horgony vĂ¡lasztĂ¡sa","styles":"StĂ­lus","tabIndex":"TabulĂ¡tor index","target":"Tartalom megjelenĂ­tĂ©se","targetFrame":"<keretben>","targetFrameName":"Keret neve","targetPopup":"<felugrĂ³ ablakban>","targetPopupName":"FelugrĂ³ ablak neve","title":"HivatkozĂ¡s tulajdonsĂ¡gai","toAnchor":"Horgony az oldalon","toEmail":"E-Mail","toUrl":"URL","toolbar":"HivatkozĂ¡s beillesztĂ©se/mĂ³dosĂ­tĂ¡sa","type":"HivatkozĂ¡s tĂ­pusa","unlink":"HivatkozĂ¡s törlĂ©se","upload":"FeltöltĂ©s"},"list":{"bulletedlist":"FelsorolĂ¡s","numberedlist":"SzĂ¡mozĂ¡s"},"magicline":{"title":"SzĂºrja be a bekezdĂ©st ide"},"maximize":{"maximize":"Teljes mĂ©ret","minimize":"Kis mĂ©ret"},"pastetext":{"button":"BeillesztĂ©s formĂ¡zatlan szövegkĂ©nt","title":"BeillesztĂ©s formĂ¡zatlan szövegkĂ©nt"},"pastefromword":{"confirmCleanup":"Ăgy tűnik a beillesztett szöveget Word-bÅ‘l mĂ¡solt Ă¡t. Meg szeretnĂ© tisztĂ­tani a szöveget? (ajĂ¡nlott)","error":"Egy belsÅ‘ hiba miatt nem sikerĂ¼lt megtisztĂ­tani a szöveget","title":"BeillesztĂ©s Word-bÅ‘l","toolbar":"BeillesztĂ©s Word-bÅ‘l"},"removeformat":{"toolbar":"FormĂ¡zĂ¡s eltĂ¡volĂ­tĂ¡sa"},"sourcearea":{"toolbar":"ForrĂ¡skĂ³d"},"specialchar":{"options":"SpeciĂ¡lis karakter opciĂ³k","title":"SpeciĂ¡lis karakter vĂ¡lasztĂ¡sa","toolbar":"SpeciĂ¡lis karakter beillesztĂ©se"},"scayt":{"btn_about":"SCAYT nĂ©vjegy","btn_dictionaries":"SzĂ³tĂ¡r","btn_disable":"SCAYT letiltĂ¡sa","btn_enable":"SCAYT engedĂ©lyezĂ©se","btn_langs":"Nyelvek","btn_options":"BeĂ¡llĂ­tĂ¡sok","text_title":"HelyesĂ­rĂ¡s ellenÅ‘rzĂ©s gĂ©pelĂ©s közben"},"stylescombo":{"label":"StĂ­lus","panelTitle":"FormĂ¡zĂ¡si stĂ­lusok","panelTitle1":"Blokk stĂ­lusok","panelTitle2":"Inline stĂ­lusok","panelTitle3":"Objektum stĂ­lusok"},"table":{"border":"SzegĂ©lymĂ©ret","caption":"Felirat","cell":{"menu":"Cella","insertBefore":"BeszĂºrĂ¡s balra","insertAfter":"BeszĂºrĂ¡s jobbra","deleteCell":"CellĂ¡k törlĂ©se","merge":"CellĂ¡k egyesĂ­tĂ©se","mergeRight":"CellĂ¡k egyesĂ­tĂ©se jobbra","mergeDown":"CellĂ¡k egyesĂ­tĂ©se lefelĂ©","splitHorizontal":"CellĂ¡k szĂ©tvĂ¡lasztĂ¡sa vĂ­zszintesen","splitVertical":"CellĂ¡k szĂ©tvĂ¡lasztĂ¡sa fĂ¼ggÅ‘legesen","title":"Cella tulajdonsĂ¡gai","cellType":"Cella tĂ­pusa","rowSpan":"FĂ¼ggÅ‘leges egyesĂ­tĂ©s","colSpan":"VĂ­zszintes egyesĂ­tĂ©s","wordWrap":"HosszĂº sorok törĂ©se","hAlign":"VĂ­zszintes igazĂ­tĂ¡s","vAlign":"FĂ¼ggÅ‘leges igazĂ­tĂ¡s","alignBaseline":"Alapvonalra","bgColor":"HĂ¡ttĂ©r szĂ­ne","borderColor":"Keret szĂ­ne","data":"Adat","header":"FejlĂ©c","yes":"Igen","no":"Nem","invalidWidth":"A szĂ©lessĂ©g mezÅ‘be csak szĂ¡mokat Ă­rhat.","invalidHeight":"A magassĂ¡g mezÅ‘be csak szĂ¡mokat Ă­rhat.","invalidRowSpan":"A fĂ¼ggÅ‘leges egyesĂ­tĂ©s mezÅ‘be csak szĂ¡mokat Ă­rhat.","invalidColSpan":"A vĂ­zszintes egyesĂ­tĂ©s mezÅ‘be csak szĂ¡mokat Ă­rhat.","chooseColor":"VĂ¡lasszon"},"cellPad":"Cella belsÅ‘ margĂ³","cellSpace":"Cella tĂ©rköz","column":{"menu":"Oszlop","insertBefore":"BeszĂºrĂ¡s balra","insertAfter":"BeszĂºrĂ¡s jobbra","deleteColumn":"Oszlopok törlĂ©se"},"columns":"Oszlopok","deleteTable":"TĂ¡blĂ¡zat törlĂ©se","headers":"FejlĂ©cek","headersBoth":"MindkettÅ‘","headersColumn":"ElsÅ‘ oszlop","headersNone":"Nincsenek","headersRow":"ElsÅ‘ sor","invalidBorder":"A szegĂ©lymĂ©ret mezÅ‘be csak szĂ¡mokat Ă­rhat.","invalidCellPadding":"A cella belsÅ‘ margĂ³ mezÅ‘be csak szĂ¡mokat Ă­rhat.","invalidCellSpacing":"A cella tĂ©rköz mezÅ‘be csak szĂ¡mokat Ă­rhat.","invalidCols":"Az oszlopok szĂ¡mĂ¡nak nagyobbnak kell lenni mint 0.","invalidHeight":"A magassĂ¡g mezÅ‘be csak szĂ¡mokat Ă­rhat.","invalidRows":"A sorok szĂ¡mĂ¡nak nagyobbnak kell lenni mint 0.","invalidWidth":"A szĂ©lessĂ©g mezÅ‘be csak szĂ¡mokat Ă­rhat.","menu":"TĂ¡blĂ¡zat tulajdonsĂ¡gai","row":{"menu":"Sor","insertBefore":"BeszĂºrĂ¡s fölĂ©","insertAfter":"BeszĂºrĂ¡s alĂ¡","deleteRow":"Sorok törlĂ©se"},"rows":"Sorok","summary":"LeĂ­rĂ¡s","title":"TĂ¡blĂ¡zat tulajdonsĂ¡gai","toolbar":"TĂ¡blĂ¡zat","widthPc":"szĂ¡zalĂ©k","widthPx":"kĂ©ppont","widthUnit":"SzĂ©lessĂ©g egysĂ©g"},"undo":{"redo":"IsmĂ©tlĂ©s","undo":"VisszavonĂ¡s"},"wsc":{"btnIgnore":"Kihagyja","btnIgnoreAll":"Mindet kihagyja","btnReplace":"Csere","btnReplaceAll":"Ă–sszes cserĂ©je","btnUndo":"VisszavonĂ¡s","changeTo":"MĂ³dosĂ­tĂ¡s","errorLoading":"Hiba a szolgĂ¡ltatĂ¡s host betöltĂ©se közben: %s.","ieSpellDownload":"A helyesĂ­rĂ¡s-ellenÅ‘rzÅ‘ nincs telepĂ­tve. SzeretnĂ© letölteni most?","manyChanges":"HelyesĂ­rĂ¡s-ellenÅ‘rzĂ©s kĂ©sz: %1 szĂ³ cserĂ©lve","noChanges":"HelyesĂ­rĂ¡s-ellenÅ‘rzĂ©s kĂ©sz: Nincs vĂ¡ltoztatott szĂ³","noMispell":"HelyesĂ­rĂ¡s-ellenÅ‘rzĂ©s kĂ©sz: Nem talĂ¡ltam hibĂ¡t","noSuggestions":"Nincs javaslat","notAvailable":"SajnĂ¡lom, de a szolgĂ¡ltatĂ¡s jelenleg nem elĂ©rhetÅ‘.","notInDic":"Nincs a szĂ³tĂ¡rban","oneChange":"HelyesĂ­rĂ¡s-ellenÅ‘rzĂ©s kĂ©sz: Egy szĂ³ cserĂ©lve","progress":"HelyesĂ­rĂ¡s-ellenÅ‘rzĂ©s folyamatban...","title":"HelyesĂ­rĂ¡s ellenörzÅ‘","toolbar":"HelyesĂ­rĂ¡s-ellenÅ‘rzĂ©s"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/id.js b/js/ckeditor/lang/id.js
new file mode 100644
index 0000000..3ec9e0d
--- /dev/null
+++ b/js/ckeditor/lang/id.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['id']={"editor":"Rich Text Editor","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Tekan ALT 0 untuk bantuan.","browseServer":"Jelajah Server","url":"URL","protocol":"Protokol","upload":"Unggah","uploadSubmit":"Kirim ke Server","image":"Gambar","flash":"Flash","form":"Formulir","checkbox":"Kotak Cek","radio":"Tombol Radio","textField":"Kolom Teks","textarea":"Area Teks","hiddenField":"Kolom Tersembunyi","button":"Tombol","select":"Kolom Seleksi","imageButton":"Tombol Gambar","notSet":"<tidak diatur>","id":"Id","name":"Nama","langDir":"Arah Bahasa","langDirLtr":"Kiri ke Kanan (LTR)","langDirRtl":"Kanan ke Kiri","langCode":"Kode Bahasa","longDescr":"Deskripsi URL Panjang","cssClass":"Kelas Stylesheet","advisoryTitle":"Penasehat Judul","cssStyle":"Gaya","ok":"OK","cancel":"Batal","close":"Tutup","preview":"Pratinjau","resize":"Ubah ukuran","generalTab":"Umum","advancedTab":"Advanced","validateNumberFailed":"Nilai ini tidak sebuah angka","confirmNewPage":"Semua perubahan yang tidak disimpan di konten ini akan hilang. Apakah anda yakin ingin memuat halaman baru?","confirmCancel":"Beberapa opsi telah berubah. Apakah anda yakin ingin menutup dialog?","options":"Opsi","target":"Sasaran","targetNew":"Jendela Baru (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Jendela yang Sama (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"Kiri ke Kanan (LTR)","langDirRTL":"Kanan ke Kiri (RTL)","styles":"Gaya","cssClasses":"Kelas Stylesheet","width":"Lebar","height":"Tinggi","align":"Penjajaran","alignLeft":"Kiri","alignRight":"Kanan","alignCenter":"Tengah","alignJustify":"Rata kiri-kanan","alignTop":"Atas","alignMiddle":"Tengah","alignBottom":"Bawah","alignNone":"None","invalidValue":"Nilai tidak sah.","invalidHeight":"Tinggi harus sebuah angka.","invalidWidth":"Lebar harus sebuah angka.","invalidCssLength":"Nilai untuk \"%1\" harus sebuah angkat positif dengan atau tanpa pengukuran unit CSS yang sah (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Nilai yang dispesifikasian untuk kolom \"%1\" harus sebuah angka positif dengan atau tanpa sebuah unit pengukuran HTML (px atau %) yang valid.","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":"Masukkan sebuah angka untuk sebuah nilai dalam pixel atau sebuah angka dengan unit CSS yang sah (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, tidak tersedia</span>"},"about":{"copy":"Hak cipta &copy; $1. All rights reserved.","dlgTitle":"Tentang CKEditor","help":"Cel $1 untuk bantuan.","moreInfo":"Untuk informasi lisensi silahkan kunjungi web site kami:","title":"Tentang CKEditor","userGuide":"Petunjuk Pengguna CKEditor"},"basicstyles":{"bold":"Huruf Tebal","italic":"Huruf Miring","strike":"Strikethrough","subscript":"Subscript","superscript":"Superscript","underline":"Garis Bawah"},"blockquote":{"toolbar":"Kutipan Blok"},"clipboard":{"copy":"Salin","copyError":"Pengaturan keamanan peramban anda tidak mengizinkan editor untuk mengeksekusi operasi menyalin secara otomatis. Mohon gunakan papan tuts (Ctrl/Cmd+C)","cut":"Potong","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":"Tempel","pasteArea":"Area Tempel","pasteMsg":"Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK","securityMsg":"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.","title":"Tempel"},"contextmenu":{"options":"Opsi Konteks Pilihan"},"button":{"selectedLabel":"%1 (Selected)"},"toolbar":{"toolbarCollapse":"Ciutkan Toolbar","toolbarExpand":"Bentangkan Toolbar","toolbarGroups":{"document":"Dokumen","clipboard":"Papan klip / Kembalikan perlakuan","editing":"Sunting","forms":"Formulir","basicstyles":"Gaya Dasar","paragraph":"Paragraf","links":"Tautan","insert":"Sisip","styles":"Gaya","colors":"Warna","tools":"Alat"},"toolbars":"Editor toolbars"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"format":{"label":"Bentuk","panelTitle":"Bentuk Paragraf","tag_address":"Alamat","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":"Membentuk"},"horizontalrule":{"toolbar":"Sisip Garis Horisontal"},"image":{"alertUrl":"Mohon tulis URL gambar","alt":"Teks alternatif","border":"Batas","btnUpload":"Kirim ke 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":"Info Gambar","linkTab":"Tautan","lockRatio":"Lock Ratio","menu":"Image Properties","resetSize":"Reset Size","title":"Image Properties","titleButton":"Image Button Properties","upload":"Unggah","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":"Tingkatkan Lekuk","outdent":"Kurangi Lekuk"},"fakeobjects":{"anchor":"Anchor","flash":"Animasi Flash","hiddenfield":"Kolom Tersembunyi","iframe":"IFrame","unknown":"Obyek Tak Dikenal"},"link":{"acccessKey":"Access Key","advanced":"Advanced","advisoryContentType":"Advisory Content Type","advisoryTitle":"Penasehat Judul","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":"Kelas Stylesheet","emailAddress":"E-Mail Address","emailBody":"Message Body","emailSubject":"Message Subject","id":"Id","info":"Link Info","langCode":"Kode Bahasa","langDir":"Arah Bahasa","langDirLTR":"Kiri ke Kanan (LTR)","langDirRTL":"Kanan ke Kiri (RTL)","menu":"Edit Link","name":"Nama","noAnchors":"(No anchors available in the document)","noEmail":"Please type the e-mail address","noUrl":"Please type the link URL","other":"<other>","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":"Gaya","tabIndex":"Tab Index","target":"Sasaran","targetFrame":"<frame>","targetFrameName":"Target Frame Name","targetPopup":"<popup window>","targetPopupName":"Popup Window Name","title":"Tautan","toAnchor":"Link to anchor in the text","toEmail":"E-mail","toUrl":"URL","toolbar":"Tautan","type":"Link Type","unlink":"Unlink","upload":"Unggah"},"list":{"bulletedlist":"Sisip/Hapus Daftar Bullet","numberedlist":"Sisip/Hapus Daftar Bernomor"},"magicline":{"title":"Masukkan paragraf disini"},"maximize":{"maximize":"Memperbesar","minimize":"Memperkecil"},"pastetext":{"button":"Tempel sebagai teks polos","title":"Tempel sebagai Teks Polos"},"pastefromword":{"confirmCleanup":"Teks yang ingin anda tempel sepertinya di salin dari Word. Apakah anda mau membersihkannya sebelum menempel?","error":"Tidak mungkin membersihkan data yang ditempel dikerenakan kesalahan internal","title":"Tempel dari Word","toolbar":"Tempel dari Word"},"removeformat":{"toolbar":"Hapus Format"},"sourcearea":{"toolbar":"Sumber"},"specialchar":{"options":"Opsi spesial karakter","title":"Pilih spesial karakter","toolbar":"Sisipkan spesial karakter"},"scayt":{"btn_about":"About SCAYT","btn_dictionaries":"Dictionaries","btn_disable":"Disable SCAYT","btn_enable":"Enable SCAYT","btn_langs":"Languages","btn_options":"Options","text_title":"Spell Check As You Type"},"stylescombo":{"label":"Gaya","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"Ukuran batas","caption":"Judul halaman","cell":{"menu":"Sel","insertBefore":"Sisip Sel Sebelum","insertAfter":"Sisip Sel Setelah","deleteCell":"Hapus Sel","merge":"Gabungkan Sel","mergeRight":"Gabungkan ke Kanan","mergeDown":"Gabungkan ke Bawah","splitHorizontal":"Pisahkan Sel Secara Horisontal","splitVertical":"Pisahkan Sel Secara Vertikal","title":"Properti Sel","cellType":"Tipe Sel","rowSpan":"Rentang antar baris","colSpan":"Rentang antar kolom","wordWrap":"Word Wrap","hAlign":"Jajaran Horisontal","vAlign":"Jajaran Vertikal","alignBaseline":"Dasar","bgColor":"Warna Latar Belakang","borderColor":"Warna Batasan","data":"Data","header":"Header","yes":"Ya","no":"Tidak","invalidWidth":"Lebar sel harus sebuah angka.","invalidHeight":"Tinggi sel harus sebuah angka","invalidRowSpan":"Rentang antar baris harus angka seluruhnya.","invalidColSpan":"Rentang antar kolom harus angka seluruhnya","chooseColor":"Pilih"},"cellPad":"Sel spasi dalam","cellSpace":"Spasi antar sel","column":{"menu":"Kolom","insertBefore":"Sisip Kolom Sebelum","insertAfter":"Sisip Kolom Sesudah","deleteColumn":"Hapus Kolom"},"columns":"Kolom","deleteTable":"Hapus Tabel","headers":"Headers","headersBoth":"Keduanya","headersColumn":"Kolom pertama","headersNone":"Tidak ada","headersRow":"Baris Pertama","invalidBorder":"Ukuran batasan harus sebuah angka","invalidCellPadding":"'Spasi dalam' sel harus angka positif.","invalidCellSpacing":"Spasi antar sel harus angka positif.","invalidCols":"Jumlah kolom harus sebuah angka lebih besar dari 0","invalidHeight":"Tinggi tabel harus sebuah angka.","invalidRows":"Jumlah barus harus sebuah angka dan lebih besar dari 0.","invalidWidth":"Lebar tabel harus sebuah angka.","menu":"Properti Tabel","row":{"menu":"Baris","insertBefore":"Sisip Baris Sebelum","insertAfter":"Sisip Baris Sesudah","deleteRow":"Hapus Baris"},"rows":"Baris","summary":"Intisari","title":"Properti Tabel","toolbar":"Tabe","widthPc":"persen","widthPx":"piksel","widthUnit":"lebar satuan"},"undo":{"redo":"Kembali lakukan","undo":"Batalkan perlakuan"},"wsc":{"btnIgnore":"Ignore","btnIgnoreAll":"Ignore All","btnReplace":"Replace","btnReplaceAll":"Replace All","btnUndo":"Undo","changeTo":"Change to","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Spell checker not installed. Do you want to download it now?","manyChanges":"Spell check complete: %1 words changed","noChanges":"Spell check complete: No words changed","noMispell":"Spell check complete: No misspellings found","noSuggestions":"- No suggestions -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Not in dictionary","oneChange":"Spell check complete: One word changed","progress":"Spell check in progress...","title":"Spell Checker","toolbar":"Check Spelling"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/is.js b/js/ckeditor/lang/is.js
new file mode 100644
index 0000000..09e10ce
--- /dev/null
+++ b/js/ckeditor/lang/is.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['is']={"editor":"Rich Text Editor","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Press ALT 0 for help","browseServer":"Fletta Ă­ skjalasafni","url":"VefslĂ³Ă°","protocol":"SamskiptastaĂ°all","upload":"Senda upp","uploadSubmit":"HlaĂ°a upp","image":"Setja inn mynd","flash":"Flash","form":"Setja inn innslĂ¡ttarform","checkbox":"Setja inn hökunarreit","radio":"Setja inn valhnapp","textField":"Setja inn textareit","textarea":"Setja inn textasvæði","hiddenField":"Setja inn faliĂ° svæði","button":"Setja inn hnapp","select":"Setja inn lista","imageButton":"Setja inn myndahnapp","notSet":"<ekkert valiĂ°>","id":"AuĂ°kenni","name":"Nafn","langDir":"Lesstefna","langDirLtr":"FrĂ¡ vinstri til hægri (LTR)","langDirRtl":"FrĂ¡ hægri til vinstri (RTL)","langCode":"TungumĂ¡lakĂ³Ă°i","longDescr":"NĂ¡nari lĂ½sing","cssClass":"StĂ­lsniĂ°sflokkur","advisoryTitle":"Titill","cssStyle":"StĂ­ll","ok":"Ă lagi","cancel":"Hætta viĂ°","close":"Close","preview":"ForskoĂ°a","resize":"Resize","generalTab":"Almennt","advancedTab":"Tæknilegt","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":"Mark","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"FrĂ¡ vinstri til hægri (LTR)","langDirRTL":"FrĂ¡ hægri til vinstri (RTL)","styles":"StĂ­ll","cssClasses":"StĂ­lsniĂ°sflokkur","width":"Breidd","height":"Hæð","align":"Jöfnun","alignLeft":"Vinstri","alignRight":"Hægri","alignCenter":"MiĂ°jaĂ°","alignJustify":"Jafna bĂ¡Ă°um megin","alignTop":"Efst","alignMiddle":"MiĂ°juĂ°","alignBottom":"NeĂ°st","alignNone":"None","invalidValue":"Invalid value.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","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>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"FeitletraĂ°","italic":"SkĂ¡letraĂ°","strike":"YfirstrikaĂ°","subscript":"NiĂ°urskrifaĂ°","superscript":"UppskrifaĂ°","underline":"UndirstrikaĂ°"},"blockquote":{"toolbar":"InndrĂ¡ttur"},"clipboard":{"copy":"Afrita","copyError":"Ă–ryggisstillingar vafrans Ă¾Ă­ns leyfa ekki afritun texta meĂ° mĂºsaraĂ°gerĂ°. NotaĂ°u lyklaborĂ°iĂ° Ă­ afrita (Ctrl/Cmd+C).","cut":"Klippa","cutError":"Ă–ryggisstillingar vafrans Ă¾Ă­ns leyfa ekki klippingu texta meĂ° mĂºsaraĂ°gerĂ°. NotaĂ°u lyklaborĂ°iĂ° Ă­ klippa (Ctrl/Cmd+X).","paste":"LĂ­ma","pasteArea":"Paste Area","pasteMsg":"LĂ­mdu Ă­ svæðiĂ° hĂ©r aĂ° neĂ°an og (<STRONG>Ctrl/Cmd+V</STRONG>) og smelltu Ă¡ <STRONG>OK</STRONG>.","securityMsg":"Vegna öryggisstillinga Ă­ vafranum Ă¾Ă­num fær ritillinn ekki beinan aĂ°gang aĂ° klippuborĂ°inu. ĂĂº verĂ°ur aĂ° lĂ­ma innihaldiĂ° aftur inn Ă­ Ă¾ennan glugga.","title":"LĂ­ma"},"contextmenu":{"options":"Context Menu Options"},"button":{"selectedLabel":"%1 (Selected)"},"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"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"format":{"label":"StĂ­lsniĂ°","panelTitle":"StĂ­lsniĂ°","tag_address":"Vistfang","tag_div":"Venjulegt (DIV)","tag_h1":"Fyrirsögn 1","tag_h2":"Fyrirsögn 2","tag_h3":"Fyrirsögn 3","tag_h4":"Fyrirsögn 4","tag_h5":"Fyrirsögn 5","tag_h6":"Fyrirsögn 6","tag_p":"Venjulegt letur","tag_pre":"ForsniĂ°iĂ°"},"horizontalrule":{"toolbar":"LĂ³Ă°rĂ©tt lĂ­na"},"image":{"alertUrl":"SlĂ¡Ă°u inn slĂ³Ă°ina aĂ° myndinni","alt":"Baklægur texti","border":"Rammi","btnUpload":"HlaĂ°a upp","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"Vinstri bil","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"Almennt","linkTab":"Stikla","lockRatio":"Festa stærĂ°arhlutfall","menu":"Eigindi myndar","resetSize":"Reikna stærĂ°","title":"Eigindi myndar","titleButton":"Eigindi myndahnapps","upload":"HlaĂ°a upp","urlMissing":"Image source URL is missing.","vSpace":"Hægri bil","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"indent":{"indent":"Minnka inndrĂ¡tt","outdent":"Auka inndrĂ¡tt"},"fakeobjects":{"anchor":"Anchor","flash":"Flash Animation","hiddenfield":"Hidden Field","iframe":"IFrame","unknown":"Unknown Object"},"link":{"acccessKey":"Skammvalshnappur","advanced":"Tæknilegt","advisoryContentType":"Tegund innihalds","advisoryTitle":"Titill","anchor":{"toolbar":"Stofna/breyta kaflamerki","menu":"Eigindi kaflamerkis","title":"Eigindi kaflamerkis","name":"Nafn bĂ³kamerkis","errorName":"SlĂ¡Ă°u inn nafn bĂ³kamerkis!","remove":"Remove Anchor"},"anchorId":"Eftir auĂ°kenni einingar","anchorName":"Eftir akkerisnafni","charset":"TĂ¡knrĂ³f","cssClasses":"StĂ­lsniĂ°sflokkur","emailAddress":"Netfang","emailBody":"MeginmĂ¡l","emailSubject":"Efni","id":"AuĂ°kenni","info":"Almennt","langCode":"Lesstefna","langDir":"Lesstefna","langDirLTR":"FrĂ¡ vinstri til hægri (LTR)","langDirRTL":"FrĂ¡ hægri til vinstri (RTL)","menu":"Breyta stiklu","name":"Nafn","noAnchors":"<Engin bĂ³kamerki Ă¡ skrĂ¡>","noEmail":"SlĂ¡Ă°u inn netfang!","noUrl":"SlĂ¡Ă°u inn veffang stiklunnar!","other":"<annar>","popupDependent":"HĂ¡Ă° venslum (Netscape)","popupFeatures":"Eigindi sprettiglugga","popupFullScreen":"HeilskjĂ¡r (IE)","popupLeft":"FjarlægĂ° frĂ¡ vinstri","popupLocationBar":"FanglĂ­na","popupMenuBar":"VallĂ­na","popupResizable":"Resizable","popupScrollBars":"Skrunstikur","popupStatusBar":"Stöðustika","popupToolbar":"Verkfærastika","popupTop":"FjarlægĂ° frĂ¡ efri brĂºn","rel":"Relationship","selectAnchor":"Veldu akkeri","styles":"StĂ­ll","tabIndex":"RaĂ°nĂºmer innslĂ¡ttarreits","target":"Mark","targetFrame":"<rammi>","targetFrameName":"Nafn markglugga","targetPopup":"<sprettigluggi>","targetPopupName":"Nafn sprettiglugga","title":"Stikla","toAnchor":"BĂ³kamerki Ă¡ Ă¾essari sĂ­Ă°u","toEmail":"Netfang","toUrl":"VefslĂ³Ă°","toolbar":"Stofna/breyta stiklu","type":"Stikluflokkur","unlink":"Fjarlægja stiklu","upload":"Senda upp"},"list":{"bulletedlist":"Punktalisti","numberedlist":"NĂºmeraĂ°ur listi"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximize","minimize":"Minimize"},"pastetext":{"button":"LĂ­ma sem Ă³sniĂ°inn texta","title":"LĂ­ma sem Ă³sniĂ°inn texta"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"LĂ­ma Ăºr Word","toolbar":"LĂ­ma Ăºr Word"},"removeformat":{"toolbar":"Fjarlægja sniĂ°"},"sourcearea":{"toolbar":"KĂ³Ă°i"},"specialchar":{"options":"Special Character Options","title":"Velja tĂ¡kn","toolbar":"Setja inn merki"},"scayt":{"btn_about":"About SCAYT","btn_dictionaries":"Dictionaries","btn_disable":"Disable SCAYT","btn_enable":"Enable SCAYT","btn_langs":"Languages","btn_options":"Options","text_title":"Spell Check As You Type"},"stylescombo":{"label":"StĂ­lflokkur","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"Breidd ramma","caption":"Titill","cell":{"menu":"Reitur","insertBefore":"SkjĂ³ta inn reiti fyrir aftan","insertAfter":"SkjĂ³ta inn reiti fyrir framan","deleteCell":"Fella reit","merge":"Sameina reiti","mergeRight":"Sameina til hægri","mergeDown":"Sameina niĂ°ur Ă¡ viĂ°","splitHorizontal":"KljĂºfa reit lĂ¡rĂ©tt","splitVertical":"KljĂºfa reit lĂ³Ă°rĂ©tt","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":"ReitaspĂ¡ssĂ­a","cellSpace":"Bil milli reita","column":{"menu":"DĂ¡lkur","insertBefore":"SkjĂ³ta inn dĂ¡lki vinstra megin","insertAfter":"SkjĂ³ta inn dĂ¡lki hægra megin","deleteColumn":"Fella dĂ¡lk"},"columns":"DĂ¡lkar","deleteTable":"Fella töflu","headers":"Fyrirsagnir","headersBoth":"Hvort tveggja","headersColumn":"Fyrsti dĂ¡lkur","headersNone":"Engar","headersRow":"Fyrsta röð","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":"Eigindi töflu","row":{"menu":"Röð","insertBefore":"SkjĂ³ta inn röð fyrir ofan","insertAfter":"SkjĂ³ta inn röð fyrir neĂ°an","deleteRow":"EyĂ°a röð"},"rows":"RaĂ°ir","summary":"Ăfram","title":"Eigindi töflu","toolbar":"Tafla","widthPc":"prĂ³sent","widthPx":"myndeindir","widthUnit":"width unit"},"undo":{"redo":"Hætta viĂ° afturköllun","undo":"Afturkalla"},"wsc":{"btnIgnore":"Hunsa","btnIgnoreAll":"Hunsa allt","btnReplace":"Skipta","btnReplaceAll":"Skipta öllu","btnUndo":"Til baka","changeTo":"Tillaga","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Villuleit ekki sett upp.<br>Viltu setja hana upp?","manyChanges":"Villuleit lokiĂ°: %1 orĂ°um breytt","noChanges":"Villuleit lokiĂ°: Engu orĂ°i breytt","noMispell":"Villuleit lokiĂ°: Engin villa fannst","noSuggestions":"- engar tillögur -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Ekki Ă­ orĂ°abĂ³kinni","oneChange":"Villuleit lokiĂ°: Einu orĂ°i breytt","progress":"Villuleit Ă­ gangi...","title":"Spell Checker","toolbar":"Villuleit"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/it.js b/js/ckeditor/lang/it.js
new file mode 100644
index 0000000..f5220ff
--- /dev/null
+++ b/js/ckeditor/lang/it.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['it']={"editor":"Rich Text Editor","editorPanel":"Pannello Rich Text Editor","common":{"editorHelp":"Premi ALT 0 per aiuto","browseServer":"Cerca sul server","url":"URL","protocol":"Protocollo","upload":"Carica","uploadSubmit":"Invia al server","image":"Immagine","flash":"Oggetto Flash","form":"Modulo","checkbox":"Checkbox","radio":"Radio Button","textField":"Campo di testo","textarea":"Area di testo","hiddenField":"Campo nascosto","button":"Bottone","select":"Menu di selezione","imageButton":"Bottone immagine","notSet":"<non impostato>","id":"Id","name":"Nome","langDir":"Direzione scrittura","langDirLtr":"Da Sinistra a Destra (LTR)","langDirRtl":"Da Destra a Sinistra (RTL)","langCode":"Codice Lingua","longDescr":"URL descrizione estesa","cssClass":"Nome classe CSS","advisoryTitle":"Titolo","cssStyle":"Stile","ok":"OK","cancel":"Annulla","close":"Chiudi","preview":"Anteprima","resize":"Trascina per ridimensionare","generalTab":"Generale","advancedTab":"Avanzate","validateNumberFailed":"Il valore inserito non è un numero.","confirmNewPage":"Ogni modifica non salvata sarĂ  persa. Sei sicuro di voler caricare una nuova pagina?","confirmCancel":"Alcune delle opzioni sono state cambiate. Sei sicuro di voler chiudere la finestra di dialogo?","options":"Opzioni","target":"Destinazione","targetNew":"Nuova finestra (_blank)","targetTop":"Finestra in primo piano (_top)","targetSelf":"Stessa finestra (_self)","targetParent":"Finestra Padre (_parent)","langDirLTR":"Da sinistra a destra (LTR)","langDirRTL":"Da destra a sinistra (RTL)","styles":"Stile","cssClasses":"Classi di stile","width":"Larghezza","height":"Altezza","align":"Allineamento","alignLeft":"Sinistra","alignRight":"Destra","alignCenter":"Centrato","alignJustify":"Giustifica","alignTop":"In Alto","alignMiddle":"Centrato","alignBottom":"In Basso","alignNone":"Nessuno","invalidValue":"Valore non valido.","invalidHeight":"L'altezza dev'essere un numero","invalidWidth":"La Larghezza dev'essere un numero","invalidCssLength":"Il valore indicato per il campo \"%1\" deve essere un numero positivo con o senza indicazione di una valida unitĂ  di misura per le classi CSS (px, %, in, cm, mm, em, ex, pt, o pc).","invalidHtmlLength":"Il valore indicato per il campo \"%1\" deve essere un numero positivo con o senza indicazione di una valida unitĂ  di misura per le pagine HTML (px o %).","invalidInlineStyle":"Il valore specificato per lo stile inline deve consistere in una o piĂ¹ tuple con il formato di \"name : value\", separati da semicolonne.","cssLengthTooltip":"Inserisci un numero per il valore in pixel oppure un numero con una valida unitĂ  CSS (px, %, in, cm, mm, ex, pt, o pc).","unavailable":"%1<span class=\"cke_accessibility\">, non disponibile</span>"},"about":{"copy":"Copyright &copy; $1. Tutti i diritti riservati.","dlgTitle":"Riguardo CKEditor","help":"Vedi $1 per l'aiuto.","moreInfo":"Per le informazioni sulla licenza si prega di visitare il nostro sito:","title":"Riguardo CKEditor","userGuide":"Guida Utente CKEditor"},"basicstyles":{"bold":"Grassetto","italic":"Corsivo","strike":"Barrato","subscript":"Pedice","superscript":"Apice","underline":"Sottolineato"},"blockquote":{"toolbar":"Citazione"},"clipboard":{"copy":"Copia","copyError":"Le impostazioni di sicurezza del browser non permettono di copiare automaticamente il testo. Usa la tastiera (Ctrl/Cmd+C).","cut":"Taglia","cutError":"Le impostazioni di sicurezza del browser non permettono di tagliare automaticamente il testo. Usa la tastiera (Ctrl/Cmd+X).","paste":"Incolla","pasteArea":"Incolla","pasteMsg":"Incolla il testo all'interno dell'area sottostante usando la scorciatoia di tastiere (<STRONG>Ctrl/Cmd+V</STRONG>) e premi <STRONG>OK</STRONG>.","securityMsg":"A causa delle impostazioni di sicurezza del browser,l'editor non è in grado di accedere direttamente agli appunti. E' pertanto necessario incollarli di nuovo in questa finestra.","title":"Incolla"},"contextmenu":{"options":"Opzioni del menĂ¹ contestuale"},"button":{"selectedLabel":"%1 (selezionato)"},"toolbar":{"toolbarCollapse":"Minimizza Toolbar","toolbarExpand":"Espandi Toolbar","toolbarGroups":{"document":"Documento","clipboard":"Copia negli appunti/Annulla","editing":"Modifica","forms":"Form","basicstyles":"Stili di base","paragraph":"Paragrafo","links":"Link","insert":"Inserisci","styles":"Stili","colors":"Colori","tools":"Strumenti"},"toolbars":"Editor toolbar"},"elementspath":{"eleLabel":"Percorso degli elementi","eleTitle":"%1 elemento"},"format":{"label":"Formato","panelTitle":"Formato","tag_address":"Indirizzo","tag_div":"Paragrafo (DIV)","tag_h1":"Titolo 1","tag_h2":"Titolo 2","tag_h3":"Titolo 3","tag_h4":"Titolo 4","tag_h5":"Titolo 5","tag_h6":"Titolo 6","tag_p":"Normale","tag_pre":"Formattato"},"horizontalrule":{"toolbar":"Inserisci riga orizzontale"},"image":{"alertUrl":"Devi inserire l'URL per l'immagine","alt":"Testo alternativo","border":"Bordo","btnUpload":"Invia al server","button2Img":"Vuoi trasformare il bottone immagine selezionato in un'immagine semplice?","hSpace":"HSpace","img2Button":"Vuoi trasferomare l'immagine selezionata in un bottone immagine?","infoTab":"Informazioni immagine","linkTab":"Collegamento","lockRatio":"Blocca rapporto","menu":"ProprietĂ  immagine","resetSize":"Reimposta dimensione","title":"ProprietĂ  immagine","titleButton":"ProprietĂ  bottone immagine","upload":"Carica","urlMissing":"Manca l'URL dell'immagine.","vSpace":"VSpace","validateBorder":"Il campo Bordo deve essere un numero intero.","validateHSpace":"Il campo HSpace deve essere un numero intero.","validateVSpace":"Il campo VSpace deve essere un numero intero."},"indent":{"indent":"Aumenta rientro","outdent":"Riduci rientro"},"fakeobjects":{"anchor":"Ancora","flash":"Animazione Flash","hiddenfield":"Campo Nascosto","iframe":"IFrame","unknown":"Oggetto sconosciuto"},"link":{"acccessKey":"Scorciatoia da tastiera","advanced":"Avanzate","advisoryContentType":"Tipo della risorsa collegata","advisoryTitle":"Titolo","anchor":{"toolbar":"Inserisci/Modifica Ancora","menu":"ProprietĂ  ancora","title":"ProprietĂ  ancora","name":"Nome ancora","errorName":"Inserici il nome dell'ancora","remove":"Rimuovi l'ancora"},"anchorId":"Per id elemento","anchorName":"Per Nome","charset":"Set di caretteri della risorsa collegata","cssClasses":"Nome classe CSS","emailAddress":"Indirizzo E-Mail","emailBody":"Corpo del messaggio","emailSubject":"Oggetto del messaggio","id":"Id","info":"Informazioni collegamento","langCode":"Direzione scrittura","langDir":"Direzione scrittura","langDirLTR":"Da Sinistra a Destra (LTR)","langDirRTL":"Da Destra a Sinistra (RTL)","menu":"Modifica collegamento","name":"Nome","noAnchors":"(Nessuna ancora disponibile nel documento)","noEmail":"Devi inserire un'indirizzo e-mail","noUrl":"Devi inserire l'URL del collegamento","other":"<altro>","popupDependent":"Dipendente (Netscape)","popupFeatures":"Caratteristiche finestra popup","popupFullScreen":"A tutto schermo (IE)","popupLeft":"Posizione da sinistra","popupLocationBar":"Barra degli indirizzi","popupMenuBar":"Barra del menu","popupResizable":"Ridimensionabile","popupScrollBars":"Barre di scorrimento","popupStatusBar":"Barra di stato","popupToolbar":"Barra degli strumenti","popupTop":"Posizione dall'alto","rel":"Relazioni","selectAnchor":"Scegli Ancora","styles":"Stile","tabIndex":"Ordine di tabulazione","target":"Destinazione","targetFrame":"<riquadro>","targetFrameName":"Nome del riquadro di destinazione","targetPopup":"<finestra popup>","targetPopupName":"Nome finestra popup","title":"Collegamento","toAnchor":"Ancora nel testo","toEmail":"E-Mail","toUrl":"URL","toolbar":"Collegamento","type":"Tipo di Collegamento","unlink":"Elimina collegamento","upload":"Carica"},"list":{"bulletedlist":"Inserisci/Rimuovi Elenco Puntato","numberedlist":"Inserisci/Rimuovi Elenco Numerato"},"magicline":{"title":"Inserisci paragrafo qui"},"maximize":{"maximize":"Massimizza","minimize":"Minimizza"},"pastetext":{"button":"Incolla come testo semplice","title":"Incolla come testo semplice"},"pastefromword":{"confirmCleanup":"Il testo da incollare sembra provenire da Word. Desideri pulirlo prima di incollare?","error":"Non è stato possibile eliminare il testo incollato a causa di un errore interno.","title":"Incolla da Word","toolbar":"Incolla da Word"},"removeformat":{"toolbar":"Elimina formattazione"},"sourcearea":{"toolbar":"Sorgente"},"specialchar":{"options":"Opzioni carattere speciale","title":"Seleziona carattere speciale","toolbar":"Inserisci carattere speciale"},"scayt":{"btn_about":"About COMS","btn_dictionaries":"Dizionari","btn_disable":"Disabilita COMS","btn_enable":"Abilita COMS","btn_langs":"Lingue","btn_options":"Opzioni","text_title":"Controllo Ortografico Mentre Scrivi"},"stylescombo":{"label":"Stili","panelTitle":"Stili di formattazione","panelTitle1":"Stili per blocchi","panelTitle2":"Stili in linea","panelTitle3":"Stili per oggetti"},"table":{"border":"Dimensione bordo","caption":"Intestazione","cell":{"menu":"Cella","insertBefore":"Inserisci Cella Prima","insertAfter":"Inserisci Cella Dopo","deleteCell":"Elimina celle","merge":"Unisce celle","mergeRight":"Unisci a Destra","mergeDown":"Unisci in Basso","splitHorizontal":"Dividi Cella Orizzontalmente","splitVertical":"Dividi Cella Verticalmente","title":"ProprietĂ  della cella","cellType":"Tipo di cella","rowSpan":"Su piĂ¹ righe","colSpan":"Su piĂ¹ colonne","wordWrap":"Ritorno a capo","hAlign":"Allineamento orizzontale","vAlign":"Allineamento verticale","alignBaseline":"Linea Base","bgColor":"Colore di Sfondo","borderColor":"Colore del Bordo","data":"Dati","header":"Intestazione","yes":"Si","no":"No","invalidWidth":"La larghezza della cella dev'essere un numero.","invalidHeight":"L'altezza della cella dev'essere un numero.","invalidRowSpan":"Il numero di righe dev'essere un numero intero.","invalidColSpan":"Il numero di colonne dev'essere un numero intero.","chooseColor":"Scegli"},"cellPad":"Padding celle","cellSpace":"Spaziatura celle","column":{"menu":"Colonna","insertBefore":"Inserisci Colonna Prima","insertAfter":"Inserisci Colonna Dopo","deleteColumn":"Elimina colonne"},"columns":"Colonne","deleteTable":"Cancella Tabella","headers":"Intestazione","headersBoth":"Entrambe","headersColumn":"Prima Colonna","headersNone":"Nessuna","headersRow":"Prima Riga","invalidBorder":"La dimensione del bordo dev'essere un numero.","invalidCellPadding":"Il paging delle celle dev'essere un numero","invalidCellSpacing":"La spaziatura tra le celle dev'essere un numero.","invalidCols":"Il numero di colonne dev'essere un numero maggiore di 0.","invalidHeight":"L'altezza della tabella dev'essere un numero.","invalidRows":"Il numero di righe dev'essere un numero maggiore di 0.","invalidWidth":"La larghezza della tabella dev'essere un numero.","menu":"ProprietĂ  tabella","row":{"menu":"Riga","insertBefore":"Inserisci Riga Prima","insertAfter":"Inserisci Riga Dopo","deleteRow":"Elimina righe"},"rows":"Righe","summary":"Indice","title":"ProprietĂ  tabella","toolbar":"Tabella","widthPc":"percento","widthPx":"pixel","widthUnit":"unitĂ  larghezza"},"undo":{"redo":"Ripristina","undo":"Annulla"},"wsc":{"btnIgnore":"Ignora","btnIgnoreAll":"Ignora tutto","btnReplace":"Cambia","btnReplaceAll":"Cambia tutto","btnUndo":"Annulla","changeTo":"Cambia in","errorLoading":"Errore nel caricamento dell'host col servizio applicativo: %s.","ieSpellDownload":"Contollo ortografico non installato. Lo vuoi scaricare ora?","manyChanges":"Controllo ortografico completato: %1 parole cambiate","noChanges":"Controllo ortografico completato: nessuna parola cambiata","noMispell":"Controllo ortografico completato: nessun errore trovato","noSuggestions":"- Nessun suggerimento -","notAvailable":"Il servizio non è momentaneamente disponibile.","notInDic":"Non nel dizionario","oneChange":"Controllo ortografico completato: 1 parola cambiata","progress":"Controllo ortografico in corso","title":"Controllo ortografico","toolbar":"Correttore ortografico"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/ja.js b/js/ckeditor/lang/ja.js
new file mode 100644
index 0000000..eaaab15
--- /dev/null
+++ b/js/ckeditor/lang/ja.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['ja']={"editor":"ăƒªăƒƒăƒăƒ†ă‚­ă‚¹ăƒˆă‚¨ăƒ‡ă‚£ă‚¿","editorPanel":"ăƒªăƒƒăƒăƒ†ă‚­ă‚¹ăƒˆă‚¨ăƒ‡ă‚£ă‚¿ăƒ‘ăƒăƒ«","common":{"editorHelp":"ăƒ˜ăƒ«ăƒ—ă¯ ALT 0 ă‚’æ¼ă—ă¦ăă ă•ă„","browseServer":"ă‚µăƒ¼ăƒăƒ–ăƒ©ă‚¦ă‚¶","url":"URL","protocol":"ăƒ—ăƒ­ăƒˆă‚³ăƒ«","upload":"ă‚¢ăƒƒăƒ—ăƒ­ăƒ¼ăƒ‰","uploadSubmit":"ă‚µăƒ¼ăƒăƒ¼ă«é€ä¿¡","image":"ă‚¤ăƒ¡ăƒ¼ă‚¸","flash":"Flash","form":"ăƒ•ă‚©ăƒ¼ăƒ ","checkbox":"ăƒă‚§ăƒƒă‚¯ăƒœăƒƒă‚¯ă‚¹","radio":"ăƒ©ă‚¸ă‚ªăƒœă‚¿ăƒ³","textField":"ï¼‘è¡Œăƒ†ă‚­ă‚¹ăƒˆ","textarea":"ăƒ†ă‚­ă‚¹ăƒˆă‚¨ăƒªă‚¢","hiddenField":"ä¸å¯è¦–ăƒ•ă‚£ăƒ¼ăƒ«ăƒ‰","button":"ăƒœă‚¿ăƒ³","select":"é¸æăƒ•ă‚£ăƒ¼ăƒ«ăƒ‰","imageButton":"ç”»åƒăƒœă‚¿ăƒ³","notSet":"<ăªă—>","id":"Id","name":"Nameå±æ€§","langDir":"文字表記ă®æ–¹å‘","langDirLtr":"å·¦ă‹ă‚‰å³ (LTR)","langDirRtl":"å³ă‹ă‚‰å·¦ (RTL)","langCode":"言èªă‚³ăƒ¼ăƒ‰","longDescr":"longdescå±æ€§(長文説æ˜)","cssClass":"ă‚¹ă‚¿ă‚¤ăƒ«ă‚·ăƒ¼ăƒˆă‚¯ăƒ©ă‚¹","advisoryTitle":"Titleå±æ€§","cssStyle":"ă‚¹ă‚¿ă‚¤ăƒ«ă‚·ăƒ¼ăƒˆ","ok":"OK","cancel":"ă‚­ăƒ£ăƒ³ă‚»ăƒ«","close":"é–‰ă˜ă‚‹","preview":"ăƒ—ăƒ¬ăƒ“ăƒ¥ăƒ¼","resize":"ăƒ‰ăƒ©ăƒƒă‚°ă—ă¦ăƒªă‚µă‚¤ă‚º","generalTab":"全般","advancedTab":"高度ăªè¨­å®","validateNumberFailed":"値ăŒæ•°ă§ă¯ă‚ă‚ă¾ă›ă‚“","confirmNewPage":"å¤‰æ›´å†…å®¹ă‚’ä¿å­˜ă›ăă€ æ–°ă—ă„ăƒăƒ¼ă‚¸ă‚’é–‹ă„ă¦ă‚‚ă‚ˆă‚ă—ă„ă§ă—ょă†ă‹ï¼Ÿ","confirmCancel":"ă‚ªăƒ—ă‚·ăƒ§ăƒ³è¨­å®ă‚’変更ă—ă¾ă—ăŸă€‚ăƒ€ă‚¤ă‚¢ăƒ­ă‚°ă‚’é–‰ă˜ă¦ă‚‚ă‚ˆă‚ă—ă„ă§ă—ょă†ă‹ï¼Ÿ","options":"ă‚ªăƒ—ă‚·ăƒ§ăƒ³","target":"ă‚¿ăƒ¼ă‚²ăƒƒăƒˆ","targetNew":"æ–°ă—ă„ă‚¦ă‚¤ăƒ³ăƒ‰ă‚¦ (_blank)","targetTop":"最ä¸éƒ¨ă‚¦ă‚£ăƒ³ăƒ‰ă‚¦ (_top)","targetSelf":"åŒă˜ă‚¦ă‚£ăƒ³ăƒ‰ă‚¦ (_self)","targetParent":"è¦ªă‚¦ă‚£ăƒ³ăƒ‰ă‚¦ (_parent)","langDirLTR":"å·¦ă‹ă‚‰å³ (LTR)","langDirRTL":"å³ă‹ă‚‰å·¦ (RTL)","styles":"ă‚¹ă‚¿ă‚¤ăƒ«","cssClasses":"ă‚¹ă‚¿ă‚¤ăƒ«ă‚·ăƒ¼ăƒˆă‚¯ăƒ©ă‚¹","width":"å¹…","height":"高ă•","align":"è¡Œæƒăˆ","alignLeft":"å·¦","alignRight":"å³","alignCenter":"中央","alignJustify":"両端æƒăˆ","alignTop":"ä¸","alignMiddle":"中央","alignBottom":"下","alignNone":"ăªă—","invalidValue":"ä¸æ­£ăªå€¤ă§ă™ă€‚","invalidHeight":"高ă•ă¯æ•°å€¤ă§å…¥å›ă—ă¦ăă ă•ă„。","invalidWidth":"å¹…ă¯æ•°å€¤ă§å…¥å›ă—ă¦ăă ă•ă„。","invalidCssLength":"å…¥å›ă•ă‚ŒăŸ \"%1\" é …ç›®ă®å€¤ă¯ă€CSSă®å¤§ăă•(px, %, in, cm, mm, em, ex, pt, ă¾ăŸă¯ pc)ăŒæ­£ă—ă„ă‚‚ă®ă§ă‚ă‚‹/ăªă„ă«é–¢ă‚らăă€æ­£ă®å€¤ă§ă‚ă‚‹å¿…è¦ăŒă‚ă‚ă¾ă™ă€‚","invalidHtmlLength":"å…¥å›ă•ă‚ŒăŸ \"%1\" é …ç›®ă®å€¤ă¯ă€HTMLă®å¤§ăă•(px ă¾ăŸă¯ %)ăŒæ­£ă—ă„ă‚‚ă®ă§ă‚ă‚‹/ăªă„ă«é–¢ă‚らăă€æ­£ă®å€¤ă§ă‚ă‚‹å¿…è¦ăŒă‚ă‚ă¾ă™ă€‚","invalidInlineStyle":"å…¥å›ă•ă‚ŒăŸă‚¤ăƒ³ăƒ©ă‚¤ăƒ³ă‚¹ă‚¿ă‚¤ăƒ«ă®å€¤ă¯ă€\"åå‰ : 値\" ă®ăƒ•ă‚©ăƒ¼ăƒăƒƒăƒˆă®ă‚»ăƒƒăƒˆă§ă€è¤‡æ•°ă®å ´åˆă¯ă‚»ăƒŸă‚³ăƒ­ăƒ³ă§åŒºåˆ‡ă‚‰ă‚Œă¦ă„ă‚‹å½¢å¼ă§ă‚ă‚‹å¿…è¦ăŒă‚ă‚ă¾ă™ă€‚","cssLengthTooltip":"ăƒ”ă‚¯ă‚»ăƒ«æ•°ă‚‚ă—ăă¯CSSă«ă‚»ăƒƒăƒˆă§ăă‚‹æ•°å€¤ă‚’å…¥å›ă—ă¦ăă ă•ă„。(px,%,in,cm,mm,em,ex,pt,or pc)","unavailable":"%1<span class=\"cke_accessibility\">, 利用ä¸å¯èƒ½</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"CKEditoră«ă¤ă„ă¦","help":"$1 ă®ăƒ˜ăƒ«ăƒ—ă‚’è¦‹ă¦ăă ă•ă„。","moreInfo":"ăƒ©ă‚¤ă‚»ăƒ³ă‚¹æƒ…å ±ă®è©³ç´°ă¯ă‚¦ă‚§ăƒ–ă‚µă‚¤ăƒˆă«ă¦ç¢ºèªă—ă¦ăă ă•ă„:","title":"CKEditoră«ă¤ă„ă¦","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"太字","italic":"斜体","strike":"打ă¡æ¶ˆă—ç·","subscript":"下付ă","superscript":"ä¸ä»˜ă","underline":"下ç·"},"blockquote":{"toolbar":"ăƒ–ăƒ­ăƒƒă‚¯å¼•ç”¨æ–‡"},"clipboard":{"copy":"ă‚³ăƒ”ăƒ¼","copyError":"ăƒ–ăƒ©ă‚¦ă‚¶ăƒ¼ă®ă‚»ă‚­ăƒ¥ăƒªăƒ†ă‚£è¨­å®ă«ă‚ˆă‚ă‚¨ăƒ‡ă‚£ă‚¿ă®ă‚³ăƒ”ăƒ¼æ“ä½œă‚’è‡ªå‹•ă§å®Ÿè¡Œă™ă‚‹ă“ă¨ăŒă§ăă¾ă›ă‚“ă€‚å®Ÿè¡Œă™ă‚‹ă«ă¯æ‰‹å‹•ă§ă‚­ăƒ¼ăƒœăƒ¼ăƒ‰ă®(Ctrl/Cmd+C)ă‚’ä½¿ç”¨ă—ă¦ăă ă•ă„。","cut":"切ă‚å–ă‚","cutError":"ăƒ–ăƒ©ă‚¦ă‚¶ăƒ¼ă®ă‚»ă‚­ăƒ¥ăƒªăƒ†ă‚£è¨­å®ă«ă‚ˆă‚ă‚¨ăƒ‡ă‚£ă‚¿ă®åˆ‡ă‚å–ă‚æ“ä½œă‚’è‡ªå‹•ă§å®Ÿè¡Œă™ă‚‹ă“ă¨ăŒă§ăă¾ă›ă‚“ă€‚å®Ÿè¡Œă™ă‚‹ă«ă¯æ‰‹å‹•ă§ă‚­ăƒ¼ăƒœăƒ¼ăƒ‰ă®(Ctrl/Cmd+X)ă‚’ä½¿ç”¨ă—ă¦ăă ă•ă„。","paste":"è²¼ă‚付ă‘","pasteArea":"è²¼ă‚付ă‘場所","pasteMsg":"ă‚­ăƒ¼ăƒœăƒ¼ăƒ‰(<STRONG>Ctrl/Cmd+V</STRONG>)ă‚’ä½¿ç”¨ă—ă¦ă€æ¬¡ă®å…¥å›ă‚¨ăƒªă‚¢å†…ă§è²¼ă‚付ă‘ă¦ă€<STRONG>OK</STRONG>ă‚’æ¼ă—ă¦ăă ă•ă„。","securityMsg":"ăƒ–ăƒ©ă‚¦ă‚¶ă®ă‚»ă‚­ăƒ¥ăƒªăƒ†ă‚£è¨­å®ă«ă‚ˆă‚ă€ă‚¨ăƒ‡ă‚£ă‚¿ă¯ă‚¯ăƒªăƒƒăƒ—ăƒœăƒ¼ăƒ‰ăƒ‡ăƒ¼ă‚¿ă«ç›´æ¥ă‚¢ă‚¯ă‚»ă‚¹ă™ă‚‹ă“ă¨ăŒă§ăă¾ă›ă‚“。ă“ă®ă‚¦ă‚£ăƒ³ăƒ‰ă‚¦ă¯è²¼ă‚付ă‘æ“ä½œă‚’è¡Œă†åº¦ă«è¡¨ç¤ºă•ă‚Œă¾ă™ă€‚","title":"è²¼ă‚付ă‘"},"contextmenu":{"options":"ă‚³ăƒ³ăƒ†ă‚­ă‚¹ăƒˆăƒ¡ăƒ‹ăƒ¥ăƒ¼ă‚ªăƒ—ă‚·ăƒ§ăƒ³"},"button":{"selectedLabel":"%1 (é¸æ中)"},"toolbar":{"toolbarCollapse":"ăƒ„ăƒ¼ăƒ«ăƒăƒ¼ă‚’é–‰ă˜ă‚‹","toolbarExpand":"ăƒ„ăƒ¼ăƒ«ăƒăƒ¼ă‚’é–‹ă","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":"ç·¨é›†ăƒ„ăƒ¼ăƒ«ăƒăƒ¼"},"elementspath":{"eleLabel":"è¦ç´ ăƒ‘ă‚¹","eleTitle":"%1 è¦ç´ "},"format":{"label":"書å¼","panelTitle":"段è½ă®æ›¸å¼","tag_address":"ă‚¢ăƒ‰ăƒ¬ă‚¹","tag_div":"標準 (DIV)","tag_h1":"è¦‹å‡ºă— 1","tag_h2":"è¦‹å‡ºă— 2","tag_h3":"è¦‹å‡ºă— 3","tag_h4":"è¦‹å‡ºă— 4","tag_h5":"è¦‹å‡ºă— 5","tag_h6":"è¦‹å‡ºă— 6","tag_p":"標準","tag_pre":"書å¼ä»˜ă"},"horizontalrule":{"toolbar":"æ°´å¹³ç·"},"image":{"alertUrl":"ç”»åƒă®URLă‚’å…¥å›ă—ă¦ăă ă•ă„","alt":"ä»£æ›¿ăƒ†ă‚­ă‚¹ăƒˆ","border":"æ ç·ă®å¹…","btnUpload":"ă‚µăƒ¼ăƒăƒ¼ă«é€ä¿¡","button2Img":"é¸æă—ăŸç”»åƒăƒœă‚¿ăƒ³ă‚’ç”»åƒă«å¤‰æ›ă—ă¾ă™ă‹ï¼Ÿ","hSpace":"水平間é”","img2Button":"é¸æă—ăŸç”»åƒă‚’ç”»åƒăƒœă‚¿ăƒ³ă«å¤‰æ›ă—ă¾ă™ă‹ï¼Ÿ","infoTab":"ç”»åƒæƒ…å ±","linkTab":"ăƒªăƒ³ă‚¯","lockRatio":"比ç‡ă‚’固å®","menu":"ç”»åƒă®ăƒ—ăƒ­ăƒ‘ăƒ†ă‚£","resetSize":"ă‚µă‚¤ă‚ºă‚’ăƒªă‚»ăƒƒăƒˆ","title":"ç”»åƒă®ăƒ—ăƒ­ăƒ‘ăƒ†ă‚£","titleButton":"ç”»åƒăƒœă‚¿ăƒ³ă®ăƒ—ăƒ­ăƒ‘ăƒ†ă‚£","upload":"ă‚¢ăƒƒăƒ—ăƒ­ăƒ¼ăƒ‰","urlMissing":"ç”»åƒă®URLă‚’å…¥å›ă—ă¦ăă ă•ă„。","vSpace":"å‚ç›´é–“é”","validateBorder":"æ ç·ă®å¹…ă¯æ•°å€¤ă§å…¥å›ă—ă¦ăă ă•ă„。","validateHSpace":"水平間é”ă¯æ•°å€¤ă§å…¥å›ă—ă¦ăă ă•ă„。","validateVSpace":"å‚ç›´é–“é”ă¯æ•°å€¤ă§å…¥å›ă—ă¦ăă ă•ă„。"},"indent":{"indent":"ă‚¤ăƒ³ăƒ‡ăƒ³ăƒˆ","outdent":"ă‚¤ăƒ³ăƒ‡ăƒ³ăƒˆè§£é™¤"},"fakeobjects":{"anchor":"ă‚¢ăƒ³ă‚«ăƒ¼","flash":"Flash Animation","hiddenfield":"ä¸å¯è¦–ăƒ•ă‚£ăƒ¼ăƒ«ăƒ‰","iframe":"IFrame","unknown":"Unknown Object"},"link":{"acccessKey":"ă‚¢ă‚¯ă‚»ă‚¹ă‚­ăƒ¼","advanced":"高度ăªè¨­å®","advisoryContentType":"Content Typeå±æ€§","advisoryTitle":"Titleå±æ€§","anchor":{"toolbar":"ă‚¢ăƒ³ă‚«ăƒ¼æŒ¿å…¥/編集","menu":"ă‚¢ăƒ³ă‚«ăƒ¼ă®ç·¨é›†","title":"ă‚¢ăƒ³ă‚«ăƒ¼ă®ăƒ—ăƒ­ăƒ‘ăƒ†ă‚£","name":"ă‚¢ăƒ³ă‚«ăƒ¼å","errorName":"ă‚¢ăƒ³ă‚«ăƒ¼åă‚’å…¥å›ă—ă¦ăă ă•ă„。","remove":"ă‚¢ăƒ³ă‚«ăƒ¼ă‚’å‰é™¤"},"anchorId":"ă‚¨ăƒ¬ăƒ¡ăƒ³ăƒˆID","anchorName":"ă‚¢ăƒ³ă‚«ăƒ¼å","charset":"ăƒªăƒ³ă‚¯å…ˆă®charset","cssClasses":"ă‚¹ă‚¿ă‚¤ăƒ«ă‚·ăƒ¼ăƒˆă‚¯ăƒ©ă‚¹","emailAddress":"E-Mail ă‚¢ăƒ‰ăƒ¬ă‚¹","emailBody":"本文","emailSubject":"件å","id":"Id","info":"ăƒă‚¤ăƒ‘ăƒ¼ăƒªăƒ³ă‚¯æƒ…å ±","langCode":"言èªă‚³ăƒ¼ăƒ‰","langDir":"文字表記ă®æ–¹å‘","langDirLTR":"å·¦ă‹ă‚‰å³ (LTR)","langDirRTL":"å³ă‹ă‚‰å·¦ (RTL)","menu":"ăƒªăƒ³ă‚¯ă‚’ç·¨é›†","name":"Nameå±æ€§","noAnchors":"(ă“ă®ăƒ‰ă‚­ăƒ¥ăƒ¡ăƒ³ăƒˆå†…ă«ă‚¢ăƒ³ă‚«ăƒ¼ă¯ă‚ă‚ă¾ă›ă‚“)","noEmail":"ăƒ¡ăƒ¼ăƒ«ă‚¢ăƒ‰ăƒ¬ă‚¹ă‚’å…¥å›ă—ă¦ăă ă•ă„。","noUrl":"ăƒªăƒ³ă‚¯URLă‚’å…¥å›ă—ă¦ăă ă•ă„。","other":"<ăă®ä»–ă®>","popupDependent":"é–‹ă„ăŸă‚¦ă‚£ăƒ³ăƒ‰ă‚¦ă«é€£å‹•ă—ă¦é–‰ă˜ă‚‹ (Netscape)","popupFeatures":"ăƒăƒƒăƒ—ă‚¢ăƒƒăƒ—ă‚¦ă‚£ăƒ³ăƒ‰ă‚¦ç‰¹å¾´","popupFullScreen":"全画é¢ăƒ¢ăƒ¼ăƒ‰(IE)","popupLeft":"左端ă‹ă‚‰ă®åº§æ¨™ă§æŒ‡å®","popupLocationBar":"ăƒ­ă‚±ăƒ¼ă‚·ăƒ§ăƒ³ăƒăƒ¼","popupMenuBar":"ăƒ¡ăƒ‹ăƒ¥ăƒ¼ăƒăƒ¼","popupResizable":"ă‚µă‚¤ă‚ºå¯å¤‰","popupScrollBars":"ă‚¹ă‚¯ăƒ­ăƒ¼ăƒ«ăƒăƒ¼","popupStatusBar":"ă‚¹ăƒ†ăƒ¼ă‚¿ă‚¹ăƒăƒ¼","popupToolbar":"ăƒ„ăƒ¼ăƒ«ăƒăƒ¼","popupTop":"ä¸ç«¯ă‹ă‚‰ă®åº§æ¨™ă§æŒ‡å®","rel":"é–¢é€£ăƒªăƒ³ă‚¯","selectAnchor":"ă‚¢ăƒ³ă‚«ăƒ¼ă‚’é¸æ","styles":"ă‚¹ă‚¿ă‚¤ăƒ«ă‚·ăƒ¼ăƒˆ","tabIndex":"ă‚¿ăƒ–ă‚¤ăƒ³ăƒ‡ăƒƒă‚¯ă‚¹","target":"ă‚¿ăƒ¼ă‚²ăƒƒăƒˆ","targetFrame":"<ăƒ•ăƒ¬ăƒ¼ăƒ >","targetFrameName":"ă‚¿ăƒ¼ă‚²ăƒƒăƒˆă®ăƒ•ăƒ¬ăƒ¼ăƒ å","targetPopup":"<ăƒăƒƒăƒ—ă‚¢ăƒƒăƒ—ă‚¦ă‚£ăƒ³ăƒ‰ă‚¦>","targetPopupName":"ăƒăƒƒăƒ—ă‚¢ăƒƒăƒ—ă‚¦ă‚£ăƒ³ăƒ‰ă‚¦å","title":"ăƒă‚¤ăƒ‘ăƒ¼ăƒªăƒ³ă‚¯","toAnchor":"ăƒăƒ¼ă‚¸å†…ă®ă‚¢ăƒ³ă‚«ăƒ¼","toEmail":"E-Mail","toUrl":"URL","toolbar":"ăƒªăƒ³ă‚¯æŒ¿å…¥/編集","type":"ăƒªăƒ³ă‚¯ă‚¿ă‚¤ăƒ—","unlink":"ăƒªăƒ³ă‚¯ă‚’å‰é™¤","upload":"ă‚¢ăƒƒăƒ—ăƒ­ăƒ¼ăƒ‰"},"list":{"bulletedlist":"番å·ç„¡ă—ăƒªă‚¹ăƒˆ","numberedlist":"番å·ä»˜ăăƒªă‚¹ăƒˆ"},"magicline":{"title":"ă“ă“ă«æ®µè½ă‚’挿入"},"maximize":{"maximize":"最大化","minimize":"最å°åŒ–"},"pastetext":{"button":"ăƒ—ăƒ¬ăƒ¼ăƒ³ăƒ†ă‚­ă‚¹ăƒˆă¨ă—ă¦è²¼ă‚付ă‘","title":"ăƒ—ăƒ¬ăƒ¼ăƒ³ăƒ†ă‚­ă‚¹ăƒˆă¨ă—ă¦è²¼ă‚付ă‘"},"pastefromword":{"confirmCleanup":"è²¼ă‚付ă‘ă‚’è¡Œă†ăƒ†ă‚­ă‚¹ăƒˆă¯ăƒ¯ăƒ¼ăƒ‰æ–‡ç« ă‹ă‚‰ă‚³ăƒ”ăƒ¼ă•ă‚Œă‚ˆă†ă¨ă—ă¦ă„ă¾ă™ă€‚è²¼ă‚付ă‘ă‚‹å‰ă«ă‚¯ăƒªăƒ¼ăƒ‹ăƒ³ă‚°ă‚’è¡Œă„ă¾ă™ă‹ï¼Ÿ","error":"å†…éƒ¨ă‚¨ăƒ©ăƒ¼ă«ă‚ˆă‚è²¼ă‚付ă‘ăŸăƒ‡ăƒ¼ă‚¿ă‚’ă‚¯ăƒªă‚¢ă§ăă¾ă›ă‚“ă§ă—ăŸ","title":"ăƒ¯ăƒ¼ăƒ‰æ–‡ç« ă‹ă‚‰è²¼ă‚付ă‘","toolbar":"ăƒ¯ăƒ¼ăƒ‰æ–‡ç« ă‹ă‚‰è²¼ă‚付ă‘"},"removeformat":{"toolbar":"書å¼ă‚’解除"},"sourcearea":{"toolbar":"ă‚½ăƒ¼ă‚¹"},"specialchar":{"options":"特æ®æ–‡å­—ă‚ªăƒ—ă‚·ăƒ§ăƒ³","title":"特æ®æ–‡å­—ă®é¸æ","toolbar":"特æ®æ–‡å­—ă‚’æŒ¿å…¥"},"scayt":{"btn_about":"SCAYTï¾ï¾ï½°ï½¼ï¾ï½®ï¾","btn_dictionaries":"è¾æ›¸","btn_disable":"SCAYTç„¡å¹","btn_enable":"SCAYT有å¹","btn_langs":"言èª","btn_options":"ă‚ªăƒ—ă‚·ăƒ§ăƒ³","text_title":"ă‚¹ăƒăƒ«ăƒă‚§ăƒƒă‚¯è¨­å®(SCAYT)"},"stylescombo":{"label":"ă‚¹ă‚¿ă‚¤ăƒ«","panelTitle":"ă‚¹ă‚¿ă‚¤ăƒ«","panelTitle1":"ăƒ–ăƒ­ăƒƒă‚¯ă‚¹ă‚¿ă‚¤ăƒ«","panelTitle2":"ă‚¤ăƒ³ăƒ©ă‚¤ăƒ³ă‚¹ă‚¿ă‚¤ăƒ«","panelTitle3":"ă‚ªăƒ–ă‚¸ă‚§ă‚¯ăƒˆă‚¹ă‚¿ă‚¤ăƒ«"},"table":{"border":"æ ç·ă®å¹…","caption":"ă‚­ăƒ£ăƒ—ă‚·ăƒ§ăƒ³","cell":{"menu":"ă‚»ăƒ«","insertBefore":"ă‚»ăƒ«ă‚’å‰ă«æŒ¿å…¥","insertAfter":"ă‚»ăƒ«ă‚’å¾Œă«æŒ¿å…¥","deleteCell":"ă‚»ăƒ«ă‚’å‰é™¤","merge":"ă‚»ăƒ«ă‚’çµåˆ","mergeRight":"å³ă«çµåˆ","mergeDown":"下ă«çµåˆ","splitHorizontal":"ă‚»ăƒ«ă‚’æ°´å¹³æ–¹å‘ă«åˆ†å‰²","splitVertical":"ă‚»ăƒ«ă‚’å‚ç›´æ–¹å‘ă«åˆ†å‰²","title":"ă‚»ăƒ«ă®ăƒ—ăƒ­ăƒ‘ăƒ†ă‚£","cellType":"ă‚»ăƒ«ă®ç¨®é¡","rowSpan":"è¡Œă®çµåˆæ•°","colSpan":"列ă®çµåˆæ•°","wordWrap":"å˜èªă®æ˜ă‚è¿”ă—","hAlign":"水平方å‘ă®é…ç½®","vAlign":"å‚ç›´æ–¹å‘ă®é…ç½®","alignBaseline":"ăƒ™ăƒ¼ă‚¹ăƒ©ă‚¤ăƒ³","bgColor":"背景色","borderColor":"ăƒœăƒ¼ăƒ€ăƒ¼ă‚«ăƒ©ăƒ¼","data":"ăƒ†ăƒ¼ăƒ–ăƒ«ăƒ‡ăƒ¼ă‚¿ (td)","header":"ăƒ˜ăƒƒăƒ€","yes":"ă¯ă„","no":"ă„ă„ăˆ","invalidWidth":"ă‚»ăƒ«å¹…ă¯æ•°å€¤ă§å…¥å›ă—ă¦ăă ă•ă„。","invalidHeight":"ă‚»ăƒ«é«˜ă•ă¯æ•°å€¤ă§å…¥å›ă—ă¦ăă ă•ă„。","invalidRowSpan":"縦幅(行数)ă¯æ•°å€¤ă§å…¥å›ă—ă¦ăă ă•ă„。","invalidColSpan":"横幅(列数)ă¯æ•°å€¤ă§å…¥å›ă—ă¦ăă ă•ă„。","chooseColor":"色ă®é¸æ"},"cellPad":"ă‚»ăƒ«å†…é–“é”","cellSpace":"ă‚»ăƒ«å†…ä½™ç™½","column":{"menu":"列","insertBefore":"åˆ—ă‚’å·¦ă«æŒ¿å…¥","insertAfter":"åˆ—ă‚’å³ă«æŒ¿å…¥","deleteColumn":"åˆ—ă‚’å‰é™¤"},"columns":"列数","deleteTable":"è¡¨ă‚’å‰é™¤","headers":"ăƒ˜ăƒƒăƒ€ (th)","headersBoth":"両方","headersColumn":"最åˆă®åˆ—ă®ă¿","headersNone":"ăªă—","headersRow":"最åˆă®è¡Œă®ă¿","invalidBorder":"æ ç·ă®å¹…ă¯æ•°å€¤ă§å…¥å›ă—ă¦ăă ă•ă„。","invalidCellPadding":"ă‚»ăƒ«å†…ä½™ç™½ă¯æ•°å€¤ă§å…¥å›ă—ă¦ăă ă•ă„。","invalidCellSpacing":"ă‚»ăƒ«é–“ä½™ç™½ă¯æ•°å€¤ă§å…¥å›ă—ă¦ăă ă•ă„。","invalidCols":"列数ă¯0ă‚ˆă‚大ăăªæ•°å€¤ă‚’å…¥å›ă—ă¦ăă ă•ă„。","invalidHeight":"高ă•ă¯æ•°å€¤ă§å…¥å›ă—ă¦ăă ă•ă„。","invalidRows":"行数ă¯0ă‚ˆă‚大ăăªæ•°å€¤ă‚’å…¥å›ă—ă¦ăă ă•ă„。","invalidWidth":"å¹…ă¯æ•°å€¤ă§å…¥å›ă—ă¦ăă ă•ă„。","menu":"表ă®ăƒ—ăƒ­ăƒ‘ăƒ†ă‚£","row":{"menu":"è¡Œ","insertBefore":"è¡Œă‚’ä¸ă«æŒ¿å…¥","insertAfter":"è¡Œă‚’ä¸‹ă«æŒ¿å…¥","deleteRow":"è¡Œă‚’å‰é™¤"},"rows":"行数","summary":"表ă®æ¦‚è¦","title":"表ă®ăƒ—ăƒ­ăƒ‘ăƒ†ă‚£","toolbar":"表","widthPc":"ăƒ‘ăƒ¼ă‚»ăƒ³ăƒˆ","widthPx":"ăƒ”ă‚¯ă‚»ăƒ«","widthUnit":"å¹…ă®å˜ä½"},"undo":{"redo":"ă‚„ă‚ç›´ă™","undo":"å…ƒă«æˆ»ă™"},"wsc":{"btnIgnore":"無視","btnIgnoreAll":"ă™ă¹ă¦ç„¡è¦–","btnReplace":"ç½®æ›","btnReplaceAll":"ă™ă¹ă¦ç½®æ›","btnUndo":"ă‚„ă‚ç›´ă—","changeTo":"変更","errorLoading":"ă‚¢ăƒ—ăƒªă‚±ăƒ¼ă‚·ăƒ§ăƒ³ă‚µăƒ¼ăƒ“ă‚¹ăƒ›ă‚¹ăƒˆèª­è¾¼ă¿ă‚¨ăƒ©ăƒ¼: %s.","ieSpellDownload":"ă‚¹ăƒăƒ«ăƒă‚§ăƒƒă‚«ăƒ¼ăŒă‚¤ăƒ³ă‚¹ăƒˆăƒ¼ăƒ«ă•ă‚Œă¦ă„ă¾ă›ă‚“。ä»ă™ăăƒ€ă‚¦ăƒ³ăƒ­ăƒ¼ăƒ‰ă—ă¾ă™ă‹?","manyChanges":"ă‚¹ăƒăƒ«ăƒă‚§ăƒƒă‚¯å®Œäº†: %1 èªå¥å¤‰æ›´ă•ă‚Œă¾ă—ăŸ","noChanges":"ă‚¹ăƒăƒ«ăƒă‚§ăƒƒă‚¯å®Œäº†: èªå¥ă¯å¤‰æ›´ă•ă‚Œă¾ă›ă‚“ă§ă—ăŸ","noMispell":"ă‚¹ăƒăƒ«ăƒă‚§ăƒƒă‚¯å®Œäº†: ă‚¹ăƒăƒ«ă®èª¤ă‚ă¯ă‚ă‚ă¾ă›ă‚“ă§ă—ăŸ","noSuggestions":"- 該当ăªă— -","notAvailable":"申ă—訳ă‚ă‚ă¾ă›ă‚“ă€ç¾åœ¨ă‚µăƒ¼ăƒ“ă‚¹ă‚’åˆ©ç”¨ă™ă‚‹ă“ă¨ăŒă§ăă¾ă›ă‚“","notInDic":"è¾æ›¸ă«ă‚ă‚ă¾ă›ă‚“","oneChange":"ă‚¹ăƒăƒ«ăƒă‚§ăƒƒă‚¯å®Œäº†: 1èªå¥å¤‰æ›´ă•ă‚Œă¾ă—ăŸ","progress":"ă‚¹ăƒăƒ«ăƒă‚§ăƒƒă‚¯å‡¦ç†ä¸­...","title":"ă‚¹ăƒăƒ«ăƒă‚§ăƒƒă‚¯","toolbar":"ă‚¹ăƒăƒ«ăƒă‚§ăƒƒă‚¯"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/ka.js b/js/ckeditor/lang/ka.js
new file mode 100644
index 0000000..52216b6
--- /dev/null
+++ b/js/ckeditor/lang/ka.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['ka']={"editor":"ტექსტის რედáƒáƒ¥áƒ¢áƒáƒ áƒ˜","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"დáƒáƒáƒ­áƒ˜áƒ áƒ”თ ALT 0-ს დáƒáƒ®áƒ›áƒáƒ áƒ”ბის მისáƒáƒ¦áƒ”ბáƒáƒ“","browseServer":"სერვერზე დáƒáƒ—ვáƒáƒáƒ˜áƒ”რებáƒ","url":"URL","protocol":"áƒáƒ áƒáƒ¢áƒáƒ™áƒáƒáƒ˜","upload":"áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვáƒ","uploadSubmit":"სერვერზე გáƒáƒ’ზáƒáƒ•áƒœáƒ","image":"სურáƒáƒ—ი","flash":"Flash","form":"ფáƒáƒ áƒ›áƒ","checkbox":"მáƒáƒœáƒ˜áƒ¨áƒ•áƒœáƒ˜áƒ¡ ღიáƒáƒáƒ™áƒ˜","radio":"áƒáƒ›áƒáƒ áƒ©áƒ”ვის ღიáƒáƒáƒ™áƒ˜","textField":"ტექსტური ვეáƒáƒ˜","textarea":"ტექსტური áƒáƒ áƒ”","hiddenField":"მáƒáƒáƒ£áƒáƒ˜ ვეáƒáƒ˜","button":"ღიáƒáƒáƒ™áƒ˜","select":"áƒáƒ áƒ©áƒ”ვის ვეáƒáƒ˜","imageButton":"სურáƒáƒ—იáƒáƒœáƒ˜ ღიáƒáƒáƒ™áƒ˜","notSet":"<áƒáƒ áƒáƒ¤áƒ”რი>","id":"Id","name":"სáƒáƒ®áƒ”áƒáƒ˜","langDir":"ენის მიმáƒáƒ áƒ—უáƒáƒ”ბáƒ","langDirLtr":"მáƒáƒ áƒªáƒ®áƒœáƒ˜áƒ“áƒáƒœ მáƒáƒ áƒ¯áƒ•áƒœáƒ˜áƒ• (LTR)","langDirRtl":"მáƒáƒ áƒ¯áƒ•áƒœáƒ˜áƒ“áƒáƒœ მáƒáƒ áƒªáƒ®áƒœáƒ˜áƒ• (RTL)","langCode":"ენის კáƒáƒ“ი","longDescr":"დიდი áƒáƒ¦áƒ¬áƒ”რის URL","cssClass":"CSS კáƒáƒáƒ¡áƒ˜","advisoryTitle":"სáƒáƒ—áƒáƒ£áƒ áƒ˜","cssStyle":"CSS სტიáƒáƒ˜","ok":"დიáƒáƒ®","cancel":"გáƒáƒ£áƒ¥áƒ›áƒ”ბáƒ","close":"დáƒáƒ®áƒ£áƒ áƒ•áƒ","preview":"გáƒáƒ“áƒáƒ®áƒ”დვáƒ","resize":"გáƒáƒ¬áƒ˜áƒ” ზáƒáƒ›áƒ˜áƒ¡ შესáƒáƒªáƒ•áƒáƒ”áƒáƒáƒ“","generalTab":"ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ","advancedTab":"გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბუáƒáƒ˜","validateNumberFailed":"ეს მნიშვნეáƒáƒáƒ‘რáƒáƒ áƒáƒ რიცხვი.","confirmNewPage":"áƒáƒ› დáƒáƒ™áƒ£áƒ›áƒ”ნტში ყვეáƒáƒ ჩáƒáƒ£áƒ¬áƒ”რეáƒáƒ˜ ცვáƒáƒ˜áƒáƒ”ბრდáƒáƒ˜áƒ™áƒáƒ áƒ’ებáƒ. დáƒáƒ áƒ¬áƒ›áƒ£áƒœáƒ”ბუáƒáƒ˜ ხáƒáƒ áƒ— რáƒáƒ› áƒáƒ®áƒáƒáƒ˜ გვერდის ჩáƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვრგინდáƒáƒ—?","confirmCancel":"ზáƒáƒ’იერთი áƒáƒáƒ áƒáƒ›áƒ”ტრი შეცვáƒáƒ˜áƒáƒ˜áƒ, დáƒáƒ áƒ¬áƒ›áƒ£áƒœáƒ”ბუáƒáƒ˜áƒ ხáƒáƒ áƒ— რáƒáƒ› ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ დáƒáƒ®áƒ£áƒ áƒ•áƒ გსურთ?","options":"áƒáƒáƒ áƒáƒ›áƒ”ტრები","target":"გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ áƒáƒ“გიáƒáƒ˜","targetNew":"áƒáƒ®áƒáƒáƒ˜ ფáƒáƒœáƒ¯áƒáƒ áƒ (_blank)","targetTop":"ზედრფáƒáƒœáƒ¯áƒáƒ áƒ (_top)","targetSelf":"იგივე ფáƒáƒœáƒ¯áƒáƒ áƒ (_self)","targetParent":"მშáƒáƒ‘ეáƒáƒ˜ ფáƒáƒœáƒ¯áƒáƒ áƒ (_parent)","langDirLTR":"მáƒáƒ áƒªáƒ®áƒœáƒ˜áƒ“áƒáƒœ მáƒáƒ áƒ¯áƒ•áƒœáƒ˜áƒ• (LTR)","langDirRTL":"მáƒáƒ áƒ¯áƒ•áƒœáƒ˜áƒ“áƒáƒœ მáƒáƒ áƒªáƒ®áƒœáƒ˜áƒ• (RTL)","styles":"სტიáƒáƒ˜","cssClasses":"CSS კáƒáƒáƒ¡áƒ˜","width":"სიგáƒáƒœáƒ”","height":"სიმáƒáƒ¦áƒáƒ”","align":"სწáƒáƒ áƒ”ბáƒ","alignLeft":"მáƒáƒ áƒªáƒ®áƒ”ნáƒ","alignRight":"მáƒáƒ áƒ¯áƒ•áƒ”ნáƒ","alignCenter":"შუáƒ","alignJustify":"両端æƒăˆ","alignTop":"ზემáƒáƒ—áƒ","alignMiddle":"შუáƒ","alignBottom":"ქვემáƒáƒ—áƒ","alignNone":"None","invalidValue":"Invalid value.","invalidHeight":"სიმáƒáƒ¦áƒáƒ” რიცხვით უნდრიყáƒáƒ¡ წáƒáƒ áƒ›áƒáƒ“გენიáƒáƒ˜.","invalidWidth":"სიგáƒáƒœáƒ” რიცხვით უნდრიყáƒáƒ¡ წáƒáƒ áƒ›áƒáƒ“გენიáƒáƒ˜.","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\">, მიუწვდáƒáƒ›áƒ”áƒáƒ˜áƒ</span>"},"about":{"copy":"Copyright &copy; $1. ყვეáƒáƒ უფáƒáƒ”ბრდáƒáƒªáƒ£áƒáƒ˜áƒ.","dlgTitle":"CKEditor-ის შესáƒáƒ®áƒ”ბ","help":"დáƒáƒ®áƒ›áƒáƒ áƒ”ბისთვის იხიáƒáƒ”თ $1.","moreInfo":"áƒáƒ˜áƒªáƒ”ნზიის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის ეწვიეთ ჩვენს სáƒáƒ˜áƒ¢áƒ¡:","title":"CKEditor-ის შესáƒáƒ®áƒ”ბ","userGuide":"CKEditor-ის მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბáƒáƒ˜áƒ¡ სáƒáƒ®áƒ”áƒáƒ›áƒ«áƒ¦áƒ•áƒáƒœáƒ”áƒáƒ"},"basicstyles":{"bold":"მსხვიáƒáƒ˜","italic":"დáƒáƒ®áƒ áƒ˜áƒáƒ˜","strike":"გáƒáƒ“áƒáƒ®áƒáƒ–უáƒáƒ˜","subscript":"ინდექსი","superscript":"ხáƒáƒ áƒ˜áƒ¡áƒ®áƒ˜","underline":"გáƒáƒ®áƒáƒ–უáƒáƒ˜"},"blockquote":{"toolbar":"ციტáƒáƒ¢áƒ"},"clipboard":{"copy":"áƒáƒ¡áƒáƒ˜","copyError":"თქვენი ბრáƒáƒ£áƒ–ერის უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბის áƒáƒáƒ áƒáƒ›áƒ”ტრები áƒáƒ  იძáƒáƒ”ვრáƒáƒ¡áƒáƒ˜áƒ¡ áƒáƒáƒ”რáƒáƒªáƒ˜áƒ˜áƒ¡ áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒáƒ“ გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”áƒáƒ”ბის სáƒáƒ¨áƒ£áƒáƒáƒ”ბáƒáƒ¡. გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ კáƒáƒáƒ•áƒ˜áƒáƒ¢áƒ£áƒ áƒ áƒáƒ›áƒ˜áƒ¡áƒ—ვის (Ctrl/Cmd+C).","cut":"áƒáƒ›áƒáƒ­áƒ áƒ","cutError":"თქვენი ბრáƒáƒ£áƒ–ერის უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბის áƒáƒáƒ áƒáƒ›áƒ”ტრები áƒáƒ  იძáƒáƒ”ვრáƒáƒ›áƒáƒ­áƒ áƒ˜áƒ¡ áƒáƒáƒ”რáƒáƒªáƒ˜áƒ˜áƒ¡ áƒáƒ•áƒ¢áƒáƒ›áƒáƒ¢áƒ£áƒ áƒáƒ“ გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”áƒáƒ”ბის სáƒáƒ¨áƒ£áƒáƒáƒ”ბáƒáƒ¡. გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ კáƒáƒáƒ•áƒ˜áƒáƒ¢áƒ£áƒ áƒ áƒáƒ›áƒ˜áƒ¡áƒ—ვის (Ctrl/Cmd+X).","paste":"ჩáƒáƒ¡áƒ›áƒ","pasteArea":"ჩáƒáƒ¡áƒ›áƒ˜áƒ¡ áƒáƒ áƒ”","pasteMsg":"ჩáƒáƒ¡áƒ•áƒ˜áƒ— áƒáƒ› áƒáƒ áƒ˜áƒ¡ შიგნით კáƒáƒáƒ•áƒ˜áƒáƒ¢áƒ£áƒ áƒ˜áƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებით (<strong>Ctrl/Cmd+V</strong>) დრდáƒáƒáƒ­áƒ˜áƒ áƒ”თ OK-ს","securityMsg":"თქვენი ბრáƒáƒ£áƒ–ერის უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბის áƒáƒáƒ áƒáƒ›áƒ”ტრები áƒáƒ  იძáƒáƒ”ვრclipboard-ის მáƒáƒœáƒáƒªáƒ”მების წვდáƒáƒ›áƒ˜áƒ¡ უფáƒáƒ”ბáƒáƒ¡. კიდევ უნდრჩáƒáƒ¡áƒ•áƒáƒ— ტექსტი áƒáƒ› ფáƒáƒœáƒ¯áƒáƒ áƒáƒ¨áƒ˜.","title":"ჩáƒáƒ¡áƒ›áƒ"},"contextmenu":{"options":"კáƒáƒœáƒ¢áƒ”ქსტური მენიუს áƒáƒáƒ áƒáƒ›áƒ”ტრები"},"button":{"selectedLabel":"%1 (Selected)"},"toolbar":{"toolbarCollapse":"ხეáƒáƒ¡áƒáƒ¬áƒ§áƒáƒ—რზáƒáƒáƒ˜áƒ¡ შეწევáƒ","toolbarExpand":"ხეáƒáƒ¡áƒáƒ¬áƒ§áƒáƒ—რზáƒáƒáƒ˜áƒ¡ გáƒáƒ›áƒáƒ¬áƒ”ვáƒ","toolbarGroups":{"document":"დáƒáƒ™áƒ£áƒ›áƒ”ნტი","clipboard":"Clipboard/გáƒáƒ£áƒ¥áƒ›áƒ”ბáƒ","editing":"რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ","forms":"ფáƒáƒ áƒ›áƒ”ბი","basicstyles":"ძირითáƒáƒ“ი სტიáƒáƒ”ბი","paragraph":"áƒáƒ‘ზáƒáƒªáƒ˜","links":"ბმუáƒáƒ”ბი","insert":"ჩáƒáƒ¡áƒ›áƒ","styles":"სტიáƒáƒ”ბი","colors":"ფერები","tools":"ხეáƒáƒ¡áƒáƒ¬áƒ§áƒáƒ”ბი"},"toolbars":"Editor toolbars"},"elementspath":{"eleLabel":"ეáƒáƒ”მეტის გზáƒ","eleTitle":"%1 ეáƒáƒ”მენტი"},"format":{"label":"ფიáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ áƒ”ბáƒ","panelTitle":"ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ áƒ”ბáƒ","tag_address":"მისáƒáƒ›áƒáƒ áƒ—ი","tag_div":"ჩვეუáƒáƒ”ბრივი (DIV)","tag_h1":"სáƒáƒ—áƒáƒ£áƒ áƒ˜ 1","tag_h2":"სáƒáƒ—áƒáƒ£áƒ áƒ˜ 2","tag_h3":"სáƒáƒ—áƒáƒ£áƒ áƒ˜ 3","tag_h4":"სáƒáƒ—áƒáƒ£áƒ áƒ˜ 4","tag_h5":"სáƒáƒ—áƒáƒ£áƒ áƒ˜ 5","tag_h6":"სáƒáƒ—áƒáƒ£áƒ áƒ˜ 6","tag_p":"ჩვეუáƒáƒ”ბრივი","tag_pre":"ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ áƒ”ბუáƒáƒ˜"},"horizontalrule":{"toolbar":"ჰáƒáƒ áƒ˜áƒ–áƒáƒœáƒ¢áƒáƒáƒ£áƒ áƒ˜ ხáƒáƒ–ის ჩáƒáƒ¡áƒ›áƒ"},"image":{"alertUrl":"áƒáƒ™áƒ áƒ˜áƒ¤áƒ”თ სურáƒáƒ—ის URL","alt":"სáƒáƒœáƒáƒªáƒ•áƒáƒ ტექსტი","border":"ჩáƒáƒ áƒ©áƒ","btnUpload":"სერვერისთვის გáƒáƒ’ზáƒáƒ•áƒœáƒ","button2Img":"გსურთ áƒáƒ áƒ©áƒ”უáƒáƒ˜ სურáƒáƒ—იáƒáƒœáƒ˜ ღიáƒáƒáƒ™áƒ˜áƒ¡ გáƒáƒ“áƒáƒ¥áƒªáƒ”ვრჩვეუáƒáƒ”ბრივ ღიáƒáƒáƒ™áƒáƒ“?","hSpace":"ჰáƒáƒ áƒ˜áƒ–áƒáƒœáƒ¢áƒáƒáƒ£áƒ áƒ˜ სივრცე","img2Button":"გსურთ áƒáƒ áƒ©áƒ”უáƒáƒ˜ ჩვეუáƒáƒ”ბრივი ღიáƒáƒáƒ™áƒ˜áƒ¡ გáƒáƒ“áƒáƒ¥áƒªáƒ”ვრსურáƒáƒ—იáƒáƒœ ღიáƒáƒáƒ™áƒáƒ“?","infoTab":"სურáƒáƒ—ის ინფáƒáƒ áƒ›áƒªáƒ˜áƒ","linkTab":"ბმუáƒáƒ˜","lockRatio":"áƒáƒ áƒáƒáƒáƒ áƒªáƒ˜áƒ˜áƒ¡ შენáƒáƒ áƒ©áƒ£áƒœáƒ”ბáƒ","menu":"სურáƒáƒ—ის áƒáƒáƒ áƒáƒ›áƒ”ტრები","resetSize":"ზáƒáƒ›áƒ˜áƒ¡ დáƒáƒ‘რუნებáƒ","title":"სურáƒáƒ—ის áƒáƒáƒ áƒáƒ›áƒ”ტრები","titleButton":"სურáƒáƒ—იáƒáƒœáƒ˜ ღიáƒáƒáƒ™áƒ˜áƒ¡ áƒáƒáƒ áƒáƒ›áƒ”ტრები","upload":"áƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვáƒ","urlMissing":"სურáƒáƒ—ის URL áƒáƒ áƒáƒ შევსებუáƒáƒ˜.","vSpace":"ვერტიკáƒáƒáƒ£áƒ áƒ˜ სივრცე","validateBorder":"ჩáƒáƒ áƒ©áƒ მთეáƒáƒ˜ რიცხვი უნდრიყáƒáƒ¡.","validateHSpace":"ჰáƒáƒ áƒ˜áƒ–áƒáƒœáƒ¢áƒáƒáƒ£áƒ áƒ˜ სივრცე მთეáƒáƒ˜ რიცხვი უნდრიყáƒáƒ¡.","validateVSpace":"ვერტიკáƒáƒáƒ£áƒ áƒ˜ სივრცე მთეáƒáƒ˜ რიცხვი უნდრიყáƒáƒ¡."},"indent":{"indent":"მეტáƒáƒ“ შეწევáƒ","outdent":"ნáƒáƒ™áƒáƒ”ბáƒáƒ“ შეწევáƒ"},"fakeobjects":{"anchor":"ღუზáƒ","flash":"Flash áƒáƒœáƒ˜áƒ›áƒáƒªáƒ˜áƒ","hiddenfield":"მáƒáƒáƒ£áƒáƒ˜ ვეáƒáƒ˜","iframe":"IFrame","unknown":"უცნáƒáƒ‘ი áƒáƒ‘იექტი"},"link":{"acccessKey":"წვდáƒáƒ›áƒ˜áƒ¡ ღიáƒáƒáƒ™áƒ˜","advanced":"დáƒáƒ¬áƒ•áƒ áƒ˜áƒáƒ”ბით","advisoryContentType":"შიგთáƒáƒ•áƒ¡áƒ˜áƒ¡ ტიáƒáƒ˜","advisoryTitle":"სáƒáƒ—áƒáƒ£áƒ áƒ˜","anchor":{"toolbar":"ღუზáƒ","menu":"ღუზის რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ","title":"ღუზის áƒáƒáƒ áƒáƒ›áƒ”ტრები","name":"ღუზუს სáƒáƒ®áƒ”áƒáƒ˜","errorName":"áƒáƒ™áƒ áƒ˜áƒ¤áƒ”თ ღუზის სáƒáƒ®áƒ”áƒáƒ˜","remove":"Remove Anchor"},"anchorId":"ეáƒáƒ”მენტის Id-თ","anchorName":"ღუზის სáƒáƒ®áƒ”áƒáƒ˜áƒ—","charset":"კáƒáƒ“ირებáƒ","cssClasses":"CSS კáƒáƒáƒ¡áƒ˜","emailAddress":"ეáƒáƒ¤áƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ები","emailBody":"წერიáƒáƒ˜áƒ¡ ტექსტი","emailSubject":"წერიáƒáƒ˜áƒ¡ სáƒáƒ—áƒáƒ£áƒ áƒ˜","id":"Id","info":"ბმუáƒáƒ˜áƒ¡ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ","langCode":"ენის კáƒáƒ“ი","langDir":"ენის მიმáƒáƒ áƒ—უáƒáƒ”ბáƒ","langDirLTR":"მáƒáƒ áƒªáƒ®áƒœáƒ˜áƒ“áƒáƒœ მáƒáƒ áƒ¯áƒ•áƒœáƒ˜áƒ• (LTR)","langDirRTL":"მáƒáƒ áƒ¯áƒ•áƒœáƒ˜áƒ“áƒáƒœ მáƒáƒ áƒªáƒ®áƒœáƒ˜áƒ• (RTL)","menu":"ბმუáƒáƒ˜áƒ¡ რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბáƒ","name":"სáƒáƒ®áƒ”áƒáƒ˜","noAnchors":"(áƒáƒ› დáƒáƒ™áƒ£áƒ›áƒ”ნტში ღუზრáƒáƒ áƒáƒ)","noEmail":"áƒáƒ™áƒ áƒ˜áƒ¤áƒ”თ ეáƒáƒ¤áƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ი","noUrl":"áƒáƒ™áƒ áƒ˜áƒ¤áƒ”თ ბმუáƒáƒ˜áƒ¡ URL","other":"<სხვáƒ>","popupDependent":"დáƒáƒ›áƒáƒ™áƒ˜áƒ“ებუáƒáƒ˜ (Netscape)","popupFeatures":"Popup ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ áƒáƒáƒ áƒáƒ›áƒ”ტრები","popupFullScreen":"მთეáƒáƒ˜ ეკრáƒáƒœáƒ˜ (IE)","popupLeft":"მáƒáƒ áƒªáƒ®áƒ”ნრáƒáƒáƒ–იციáƒ","popupLocationBar":"ნáƒáƒ•áƒ˜áƒ’áƒáƒªáƒ˜áƒ˜áƒ¡ ზáƒáƒáƒ˜","popupMenuBar":"მენიუს ზáƒáƒáƒ˜","popupResizable":"ცვáƒáƒáƒ”ბáƒáƒ“ი ზáƒáƒ›áƒ˜áƒ—","popupScrollBars":"გáƒáƒ“áƒáƒ®áƒ•áƒ”ვის ზáƒáƒáƒ”ბი","popupStatusBar":"სტáƒáƒ¢áƒ£áƒ¡áƒ˜áƒ¡ ზáƒáƒáƒ˜","popupToolbar":"ხეáƒáƒ¡áƒáƒ¬áƒ§áƒáƒ—რზáƒáƒáƒ˜","popupTop":"ზედრáƒáƒáƒ–იციáƒ","rel":"კáƒáƒ•áƒ¨áƒ˜áƒ áƒ˜","selectAnchor":"áƒáƒ˜áƒ áƒ©áƒ˜áƒ”თ ღუზáƒ","styles":"CSS სტიáƒáƒ˜","tabIndex":"Tab-ის ინდექსი","target":"გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ áƒáƒ“გიáƒáƒ˜","targetFrame":"<frame>","targetFrameName":"Frame-ის სáƒáƒ®áƒ”áƒáƒ˜","targetPopup":"<popup ფáƒáƒœáƒ¯áƒáƒ áƒ>","targetPopupName":"Popup ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ სáƒáƒ®áƒ”áƒáƒ˜","title":"ბმუáƒáƒ˜","toAnchor":"ბმუáƒáƒ˜ ტექსტში ღუზáƒáƒ–ე","toEmail":"ეáƒáƒ¤áƒáƒ¡áƒ¢áƒ","toUrl":"URL","toolbar":"ბმუáƒáƒ˜","type":"ბმუáƒáƒ˜áƒ¡ ტიáƒáƒ˜","unlink":"ბმუáƒáƒ˜áƒ¡ მáƒáƒ®áƒ¡áƒœáƒ","upload":"áƒáƒ¥áƒáƒ©áƒ•áƒ"},"list":{"bulletedlist":"ღიáƒáƒ˜áƒáƒœáƒ˜ სიáƒ","numberedlist":"გáƒáƒ“áƒáƒœáƒáƒ›áƒ áƒ˜áƒáƒ˜ სიáƒ"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"გáƒáƒ“იდებáƒ","minimize":"დáƒáƒáƒáƒ¢áƒáƒ áƒáƒ•áƒ”ბáƒ"},"pastetext":{"button":"მხáƒáƒáƒáƒ“ ტექსტის ჩáƒáƒ¡áƒ›áƒ","title":"მხáƒáƒáƒáƒ“ ტექსტის ჩáƒáƒ¡áƒ›áƒ"},"pastefromword":{"confirmCleanup":"ჩáƒáƒ¡áƒáƒ¡áƒ›áƒ”áƒáƒ˜ ტექსტი ვáƒáƒ áƒ“იდáƒáƒœ გáƒáƒ“მáƒáƒ¢áƒáƒœáƒ˜áƒáƒ¡ გáƒáƒ•áƒ¡ - გინდáƒáƒ— მისი წინáƒáƒ¡áƒ¬áƒáƒ  გáƒáƒ¬áƒ›áƒ”ნდáƒ?","error":"შიდრშეცდáƒáƒ›áƒ˜áƒ¡ გáƒáƒ›áƒ ვერ მáƒáƒ®áƒ”რხდრტექსტის გáƒáƒ¬áƒ›áƒ”ნდáƒ","title":"ვáƒáƒ áƒ“იდáƒáƒœ ჩáƒáƒ¡áƒ›áƒ","toolbar":"ვáƒáƒ áƒ“იდáƒáƒœ ჩáƒáƒ¡áƒ›áƒ"},"removeformat":{"toolbar":"ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ áƒ”ბის მáƒáƒ®áƒ¡áƒœáƒ"},"sourcearea":{"toolbar":"კáƒáƒ“ები"},"specialchar":{"options":"სáƒáƒ”ციáƒáƒáƒ£áƒ áƒ˜ სიმბáƒáƒáƒáƒ¡ áƒáƒáƒ áƒáƒ›áƒ”ტრები","title":"სáƒáƒ”ციáƒáƒáƒ£áƒ áƒ˜ სიმბáƒáƒáƒáƒ¡ áƒáƒ áƒ©áƒ”ვáƒ","toolbar":"სáƒáƒ”ციáƒáƒáƒ£áƒ áƒ˜ სიმბáƒáƒáƒáƒ¡ ჩáƒáƒ¡áƒ›áƒ"},"scayt":{"btn_about":"SCAYT-ის შესáƒáƒ®áƒ”ბ","btn_dictionaries":"áƒáƒ”ქსიკáƒáƒœáƒ”ბი","btn_disable":"SCAYT-ის გáƒáƒ›áƒáƒ áƒ—ვáƒ","btn_enable":"SCAYT-ის ჩáƒáƒ áƒ—ვáƒ","btn_langs":"ენები","btn_options":"áƒáƒáƒ áƒáƒ›áƒ”ტრები","text_title":"მáƒáƒ áƒ—áƒáƒ¬áƒ”რის შემáƒáƒ¬áƒ›áƒ”ბრკრეფისáƒáƒ¡"},"stylescombo":{"label":"სტიáƒáƒ”ბი","panelTitle":"ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ áƒ”ბის სტიáƒáƒ”ბი","panelTitle1":"áƒáƒ áƒ˜áƒ¡ სტიáƒáƒ”ბი","panelTitle2":"თáƒáƒœáƒ“áƒáƒ áƒ—უáƒáƒ˜ სტიáƒáƒ”ბი","panelTitle3":"áƒáƒ‘იექტის სტიáƒáƒ”ბი"},"table":{"border":"ჩáƒáƒ áƒ©áƒáƒ¡ ზáƒáƒ›áƒ","caption":"სáƒáƒ—áƒáƒ£áƒ áƒ˜","cell":{"menu":"უჯრáƒ","insertBefore":"უჯრის ჩáƒáƒ¡áƒ›áƒ მáƒáƒœáƒáƒ›áƒ“ე","insertAfter":"უჯრის ჩáƒáƒ¡áƒ›áƒ მერე","deleteCell":"უჯრების წáƒáƒ¨áƒáƒ","merge":"უჯრების შეერთებáƒ","mergeRight":"შეერთებრმáƒáƒ áƒ¯áƒ•áƒ”ნáƒáƒ¡áƒ—áƒáƒœ","mergeDown":"შეერთებრქვემáƒáƒ—áƒáƒ¡áƒ—áƒáƒœ","splitHorizontal":"გáƒáƒ§áƒáƒ¤áƒ ჰáƒáƒ áƒ˜áƒ–áƒáƒœáƒ¢áƒáƒáƒ£áƒ áƒáƒ“","splitVertical":"გáƒáƒ§áƒáƒ¤áƒ ვერტიკáƒáƒáƒ£áƒ áƒáƒ“","title":"უჯრის áƒáƒáƒ áƒáƒ›áƒ”ტრები","cellType":"უჯრის ტიáƒáƒ˜","rowSpan":"სტრიქáƒáƒœáƒ”ბის áƒáƒ“ენáƒáƒ‘áƒ","colSpan":"სვეტების áƒáƒ“ენáƒáƒ‘áƒ","wordWrap":"სტრიქáƒáƒœáƒ˜áƒ¡ გáƒáƒ“áƒáƒ¢áƒáƒœáƒ (Word Wrap)","hAlign":"ჰáƒáƒ áƒ˜áƒ–áƒáƒœáƒ¢áƒáƒáƒ£áƒ áƒ˜ სწáƒáƒ áƒ”ბáƒ","vAlign":"ვერტიკáƒáƒáƒ£áƒ áƒ˜ სწáƒáƒ áƒ”ბáƒ","alignBaseline":"ძირითáƒáƒ“ი ხáƒáƒ–ის გáƒáƒ¡áƒ¬áƒ•áƒ áƒ˜áƒ•","bgColor":"ფáƒáƒœáƒ˜áƒ¡ ფერი","borderColor":"ჩáƒáƒ áƒ©áƒáƒ¡ ფერი","data":"მáƒáƒœáƒáƒªáƒ”მები","header":"სáƒáƒ—áƒáƒ£áƒ áƒ˜","yes":"დიáƒáƒ®","no":"áƒáƒ áƒ","invalidWidth":"უჯრის სიგáƒáƒœáƒ” რიცხვით უნდრიყáƒáƒ¡ წáƒáƒ áƒ›áƒáƒ“გენიáƒáƒ˜.","invalidHeight":"უჯრის სიმáƒáƒ¦áƒáƒ” რიცხვით უნდრიყáƒáƒ¡ წáƒáƒ áƒ›áƒáƒ“გენიáƒáƒ˜.","invalidRowSpan":"სტრიქáƒáƒœáƒ”ბის რáƒáƒáƒ“ენáƒáƒ‘რმთეáƒáƒ˜ რიცხვი უნდრიყáƒáƒ¡.","invalidColSpan":"სვეტების რáƒáƒáƒ“ენáƒáƒ‘რმთეáƒáƒ˜ რიცხვი უნდრიყáƒáƒ¡.","chooseColor":"áƒáƒ áƒ©áƒ”ვáƒ"},"cellPad":"უჯრის კიდე (padding)","cellSpace":"უჯრის სივრცე (spacing)","column":{"menu":"სვეტი","insertBefore":"სვეტის ჩáƒáƒ›áƒáƒ¢áƒ”ბრწინ","insertAfter":"სვეტის ჩáƒáƒ›áƒáƒ¢áƒ”ბრმერე","deleteColumn":"სვეტების წáƒáƒ¨áƒáƒ"},"columns":"სვეტი","deleteTable":"ცხრიáƒáƒ˜áƒ¡ წáƒáƒ¨áƒáƒ","headers":"სáƒáƒ—áƒáƒ£áƒ áƒ”ბი","headersBoth":"áƒáƒ áƒ˜áƒ•áƒ”","headersColumn":"áƒáƒ˜áƒ áƒ•áƒ”áƒáƒ˜ სვეტი","headersNone":"áƒáƒ áƒáƒ¤áƒ”რი","headersRow":"áƒáƒ˜áƒ áƒ•áƒ”áƒáƒ˜ სტრიქáƒáƒœáƒ˜","invalidBorder":"ჩáƒáƒ áƒ©áƒáƒ¡ ზáƒáƒ›áƒ რიცხვით უდნრიყáƒáƒ¡ წáƒáƒ áƒ›áƒáƒ“გენიáƒáƒ˜.","invalidCellPadding":"უჯრის კიდე (padding) რიცხვით უნდრიყáƒáƒ¡ წáƒáƒ áƒ›áƒáƒ“გენიáƒáƒ˜.","invalidCellSpacing":"უჯრის სივრცე (spacing) რიცხვით უნდრიყáƒáƒ¡ წáƒáƒ áƒ›áƒáƒ“გენიáƒáƒ˜.","invalidCols":"სვეტების რáƒáƒáƒ“ენáƒáƒ‘რდáƒáƒ“ებითი რიცხვი უნდრიყáƒáƒ¡.","invalidHeight":"ცხრიáƒáƒ˜áƒ¡ სიმáƒáƒ¦áƒáƒ” რიცხვით უნდრიყáƒáƒ¡ წáƒáƒ áƒ›áƒáƒ“გენიáƒáƒ˜.","invalidRows":"სტრიქáƒáƒœáƒ”ბის რáƒáƒáƒ“ენáƒáƒ‘რდáƒáƒ“ებითი რიცხვი უნდრიყáƒáƒ¡.","invalidWidth":"ცხრიáƒáƒ˜áƒ¡ სიგáƒáƒœáƒ” რიცხვით უნდრიყáƒáƒ¡ წáƒáƒ áƒ›áƒáƒ“გენიáƒáƒ˜.","menu":"ცხრიáƒáƒ˜áƒ¡ áƒáƒáƒ áƒáƒ›áƒ”ტრები","row":{"menu":"სტრიქáƒáƒœáƒ˜","insertBefore":"სტრიქáƒáƒœáƒ˜áƒ¡ ჩáƒáƒ›áƒáƒ¢áƒ”ბრწინ","insertAfter":"სტრიქáƒáƒœáƒ˜áƒ¡ ჩáƒáƒ›áƒáƒ¢áƒ”ბრმერე","deleteRow":"სტრიქáƒáƒœáƒ”ბის წáƒáƒ¨áƒáƒ"},"rows":"სტრიქáƒáƒœáƒ˜","summary":"შეჯáƒáƒ›áƒ”ბáƒ","title":"ცხრიáƒáƒ˜áƒ¡ áƒáƒáƒ áƒáƒ›áƒ”ტრები","toolbar":"ცხრიáƒáƒ˜","widthPc":"áƒáƒ áƒáƒªáƒ”ნტი","widthPx":"წერტიáƒáƒ˜","widthUnit":"სáƒáƒ–áƒáƒ›áƒ˜ ერთეუáƒáƒ˜"},"undo":{"redo":"გáƒáƒ›áƒ”áƒáƒ áƒ”ბáƒ","undo":"გáƒáƒ£áƒ¥áƒ›áƒ”ბáƒ"},"wsc":{"btnIgnore":"უგუáƒáƒ”ბეáƒáƒ§áƒáƒ¤áƒ","btnIgnoreAll":"ყვეáƒáƒáƒ¡ უგუáƒáƒ”ბეáƒáƒ§áƒáƒ¤áƒ","btnReplace":"შეცვáƒáƒ","btnReplaceAll":"ყვეáƒáƒáƒ¡ შეცვáƒáƒ","btnUndo":"გáƒáƒ£áƒ¥áƒ›áƒ”ბáƒ","changeTo":"შეცვáƒáƒ”áƒáƒ˜","errorLoading":"სერვისის გáƒáƒ›áƒáƒ«áƒáƒ®áƒ”ბის შეცდáƒáƒ›áƒ: %s.","ieSpellDownload":"მáƒáƒ áƒ—áƒáƒ¬áƒ”რის შემáƒáƒ¬áƒ›áƒ”ბრáƒáƒ áƒáƒ დáƒáƒ˜áƒœáƒ¡áƒ¢áƒáƒáƒ˜áƒ áƒ”ბუáƒáƒ˜. ჩáƒáƒ›áƒáƒ•áƒ¥áƒáƒ©áƒáƒ— ინტერნეტიდáƒáƒœ?","manyChanges":"მáƒáƒ áƒ—áƒáƒ¬áƒ”რის შემáƒáƒ¬áƒ›áƒ”ბáƒ: %1 სიტყვრშეიცვáƒáƒáƒ","noChanges":"მáƒáƒ áƒ—áƒáƒ¬áƒ”რის შემáƒáƒ¬áƒ›áƒ”ბáƒ: áƒáƒ áƒáƒ¤áƒ”რი შეცვáƒáƒ˜áƒáƒ","noMispell":"მáƒáƒ áƒ—áƒáƒ¬áƒ”რის შემáƒáƒ¬áƒ›áƒ”ბáƒ: შეცდáƒáƒ›áƒ áƒáƒ  მáƒáƒ˜áƒ«áƒ”ბნáƒ","noSuggestions":"- áƒáƒ áƒáƒ შემáƒáƒ—áƒáƒ•áƒáƒ–ებრ-","notAvailable":"უკáƒáƒªáƒ áƒáƒ•áƒáƒ“, ეს სერვისი áƒáƒ›áƒŸáƒáƒ›áƒáƒ“ მიუწვდáƒáƒ›áƒ”áƒáƒ˜áƒ.","notInDic":"áƒáƒ áƒáƒ áƒáƒ”ქსიკáƒáƒœáƒ¨áƒ˜","oneChange":"მáƒáƒ áƒ—áƒáƒ¬áƒ”რის შემáƒáƒ¬áƒ›áƒ”ბáƒ: ერთი სიტყვრშეიცვáƒáƒáƒ","progress":"მიმდინáƒáƒ áƒ”áƒáƒ‘ს მáƒáƒ áƒ—áƒáƒ¬áƒ”რის შემáƒáƒ¬áƒ›áƒ”ბáƒ...","title":"მáƒáƒ áƒ—áƒáƒ¬áƒ”რáƒ","toolbar":"მáƒáƒ áƒ—áƒáƒ¬áƒ”რáƒ"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/km.js b/js/ckeditor/lang/km.js
new file mode 100644
index 0000000..0bdffb5
--- /dev/null
+++ b/js/ckeditor/lang/km.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['km']={"editor":"á§á”á€áááŸâ€‹áŸááŸáŸá​á¢á្áá”á‘​áŸá˜áŸ’á”á¼á​á”ែá”","editorPanel":"á•áŸ’á‘á¶áŸ†á„​á§á”á€áááŸâ€‹áŸááŸáŸá​á¢á្áá”á‘​áŸá˜áŸ’á”á¼á​á”ែá”","common":{"editorHelp":"á…á»á… ALT 0 áŸá˜áŸ’áá¶á”់​á‡áŸ†á“á½á™","browseServer":"áá€â€‹á˜á¾á›â€‹á€áŸ’á“á»á„​á˜áŸ‰á¶áŸáŸá¸á“​á”á˜áŸ’áá¾","url":"URL","protocol":"á–á·á’á¸á€á¶á","upload":"á•áŸ’á‘á»á€â€‹á¡á¾á„","uploadSubmit":"á”á‰áŸ’á‡á¼á“á‘ៅá€á¶á“់á˜áŸ‰á¶áŸáŸá¸á“​á”á˜áŸ’áá¾","image":"áá¼á”á—á¶á–","flash":"Flash","form":"á”ែá”á”á‘","checkbox":"á”្áá¢á”់​á’á¸á€","radio":"á”áŸá¼áá»á„​á˜á¼á›","textField":"áœá¶á›â€‹á¢á្áá”á‘","textarea":"Textarea","hiddenField":"áœá¶á›â€‹á€áŸ†á”á¶áŸ†á„","button":"á”áŸá¼áá»á„","select":"áœá¶á›â€‹á‡á˜áŸ’áá¾áŸ","imageButton":"á”áŸá¼áá»á„​áá¼á”á—á¶á–","notSet":"<á˜á·á“á€áŸ†áá់>","id":"Id","name":"áˆáŸ’á˜áŸ„ះ","langDir":"á‘á·áŸáៅá—á¶áŸá¶","langDirLtr":"á–á¸á†áŸ’áœáŸá„á‘ៅáŸáŸ’áá¶áŸ† (LTR)","langDirRtl":"á–á¸áŸáŸ’áá¶áŸ†á‘ៅá†áŸ’áœáŸá„ (RTL)","langCode":"á›áŸá​á€á¼á​á—á¶áŸá¶","longDescr":"URL á¢á’á·á”្á”á¶á™â€‹áœáŸ‚á„","cssClass":"Stylesheet Classes","advisoryTitle":"á…ំáá„​á‡á¾á„​áែá“á¶áŸ†","cssStyle":"áá…á“á¶á”á","ok":"á–្áá˜","cancel":"á”ោះá”á„់","close":"á”á·á‘","preview":"á˜á¾á›â€‹á‡á¶â€‹á˜á»á“","resize":"á”្áá¼á​á‘ំá áŸ†","generalTab":"á‘á¼á‘ៅ","advancedTab":"á€á˜áŸ’áá·á​á្á–áŸáŸ‹","validateNumberFailed":"áá˜áŸ’á›áŸƒâ€‹á“áŸáŸ‡â€‹á–á»áŸ†â€‹á˜áŸ‚á“​á‡á¶â€‹á›áŸá​á‘áŸáŸ”","confirmNewPage":"áá¶á›áŸ‹â€‹á”á“្á›á¶áŸáŸ‹â€‹á”្áá¼á​á“á¶á“á¶â€‹áែá›â€‹á˜á·á“​á‘á¶á“់​áá€áŸ’áŸá¶â€‹á‘á»á€â€‹á€áŸ’á“á»á„​á˜á¶áá·á€á¶â€‹á“áŸáŸ‡ á“á¹á„​á្áá¼áœâ€‹á”á¶á់​á”á„់។ áá¾â€‹á¢áŸ’á“á€â€‹á–á·á​á‡á¶â€‹á…á„់​á•áŸ’á‘á»á€â€‹á‘ំá–áŸá​á្á˜á¸â€‹á˜áŸ‚á“á‘áŸ?","confirmCancel":"á€á¶á​á€áŸ†áá់​á˜á½á™â€‹á…ំá“á½á“​á្áá¼â€‹áœâ€‹á”á¶á“​á•áŸ’á›á¶áŸáŸ‹â€‹á”្áá¼á។ áá¾â€‹á¢áŸ’á“á€â€‹á–á·á​á‡á¶â€‹á…á„់​á”á·á‘​á”្áá¢á”់​á“áŸáŸ‡â€‹á˜áŸ‚á“á‘áŸ?","options":"á€á¶á​á€áŸ†áá់","target":"á‚ោá›áៅ","targetNew":"áœá¸á“áá¼â€‹á្á˜á¸ (_blank)","targetTop":"áœá¸á“áá¼â€‹á›á¾â€‹á‚០(_top)","targetSelf":"áœá¸á“áá¼â€‹áá¼á…​á‚្á“ᶠ(_self)","targetParent":"áœá¸á“áá¼â€‹á˜áŸ (_parent)","langDirLTR":"á–á¸á†áŸ’áœáŸá„á‘ៅáŸáŸ’áá¶áŸ†(LTR)","langDirRTL":"á–á¸áŸáŸ’áá¶áŸ†á‘ៅá†áŸ’áœáŸá„(RTL)","styles":"áá…á“á¶á”á","cssClasses":"Stylesheet Classes","width":"á‘á‘á¹á„","height":"á€áŸ†á–áŸáŸ‹","align":"á€áŸ†áá់​á‘á¸áá¶áŸ†á„","alignLeft":"áá¶á„á†áŸ’áœá„","alignRight":"áá¶á„áŸáŸ’áá¶áŸ†","alignCenter":"á€á្áá¶á›","alignJustify":"áំáá¹á˜áŸá„áá¶á„","alignTop":"áá¶á„á›á¾","alignMiddle":"á€á្áá¶á›","alignBottom":"áá¶á„á€áŸ’áោá˜","alignNone":"á‚្á˜á¶á“","invalidValue":"áá˜áŸ’á›áŸƒâ€‹á˜á·á“​á្áá¹á˜â€‹á្áá¼áœáŸ”","invalidHeight":"áá˜áŸ’á›áŸƒâ€‹á€áŸ†á–áŸáŸ‹â€‹á្áá¼áœâ€‹áែ​á‡á¶â€‹á›áŸá។","invalidWidth":"áá˜áŸ’á›áŸƒâ€‹á‘á‘á¹á„​á្áá¼áœâ€‹áែ​á‡á¶â€‹á›áŸá។","invalidCssLength":"áá˜áŸ’á›áŸƒâ€‹á€áŸ†áá់​áŸá˜áŸ’áá¶á”់​áœá¶á› \"%1\" á្áá¼áœâ€‹áែ​á‡á¶â€‹á›áŸá​áœá·á‡áŸ’á‡á˜á¶á“​ áោá™â€‹á—្á‡á¶á”់á¬â€‹á˜á·á“​á—្á‡á¶á”់​á‡á¶á˜á½á™â€‹á“á¹á„​á¯á€áá¶â€‹áá„្áœá¶áŸáŸ‹â€‹áá”áŸáŸ‹ CSS (px, %, in, cm, mm, em, ex, pt ᬠpc) ។","invalidHtmlLength":"áá˜áŸ’á›áŸƒâ€‹á€áŸ†áá់​áŸá˜áŸ’áá¶á”់​áœá¶á› \"%1\" á្áá¼áœâ€‹áែ​á‡á¶â€‹á›áŸá​áœá·á‡áŸ’á‡á˜á¶á“ áោá™â€‹á—្á‡á¶á”់​á¬â€‹á˜á·á“​á—្á‡á¶á”់​á‡á¶á˜á½á™â€‹á“á¹á„​á¯á€áá¶â€‹áá„្áœá¶áŸáŸ‹â€‹áá”áŸáŸ‹ HTML (px ᬠ%) ។","invalidInlineStyle":"áá˜áŸ’á›áŸƒâ€‹á€áŸ†áá់​áŸá˜áŸ’áá¶á”់​áá…á“á¶á”á​á€áŸ’á“á»á„​áá½ á្áá¼áœâ€‹áែ​á˜á¶á“​á˜á½á™â€‹á¬â€‹á’á¶áá»â€‹á…្áá¾á“​áោá™â€‹á˜á¶á“​á‘្áá„់á‘្áá¶á™â€‹á‡á¶ \"áˆáŸ’á˜áŸ„ះ : áá˜áŸ’á›áŸƒ\" á á¾á™â€‹á‰áŸ‚á€â€‹á…áŸá‰â€‹á–á¸â€‹á‚្á“á¶â€‹áោá™â€‹á…á»á…​á€áŸ’á”ៀáŸáŸ”","cssLengthTooltip":"á”á‰áŸ’á…á¼á›â€‹á›áŸá​áŸá˜áŸ’áá¶á”់​áá˜áŸ’á›áŸƒâ€‹á‡á¶â€‹á—á·á…áŸáŸ‚á› á¬â€‹á›áŸá​áែá›â€‹á˜á¶á“​á¯á€áá¶â€‹á្áá¹á˜á្áá¼áœâ€‹áá”áŸáŸ‹ CSS (px, %, in, cm, mm, em, ex, pt ᬠpc) ។","unavailable":"%1<span class=\"cke_accessibility\">, á˜á·á“​á˜á¶á“</span>"},"about":{"copy":"áá€áŸ’áŸá¶áŸá·á‘្á’á· &copy; $1។ áá€áŸ’áŸá¶â€‹áŸá·á‘្á’á·â€‹á‚្áá”់​á”ែá”​á™áŸ‰á¶á„។","dlgTitle":"á¢áŸ†á–ḠCKEditor","help":"á–á·á“á·á្ᙠ$1 áŸá˜áŸ’áá¶á”់​á‡áŸ†á“á½á™áŸ”","moreInfo":"áŸá˜áŸ’áá¶á”់​á–áŸá៌á˜á¶á“​á¢áŸ†á–á¸â€‹á¢á¶á‡áŸ’á‰á¶á”áá‰á áŸá¼á˜â€‹á˜á¾á›â€‹á€áŸ’á“á»á„​á‚áŸá á‘ំá–áŸá​áá”áŸáŸ‹â€‹á™á¾á„៖","title":"á¢áŸ†á–ḠCKEditor","userGuide":"áœá·á’á¸â€‹á”្áá¾â€‹á”្áá¶áŸáŸ‹ CKEditor"},"basicstyles":{"bold":"áá·á","italic":"á‘្ááŸá","strike":"á‚á¼áŸâ€‹á”á“្á‘á¶á់​á…ំ​á€á្áá¶á›","subscript":"á¢á€áŸ’áŸááá¼á…á€áŸ’áោá˜","superscript":"á¢á€áŸ’áŸááá¼á…á›á¾","underline":"á‚á¼áŸâ€‹á”á“្á‘á¶á់​á€áŸ’áោá˜"},"blockquote":{"toolbar":"á”្á›á€áŸ‹â€‹á–á¶á€áŸ’á™â€‹áŸá˜áŸ’áá„់"},"clipboard":{"copy":"á…á˜áŸ’á›á„","copyError":"á€á¶áá€áŸ†áá់áŸá»áœá្áá—á¶á–áá”áŸáŸ‹á€á˜áŸ’á˜áœá·á’á¸áá»á€áá€áá”áŸáŸ‹á›áŸ„á€á¢áŸ’á“ဠá“áŸáŸ‡â€‹á˜á·á“á¢á¶á…á’្áœá¾á€á˜áŸ’á˜áœá·á’á¸áá¶á€áŸ‹áែá„á¢á្áá”á‘ á…ំá›á„á¢á្áá”á‘á™á€áោá™áŸáŸ’áœáŸá™á”្ááœá្áá”á¶á“á¡á¾á™ ។ áŸá¼á˜á”្áá¾á”្áá¶áŸáŸ‹á”á“្áŸáŸ† áƒá¸áá¼á…á“áŸáŸ‡ (Ctrl/Cmd+C)។","cut":"á€á¶á់á™á€","cutError":"á€á¶áá€áŸ†áá់áŸá»áœá្áá—á¶á–áá”áŸáŸ‹á€á˜áŸ’á˜áœá·á’á¸áá»á€áá€áá”áŸáŸ‹á›áŸ„á€á¢áŸ’á“ဠá“áŸáŸ‡â€‹á˜á·á“á¢á¶á…á’្áœá¾á€á˜áŸ’á˜áœá·á’á¸áá¶á€áŸ‹áែá„á¢á្áá”á‘ á€á¶á់á¢á្áá”á‘á™á€áោá™áŸáŸ’áœáŸá™á”្ááœá្áá”á¶á“á¡á¾á™ ។ áŸá¼á˜á”្áá¾á”្áá¶áŸáŸ‹á”á“្áŸáŸ† áƒá¸áá¼á…á“áŸáŸ‡ (Ctrl/Cmd+X) ។","paste":"á”á·á‘​á—្á‡á¶á”់","pasteArea":"áំá”á“់​á”á·á‘​á—្á‡á¶á”់","pasteMsg":"áŸá¼á˜á…ំá›á„á¢á្áá”á‘á‘ៅáá¶á€áŸ‹á€áŸ’á“á»á„á”្áá¢á”់áá¼á…áá¶á„á€áŸ’áោá˜áោá™á”្áá¾á”្áá¶áŸáŸ‹ áƒá¸ ​(<STRONG>Ctrl/Cmd+V</STRONG>) á á¾á™á…á»á… <STRONG>OK</STRONG> ។","securityMsg":"á–្áោះáែ​á€á¶áá€áŸ†áá់​áŸá»áœá្áá·á—á¶á– á”្áá¢á”់áŸááŸáŸá​á˜á·á“​á¢á¶á…á…á¶á”់​á™á€á‘á·á“្á“á“áŸá™á–á¸á€áŸ’áá¶ááá˜áŸ’á”ៀáá្á‘á¶áŸáŸ‹â€‹á¢áŸ’á“á€â€‹â€‹áោá™á•áŸ’á‘á¶á›áŸ‹â€‹á”á¶á“á‘áŸáŸ” á¢áŸ’á“á€â€‹á្áá¼áœá…ំá›á„​áá¶á€áŸ‹áœá¶á˜áŸ’áá„​á‘ៀá á€áŸ’á“á»á„á•áŸ’á‘á¶áŸ†á„á“áŸáŸ‡áŸ”","title":"á”á·á‘​á—្á‡á¶á”់"},"contextmenu":{"options":"á‡á˜áŸ’áá¾áŸâ€‹á˜áŸ‰áºá“á»á™â€‹á”áá·á”á‘"},"button":{"selectedLabel":"%1 (á”á¶á“​á‡áŸ’áá¾áŸâ€‹áá¾áŸ)"},"toolbar":{"toolbarCollapse":"á”á„្áá½á˜â€‹áá”á¶á​á§á”á€áááŸ","toolbarExpand":"á–á„្áá¸á€â€‹áá”á¶á​á§á”á€áááŸ","toolbarGroups":{"document":"á¯á€áŸá¶á","clipboard":"Clipboard/á˜á·á“​á’្áœá¾â€‹áœá·á‰","editing":"á€á¶á​á€áŸ‚​áŸá˜áŸ’áá½á›","forms":"á”ែá”á”á‘","basicstyles":"áá…á“á¶á”á​á˜á¼á›á្á‹á¶á“","paragraph":"á€áá¶áá្áŒ","links":"áំá","insert":"á”á‰áŸ’á…á¼á›","styles":"áá…á“á¶á”á","colors":"á–á៌","tools":"á§á”á€áááŸ"},"toolbars":"áá”á¶á​á§á”á€áááŸâ€‹á€áŸ‚​áŸá˜áŸ’áá½á›"},"elementspath":{"eleLabel":"á‘á¸áá¶áŸ†á„​á’á¶áá»","eleTitle":"á’á¶áá» %1"},"format":{"label":"á‘á˜áŸ’áá„់","panelTitle":"á‘á˜áŸ’áá„់​á€áá¶áá្áŒ","tag_address":"á¢á¶áŸá™á្á‹á¶á“","tag_div":"á’á˜áŸ’á˜áᶠ(DIV)","tag_h1":"á…ំáá„​á‡á¾á„ 1","tag_h2":"á…ំáá„​á‡á¾á„ 2","tag_h3":"á…ំáá„​á‡á¾á„ 3","tag_h4":"á…ំáá„​á‡á¾á„ 4","tag_h5":"á…ំáá„​á‡á¾á„ 5","tag_h6":"á…ំáá„​á‡á¾á„ 6","tag_p":"á’á˜áŸ’á˜áá¶","tag_pre":"Formatted"},"horizontalrule":{"toolbar":"á”á“្áែá˜á”á“្á‘á¶á់á•áŸ’ááŸá€"},"image":{"alertUrl":"áŸá¼á˜â€‹á”á‰áŸ’á…á¼á› URL áá¼á”á—á¶á–","alt":"á¢á្áá”á‘á‡áŸ†á“á½áŸ","border":"áŸáŸá»á˜","btnUpload":"á•áŸ’á‰á¾â€‹á‘ៅ​á˜áŸ‰á¶áŸáŸá¸á“​á”á˜áŸ’áá¾","button2Img":"áá¾â€‹á¢áŸ’á“á€â€‹á…á„់​á•áŸ’á›á¶áŸáŸ‹â€‹á”្áá¼á​á”áŸá¼áá»á„​áá¼á”á—á¶á–​áែá›â€‹á”á¶á“​á‡áŸ’áá¾áŸ á“ៅ​á›á¾â€‹áá¼á”á—á¶á–​á’á˜áŸ’á˜áá¶â€‹á˜á½á™â€‹á˜áŸ‚á“á‘áŸ?","hSpace":"á‚á˜áŸ’á›á¶á​á•áŸ’ááŸá€","img2Button":"áá¾â€‹á¢áŸ’á“á€â€‹á…á„់​á•áŸ’á›á¶áŸáŸ‹â€‹á”្áá¼á​áá¼á”á—á¶á–​áែá›â€‹á”á¶á“​á‡áŸ’áá¾áŸ á“ៅ​á›á¾â€‹á”áŸá¼áá»á„​áá¼á”á—á¶á–​á˜áŸ‚á“á‘áŸ?","infoTab":"á–á៌á˜á¶á“á¢áŸ†á–á¸áá¼á”á—á¶á–","linkTab":"áំá","lockRatio":"á…á¶á€áŸ‹â€‹áŸáŸ„​á•á›â€‹á’ៀá”","menu":"á›á€áŸ’ááៈ​áá¼á”á—á¶á–","resetSize":"á€áŸ†áá់á‘ំá áŸ†á¡á¾á„áœá·á‰","title":"á›á€áŸ’ááៈ​áá¼á”á—á¶á–","titleButton":"á›á€áŸ’ááៈ​á”áŸá¼áá»á„​áá¼á”á—á¶á–","upload":"á•áŸ’á‘á»á€á¡á¾á„","urlMissing":"á្áœáŸ‡ URL á”្áá—á–​áá¼á”​á—á¶á–។","vSpace":"á‚á˜áŸ’á›á¶á​á”á‰áŸ’áˆá","validateBorder":"áŸáŸá»á˜â€‹á្áá¼áœâ€‹áែ​á‡á¶â€‹á›áŸá។","validateHSpace":"á‚á˜áŸ’á›á¶á​á•áŸ’ááŸá€â€‹á្áá¼áœâ€‹áែ​á‡á¶â€‹á›áŸá។","validateVSpace":"á‚á˜áŸ’á›á¶á​á”á‰áŸ’áˆá​á្áá¼áœâ€‹áែ​á‡á¶â€‹á›áŸá។"},"indent":{"indent":"á”á“្áែá˜á€á¶áá…á¼á›á”á“្á‘á¶á់","outdent":"á”á“្áá™á€á¶áá…á¼á›á”á“្á‘á¶á់"},"fakeobjects":{"anchor":"á™á»á្á€á¶","flash":"Flash á˜á¶á“​á…á›á“á¶","hiddenfield":"áœá¶á›â€‹á€áŸ†á”á¶áŸ†á„","iframe":"IFrame","unknown":"áœá្áá»â€‹á˜á·á“​áŸáŸ’á‚á¶á›áŸ‹"},"link":{"acccessKey":"áŸáŸ„á​á…á¼á›","advanced":"á€á˜áŸ’áá·á​á្á–áŸáŸ‹","advisoryContentType":"á”្áá—áŸá‘á¢á្áá”á‘​á”្áá¹á€áŸ’áŸá¶","advisoryTitle":"á…ំáá„á‡á¾á„​á”្áá¹á€áŸ’áŸá¶","anchor":{"toolbar":"á™á»á្á€á¶","menu":"á€áŸ‚​á™á»á្á€á¶","title":"á›á€áŸ’ááៈ​á™á»á្á€á¶","name":"áˆáŸ’á˜áŸ„ះ​á™á»á្á€á¶","errorName":"áŸá¼á˜â€‹á”á‰áŸ’á…á¼á›â€‹áˆáŸ’á˜áŸ„ះ​á™á»á្á€á¶","remove":"áá€â€‹á™á»á្á€á¶â€‹á…áŸá‰"},"anchorId":"áá¶á˜ ID á’á¶áá»","anchorName":"áá¶á˜â€‹áˆáŸ’á˜áŸ„ះ​á™á»á្á€á¶","charset":"á›áŸáá€á¼áá¢á€áŸ’áŸááá”áŸáŸ‹áˆáŸ’á“á¶á”់","cssClasses":"Stylesheet Classes","emailAddress":"á¢á¶áŸá™á្á‹á¶á“​á¢áŸá¸á˜áŸ‚á›","emailBody":"áá½â€‹á¢á្áá”á‘","emailSubject":"á”្áá’á¶á“á”á‘​áŸá¶á","id":"Id","info":"á–áŸá៌á˜á¶á“​á–á¸â€‹áំá","langCode":"á€á¼á​á—á¶áŸá¶","langDir":"á‘á·áŸáៅá—á¶áŸá¶","langDirLTR":"á–á¸á†áŸ’áœáŸá„á‘ៅáŸáŸ’áá¶áŸ†(LTR)","langDirRTL":"á–á¸áŸáŸ’áá¶áŸ†á‘ៅá†áŸ’áœáŸá„(RTL)","menu":"á€áŸ‚​áំá","name":"áˆáŸ’á˜áŸ„ះ","noAnchors":"(á˜á·á“​á˜á¶á“​á™á»á្á€á¶â€‹á“ៅ​á€áŸ’á“á»á„​á¯á€áŸá¶á​á¢á្ááá”á‘​á‘áŸ)","noEmail":"áŸá¼á˜â€‹á”á‰áŸ’á…á¼á›â€‹á¢á¶áŸá™á្á‹á¶á“​á¢áŸá¸á˜áŸ‚á›","noUrl":"áŸá¼á˜â€‹á”á‰áŸ’á…á¼á›â€‹áំá URL","other":"<á•áŸ’áŸáŸá„​á‘ៀá>","popupDependent":"Dependent (Netscape)","popupFeatures":"á˜á»á​á„á¶á​á•á»áŸâ€‹á•áŸ’á‘á¶áŸ†á„​áœá¸á“áá¼â€‹á¡á¾á„","popupFullScreen":"á–áŸá‰â€‹á¢áŸá€áŸ’áá„់ (IE)","popupLeft":"á‘á¸áá¶áŸ†á„áá¶á„á†áŸ’áœáŸá„","popupLocationBar":"áá”á¶á​á‘á¸áá¶áŸ†á„","popupMenuBar":"áá”á¶á​á˜áŸ‰áºá“á»á™","popupResizable":"á¢á¶á…​á”្áá¼á​á‘ំá áŸ†","popupScrollBars":"áá”á¶á​áំá€á·á›","popupStatusBar":"áá”á¶á​áŸáŸ’áá¶á“á—á¶á–","popupToolbar":"áá”á¶á​á§á”á€áááŸ","popupTop":"á‘á¸áá¶áŸ†á„​á€áŸ†á–á¼á›","rel":"áŸá˜áŸ’á–á“្á’​á—á¶á–","selectAnchor":"áá¾áŸâ€‹á™á€â€‹á™á»á្á€á¶â€‹á˜á½á™","styles":"áŸáŸ’á‘á¸á›","tabIndex":"á›áŸá Tab","target":"á‚ោá›áៅ","targetFrame":"<áŸáŸá»á˜>","targetFrameName":"áˆáŸ’á˜áŸ„ះ​áŸáŸá»á˜â€‹á‡á¶â€‹á‚ោá›â€‹áៅ","targetPopup":"<áœá¸á“áá¼â€‹á•á»áŸâ€‹á¡á¾á„>","targetPopupName":"áˆáŸ’á˜áŸ„ះ​áœá¸á“áá¼á​á•á»áŸâ€‹á¡á¾á„","title":"áំá","toAnchor":"á​á—្á‡á¶á”់​á‘ៅ​á™á»á្á€á¶â€‹á€áŸ’á“á»á„​á¢á្áá”á‘","toEmail":"á¢áŸá¸á˜áŸ‚á›","toUrl":"URL","toolbar":"áំá","type":"á”្áá—áŸá‘​áំá","unlink":"á•áŸ’áá¶á…់​áំá","upload":"á•áŸ’á‘á»á€â€‹á¡á¾á„"},"list":{"bulletedlist":"á”á‰áŸ’á…á¼á› / á›á»á”​á”á‰áŸ’á‡á¸â€‹á‡á¶â€‹á…ំáá»á…​á˜á¼á›","numberedlist":"á”á‰áŸ’á…á¼á› / á›á»á”​á”á‰áŸ’á‡á¸â€‹á‡á¶â€‹á›áŸá"},"magicline":{"title":"á”á‰áŸ’á…á¼á›â€‹á€áá¶áá្áŒâ€‹á“ៅ​á‘á¸á“áŸáŸ‡"},"maximize":{"maximize":"á–á„្áá¸á€â€‹á¢áá·á”áá˜á¶","minimize":"á”á„្áá½á˜â€‹á¢á”្á”á”áá˜á¶"},"pastetext":{"button":"á”á·á‘​á—្á‡á¶á”់​á‡á¶â€‹á¢á្áá”á‘​á’á˜áŸ’á˜áá¶","title":"á”á·á‘​á—្á‡á¶á”់​á‡á¶â€‹á¢á្áá”á‘​á’á˜áŸ’á˜áá¶"},"pastefromword":{"confirmCleanup":"á¢á្áá”á‘​áែá›â€‹á¢áŸ’á“á€â€‹á…á„់​á”á·á‘​á—្á‡á¶á”់​á“áŸáŸ‡ á‘ំá“á„​áá¼á…​á‡á¶â€‹á…á˜áŸ’á›á„​á˜á€â€‹á–ḠWord។ áá¾â€‹á¢áŸ’á“á€â€‹á…á„់​áŸá˜áŸ’á¢á¶á​áœá¶â€‹á˜á»á“​á”á·á‘​á—្á‡á¶á”់​á‘áŸ?","error":"áោá™â€‹áŸá¶á​á˜á¶á“​á”á‰áŸ’á á¶â€‹á•áŸ’á“ែá€â€‹á€áŸ’á“á»á„​á’្áœá¾â€‹á²áŸ’á™â€‹á˜á·á“​á¢á¶á…​áŸá˜áŸ’á¢á¶á​á‘á·á“្á“á“áŸá™â€‹áែá›â€‹á”á¶á“​á”á·á‘​á—្á‡á¶á”់","title":"á”á·á‘​á—្á‡á¶á”់​á–ḠWord","toolbar":"á”á·á‘​á—្á‡á¶á”់​á–ḠWord"},"removeformat":{"toolbar":"á‡á˜áŸ’áះ​á‘្áá„់​á‘្áá¶á™"},"sourcearea":{"toolbar":"á¢á€áŸ’áŸá​á€á¼á"},"specialchar":{"options":"á‡á˜áŸ’áá¾áŸâ€‹áá½â€‹á¢á€áŸ’áŸá​á–á·áŸáŸáŸ","title":"áá¾áŸâ€‹áá½á¢á€áŸ’áŸá​á–á·áŸáŸáŸ","toolbar":"á”á“្áែá˜á¢á€áŸ’áŸáá–á·áŸáŸáŸ"},"scayt":{"btn_about":"About SCAYT","btn_dictionaries":"Dictionaries","btn_disable":"Disable SCAYT","btn_enable":"Enable SCAYT","btn_langs":"Languages","btn_options":"Options","text_title":"Spell Check As You Type"},"stylescombo":{"label":"áá…á“á¶á”á","panelTitle":"á‘្áá„់á‘្áá¶á™â€‹áá…á“á¶á”á","panelTitle1":"áá…á“á¶á”á​á”្á›á€áŸ‹","panelTitle2":"áá…á“á¶á”á​á€áŸ’á“á»á„​á‡á½á","panelTitle3":"áá…á“á¶á”á​áœá្áá»"},"table":{"border":"á‘ំá áŸ†â€‹á”á“្á‘á¶á់​áŸáŸá»á˜","caption":"á…ំáá„á‡á¾á„","cell":{"menu":"á€áŸ’áá¡á¶","insertBefore":"á”á‰áŸ’á…á¼á›â€‹á€áŸ’áá¡á¶â€‹á–á¸á˜á»á","insertAfter":"á”á‰áŸ’á…á¼á›â€‹á€áŸ’áá¡á¶â€‹á–á¸â€‹á€áŸ’áោá™","deleteCell":"á›á»á”​á€áŸ’áá¡á¶","merge":"á”á‰áŸ’á…á¼á›â€‹á€áŸ’áá¡á¶â€‹á…á¼á›â€‹á‚្á“á¶","mergeRight":"á”á‰áŸ’á…á¼á›â€‹á‚្á“á¶â€‹áá¶á„​áŸáŸ’áá¶áŸ†","mergeDown":"á”á‰áŸ’á…á¼á›â€‹á‚្á“á¶â€‹á…á»áŸ‡â€‹á€áŸ’áោá˜","splitHorizontal":"á–á»áŸ‡â€‹á€áŸ’áá¡á¶â€‹á•áŸ’ááŸá€","splitVertical":"á–á»áŸ‡â€‹á€áŸ’áá¡á¶â€‹á”á‰áŸ’áˆá","title":"á›á€áŸ’ááៈ​á€áŸ’áá¡á¶","cellType":"á”្áá—áŸá‘​á€áŸ’áá¡á¶","rowSpan":"á…ំá“á½á“​á‡á½á​ááŸá€â€‹á›á¶á™â€‹á…á¼á›â€‹á‚្á“á¶","colSpan":"á…ំá“á½á“​á‡á½á​áˆá​á›á¶á™â€‹á…á¼á›â€‹á‚្á“á¶","wordWrap":"áá»áŸ†â€‹á–á¶á€áŸ’á™","hAlign":"á€á¶á​áá˜áŸ’áá¹á˜â€‹á•áŸ’ááŸá€","vAlign":"á€á¶á​áá˜áŸ’áá¹á˜â€‹á”á‰áŸ’áˆá","alignBaseline":"á្áŸáŸ‚​á”á“្á‘á¶á់​á‚ោá›","bgColor":"á–á៌​á•áŸ’á‘ៃ​á€áŸ’áោá™","borderColor":"á–á៌​á”á“្á‘á¶á់​áŸáŸá»á˜","data":"á‘á·á“្á“á“áŸá™","header":"á€áŸ’á”á¶á›","yes":"á–្áá˜","no":"á‘áŸ","invalidWidth":"á‘á‘á¹á„​á€áŸ’áá¡á¶â€‹á្áá¼áœâ€‹áែ​á‡á¶â€‹á›áŸá។","invalidHeight":"á€á˜áŸ’á–áŸáŸ‹â€‹á€áŸ’áá¡á¶â€‹á្áá¼áœâ€‹áែ​á‡á¶â€‹á›áŸá។","invalidRowSpan":"á…ំá“á½á“​á‡á½á​ááŸá€â€‹á›á¶á™â€‹á…á¼á›â€‹á‚្á“á¶â€‹á្áá¼áœâ€‹áែ​á‡á¶â€‹á›áŸá​á‘á¶áŸ†á„​á¢áŸáŸ‹áŸ”","invalidColSpan":"á…ំá“á½á“​á‡á½á​áˆá​á›á¶á™â€‹á…á¼á›â€‹á‚្á“á¶â€‹á្áá¼áœâ€‹áែ​á‡á¶â€‹á›áŸá​á‘á¶áŸ†á„​á¢áŸáŸ‹áŸ”","chooseColor":"áá¾áŸ"},"cellPad":"á…á“្á›áŸ„ះ​á€áŸ’áá¡á¶","cellSpace":"á‚á˜áŸ’á›á¶á​á€áŸ’áá¡á¶","column":{"menu":"á‡á½á​áˆá","insertBefore":"á”á‰áŸ’á…á¼á›â€‹á‡á½á​áˆá​á–á¸á˜á»á","insertAfter":"á”á‰áŸ’á…á¼á›â€‹á‡á½á​áˆá​á–á¸â€‹á€áŸ’áោá™","deleteColumn":"á›á»á”​á‡á½á​áˆá"},"columns":"á‡á½ááˆá","deleteTable":"á›á»á”​áá¶áá¶á„","headers":"á€áŸ’á”á¶á›","headersBoth":"á‘á¶áŸ†á„​á–á¸á","headersColumn":"á‡á½á​áˆá​áំá”á¼á„","headersNone":"á˜á·á“​á˜á¶á“","headersRow":"á‡á½á​ááŸá€â€‹áំá”á¼á„","invalidBorder":"á‘ំá áŸ†â€‹á”á“្á‘á¶á់​áŸáŸá»á˜â€‹á្áá¼áœâ€‹áែ​á‡á¶â€‹á›áŸá។","invalidCellPadding":"á…á“្á›áŸ„ះ​á€áŸ’áá¡á¶â€‹á្áá¼áœâ€‹áែá‡á¶â€‹á›áŸá​áœá·á‡áŸ’á‡á˜á¶á“។","invalidCellSpacing":"á‚á˜áŸ’á›á¶á​á€áŸ’áá¡á¶â€‹á្áá¼áœâ€‹áែ​á‡á¶â€‹á›áŸá​áœá·á‡áŸ’á‡á˜á¶á“។","invalidCols":"á…ំá“á½á“​á‡á½á​áˆá​á្áá¼áœâ€‹áែ​á‡á¶â€‹á›áŸá​á’ំ​á‡á¶á„ 0។","invalidHeight":"á€á˜áŸ’á–áŸáŸ‹â€‹áá¶áá¶á„​á្áá¼áœâ€‹áែ​á‡á¶â€‹á›áŸá","invalidRows":"á…ំá“á½á“​á‡á½á​ááŸá€â€‹á្áá¼áœâ€‹áែ​á‡á¶â€‹á›áŸá​á’ំ​á‡á¶á„ 0។","invalidWidth":"á‘á‘á¹á„​áá¶áá¶á„​á្áá¼áœâ€‹áែ​á‡á¶â€‹á›áŸá។","menu":"á›á€áŸ’ááៈ​áá¶áá¶á„","row":{"menu":"á‡á½á​ááŸá€","insertBefore":"á”á‰áŸ’á…á¼á›â€‹á‡á½á​ááŸá€â€‹á–á¸á˜á»á","insertAfter":"á”á‰áŸ’á…á¼á›â€‹á‡á½á​ááŸá€â€‹á–á¸â€‹á€áŸ’áោá™","deleteRow":"á›á»á”​á‡á½á​ááŸá€"},"rows":"á‡á½á​ááŸá€","summary":"áŸáŸá…á€áŸ’áá¸â€‹áŸá„្ááŸá”","title":"á›á€áŸ’ááៈ​áá¶áá¶á„","toolbar":"áá¶áá¶á„","widthPc":"á—á¶á‚áá™","widthPx":"á—á¸á€áŸáŸ‚á›","widthUnit":"á¯á€áá¶â€‹á‘á‘á¹á„"},"undo":{"redo":"á’្áœá¾â€‹á¡á¾á„​áœá·á‰","undo":"á˜á·á“​á’្áœá¾â€‹áœá·á‰"},"wsc":{"btnIgnore":"á˜á·á“á•áŸ’á›á¶áŸáŸ‹á”្áá¼á","btnIgnoreAll":"á˜á·á“á•áŸ’á›á¶áŸáŸ‹á”្áá¼á á‘á¶áŸ†á„á¢áŸáŸ‹","btnReplace":"á‡áŸ†á“á½áŸ","btnReplaceAll":"á‡áŸ†á“á½áŸá‘á¶áŸ†á„á¢áŸáŸ‹","btnUndo":"áŸá¶áá¡á¾á„áœá·á‰","changeTo":"á•áŸ’á›á¶áŸáŸ‹á”្áá¼áá‘ៅ","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"á–á»áŸ†á˜á¶á“á€á˜áŸ’á˜áœá·á’á¸á–á·á“á·á្á™á¢á€áŸ’ááá¶áœá·áá»á‘្ᒠ។ áá¾á…á„់á‘á¶á‰á™á€á–á¸áá¶?","manyChanges":"á€á¶áá–á·á“á·á្á™á¢á€áŸ’ááá¶áœá·áá»á‘្á’á”á¶á“á…á”់: %1 á–á¶á€áŸ’á™á”á¶á“á•áŸ’á›á¶áŸáŸ‹á”្áá¼á","noChanges":"á€á¶áá–á·á“á·á្á™á¢á€áŸ’ááá¶áœá·áá»á‘្á’á”á¶á“á…á”់: á–á»áŸ†á˜á¶á“á•áŸ’á›á¶áŸáŸ‹á”្áá¼á","noMispell":"á€á¶áá–á·á“á·á្á™á¢á€áŸ’ááá¶áœá·áá»á‘្á’á”á¶á“á…á”់: á‚្á˜á¶á“á€áŸ†á á»áŸ","noSuggestions":"- á‚្á˜á¶á“áŸáŸ†áá¾á -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"á‚្á˜á¶á“á€áŸ’á“á»á„áœá…á“á¶á“á»á€áŸ’áá˜","oneChange":"á€á¶áá–á·á“á·á្á™á¢á€áŸ’ááá¶áœá·áá»á‘្á’á”á¶á“á…á”់: á–á¶á€áŸ’á™á˜á½á™á្áá¼á…á”á¶á“á•áŸ’á›á¶áŸáŸ‹á”្áá¼á","progress":"á€áŸ†á–á»á„á–á·á“á·á្á™á¢á€áŸ’ááá¶áœá·áá»á‘្á’...","title":"Spell Checker","toolbar":"á–á·á“á·á្á™á¢á€áŸ’ááá¶áœá·áá»á‘្á’"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/ko.js b/js/ckeditor/lang/ko.js
new file mode 100644
index 0000000..509d9bf
--- /dev/null
+++ b/js/ckeditor/lang/ko.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['ko']={"editor":"리́¹˜ í…́¤í¸ í¸́§‘기","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"ë„́›€́´ í•„́”하́‹œë©´ ALT 0 ́„ 누르́„¸́”","browseServer":"́„œë²„ 보기","url":"URL","protocol":"프로토́½œ","upload":"́—…로드","uploadSubmit":"́„œë²„ë¡œ ́ „́†¡","image":"́´ë¯¸́§€","flash":"플ë˜́‰¬","form":"í¼","checkbox":"́²´í¬ë°•́¤","radio":"ë¼ë””́˜¤ë²„í¼","textField":"́…력필드","textarea":"́…ë ¥́˜́—­","hiddenField":"́ˆ¨ê¹€í•„ë“œ","button":"버í¼","select":"í¼́¹¨ëª©ë¡","imageButton":"́´ë¯¸́§€ë²„í¼","notSet":"<́„¤́ •ë˜́§€ ́•́Œ>","id":"ID","name":"Name","langDir":"́“°ê¸° ë°©í–¥","langDirLtr":"́™¼́ª½́—́„œ ́˜¤ë¥¸́ª½ (LTR)","langDirRtl":"́˜¤ë¥¸́ª½́—́„œ ́™¼́ª½ (RTL)","langCode":"́–¸́–´ ́½”ë“œ","longDescr":"URL ́„¤ëª…","cssClass":"Stylesheet Classes","advisoryTitle":"Advisory Title","cssStyle":"Style","ok":"́˜ˆ","cancel":"́•„니́˜¤","close":"닫기","preview":"미리보기","resize":"í¬ê¸° ́¡°́ ˆ","generalTab":"́¼ë°˜","advancedTab":"́́„¸íˆ","validateNumberFailed":"́´ ê°’́€ ́ˆ«́ê°€ ́•„닙니다.","confirmNewPage":"́ €́¥í•˜́§€ ́•́€ 모든 변경́‚¬í•­́€ ́œ ́‹¤ë©ë‹ˆë‹¤. ́ •ë§ë¡œ ́ƒˆë¡œ́´ í˜́´́§€ë¥¼ 부르겠́µë‹ˆê¹Œ?","confirmCancel":"몇몇개́˜ ́˜µ́…˜́´ 바꼈́µë‹ˆë‹¤. ́ •ë§ë¡œ ́°½́„ ë‹«́œ¼́‹œê² ́µë‹ˆê¹Œ?","options":"́˜µ́…˜","target":"타겟","targetNew":"́ƒˆë¡œ́´ ́°½ (_blank)","targetTop":"́µœ́ƒ́œ„ ́°½ (_top)","targetSelf":"ê°™́€ ́°½ (_self)","targetParent":"부모 ́°½ (_parent)","langDirLTR":"́™¼́ª½́—́„œ ́˜¤ë¥¸́ª½ (LTR)","langDirRTL":"́˜¤ë¥¸́ª½́—́„œ ́™¼́ª½ (RTL)","styles":"Style","cssClasses":"Stylesheet Classes","width":"너비","height":"높́´","align":"́ •ë ¬","alignLeft":"́™¼́ª½","alignRight":"́˜¤ë¥¸́ª½","alignCenter":"ê°€́´ë°","alignJustify":"両端æƒăˆ","alignTop":"́œ„","alignMiddle":"́¤‘ê°„","alignBottom":"́•„ë˜","alignNone":"None","invalidValue":"́˜ëª»ëœ ê°’.","invalidHeight":"높́´ë” ́ˆ«́́—¬́•¼ 합니다.","invalidWidth":"ë„“́´ë” ́ˆ«́́—¬́•¼ 합니다.","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\">, ́‚¬́©í•  ́ˆ˜ ́—†́Œ</span>"},"about":{"copy":"́ €́‘권 &copy; $1 . íŒê¶Œ ́†Œ́œ .","dlgTitle":"CKEditor ́— 대하́—¬","help":"ë„́›€́´ í•„́”하́‹œë©´ $1 를 확́¸í•˜́„¸́”","moreInfo":"ë¼́´́„¼́¤́— 대한 ́ •ë³´ë¥¼ ë³´ê³ ́‹¶ë‹¤ë©´ ́°ë¦¬́˜ ́›¹ ́‚¬́´í¸ë¥¼ 방문하́„¸́”:","title":"CKEditoŕ— 대하́—¬","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"́§„하게","italic":"́´í…”릭","strike":"́·΅†Œ́„ ","subscript":"́•„ë˜ ́²΅","superscript":"́œ„ ́²΅","underline":"ë°‘́¤„"},"blockquote":{"toolbar":"́¸́© 블ë¡"},"clipboard":{"copy":"ë³µ́‚¬í•˜ê¸°","copyError":"브ë¼́°́ €́˜ ë³´́•ˆ́„¤́ •ë•Œë¬¸́— ë³µ́‚¬í•˜ê¸° 기ë¥́„ ́‹¤í–‰í•  ́ˆ˜ ́—†́µë‹ˆë‹¤. 키보드 명령́„ ́‚¬́©í•˜́‹­́‹œ́”. (Ctrl/Cmd+C).","cut":"́˜ë¼ë‚´ê¸°","cutError":"브ë¼́°́ €́˜ ë³´́•ˆ́„¤́ •ë•Œë¬¸́— ́˜ë¼ë‚´ê¸° 기ë¥́„ ́‹¤í–‰í•  ́ˆ˜ ́—†́µë‹ˆë‹¤. 키보드 명령́„ ́‚¬́©í•˜́‹­́‹œ́”. (Ctrl/Cmd+X).","paste":"붙́—¬ë„£ê¸°","pasteArea":"ë²”́œ„ 붙́—¬ë„£ê¸°","pasteMsg":"키보드́˜ (<STRONG>Ctrl/Cmd+V</STRONG>) 를 ́´́©í•´́„œ ́ƒ́́•ˆ́— 붙́—¬ë„£ê³  <STRONG>OK</STRONG> 를 누르́„¸́”.","securityMsg":"브러́°́ € ë³´́•ˆ ́„¤́ •́œ¼ë¡œ ́¸í•´, í´ë¦½ë³´ë“œ́˜ ́료를 ́§́ ‘ ́ ‘근할 ́ˆ˜ ́—†́µë‹ˆë‹¤. ́´ ́°½́— 다́‹œ 붙́—¬ë„£ê¸° 하́‹­́‹œ́˜¤.","title":"붙́—¬ë„£ê¸°"},"contextmenu":{"options":"́»¨í…́¤í¸ 메뉴 ́˜µ́…˜"},"button":{"selectedLabel":"%1 (Selected)"},"toolbar":{"toolbarCollapse":"툴바 ́‚­́ œ","toolbarExpand":"확́¥ 툴바","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":"í¸́§‘́́© 툴바들"},"elementspath":{"eleLabel":"́”́†Œ ́œ„́¹˜","eleTitle":"%1 ́”́†Œ"},"format":{"label":"í¬ë§·","panelTitle":"í¬ë§·","tag_address":"Address","tag_div":"기본 (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":"́ˆ˜í‰́„  ́‚½́…"},"image":{"alertUrl":"́´ë¯¸́§€ URĹ„ ́…력하́‹­́‹œ́”","alt":"́´ë¯¸́§€ ́„¤ëª…","border":"í…Œë‘리","btnUpload":"́„œë²„ë¡œ ́ „́†¡","button2Img":"단́ˆœ ́´ë¯¸́§€́—́„œ ́„ íƒí•œ ́´ë¯¸́§€ 버í¼́„ 변환하́‹œê² ́µë‹ˆê¹Œ?","hSpace":"́ˆ˜í‰́—¬ë°±","img2Button":"́´ë¯¸́§€ 버í¼́— ́„ íƒí•œ ́´ë¯¸́§€ë¥¼ 변환하́‹œê² ́µë‹ˆê¹Œ?","infoTab":"́´ë¯¸́§€ ́ •ë³´","linkTab":"ë§í¬","lockRatio":"비́œ¨ ́œ ́§€","menu":"́´ë¯¸́§€ ́„¤́ •","resetSize":"́›ë˜ í¬ê¸°ë¡œ","title":"́´ë¯¸́§€ ́„¤́ •","titleButton":"́´ë¯¸́§€ë²„í¼ ́†́„±","upload":"́—…로드","urlMissing":"́´ë¯¸́§€ ́†Œ́¤ URĹ´ ́—†́µë‹ˆë‹¤.","vSpace":"́ˆ˜́§́—¬ë°±","validateBorder":"í…Œë‘ë¦¬ë” ́ •́ˆ˜́—¬́•¼ 합니다.","validateHSpace":"가로 길́´ë” ́ •́ˆ˜́—¬́•¼ 합니다.","validateVSpace":"́„¸ë¡œ 길́´ë” ́ •́ˆ˜́—¬́•¼ 합니다."},"indent":{"indent":"들́—¬́“°ê¸°","outdent":"ë‚´́–´́“°ê¸°"},"fakeobjects":{"anchor":"́±…갈피 ́‚½́…/변경","flash":"Flash Animation","hiddenfield":"́ˆ¨ê¹€í•„ë“œ","iframe":"IFrame","unknown":"Unknown Object"},"link":{"acccessKey":"́—‘́„¸́¤ 키","advanced":"́́„¸íˆ","advisoryContentType":"Advisory Content Type","advisoryTitle":"Advisory Title","anchor":{"toolbar":"́±…갈피 ́‚½́…/변경","menu":"́±…갈피 ́†́„±","title":"́±…갈피 ́†́„±","name":"́±…갈피 ́´ë¦„","errorName":"́±…갈피 ́´ë¦„́„ ́…력하́‹­́‹œ́”.","remove":"Remove Anchor"},"anchorId":"́±…갈피 ID","anchorName":"́±…갈피 ́´ë¦„","charset":"Linked Resource Charset","cssClasses":"Stylesheet Classes","emailAddress":"́´ë©”́¼ ́£¼́†Œ","emailBody":"ë‚´́©","emailSubject":"́ œëª©","id":"ID","info":"ë§í¬ ́ •ë³´","langCode":"́“°ê¸° ë°©í–¥","langDir":"́“°ê¸° ë°©í–¥","langDirLTR":"́™¼́ª½́—́„œ ́˜¤ë¥¸́ª½ (LTR)","langDirRTL":"́˜¤ë¥¸́ª½́—́„œ ́™¼́ª½ (RTL)","menu":"ë§í¬ ́ˆ˜́ •","name":"Name","noAnchors":"(문́„œ́— ́±…갈피가 ́—†́µë‹ˆë‹¤.)","noEmail":"́´ë©”́¼́£¼́†Œë¥¼ ́…력하́‹­́‹œ́”.","noUrl":"ë§í¬ URĹ„ ́…력하́‹­́‹œ́”.","other":"<기타>","popupDependent":"Dependent (Netscape)","popupFeatures":"íŒ́—…́°½ ́„¤́ •","popupFullScreen":"́ „́²´í™”ë©´ (IE)","popupLeft":"́™¼́ª½ ́œ„́¹˜","popupLocationBar":"́£¼́†Œí‘œ́‹œ́¤„","popupMenuBar":"메뉴바","popupResizable":"í¬ê¸° ́¡°́ ˆ ê°€ë¥","popupScrollBars":"́¤í¬ë¡¤ë°”","popupStatusBar":"́ƒíƒœë°”","popupToolbar":"툴바","popupTop":"́œ—́ª½ ́œ„́¹˜","rel":"관계","selectAnchor":"́±…갈피 ́„ íƒ","styles":"Style","tabIndex":"탭 ́ˆœ́„œ","target":"타겟","targetFrame":"<프레́„>","targetFrameName":"타겟 프레́„ ́´ë¦„","targetPopup":"<íŒ́—…́°½>","targetPopupName":"íŒ́—…́°½ ́´ë¦„","title":"ë§í¬","toAnchor":"́±…갈피","toEmail":"́´ë©”́¼","toUrl":"URL","toolbar":"ë§í¬ ́‚½́…/변경","type":"ë§í¬ ́¢…류","unlink":"ë§í¬ ́‚­́ œ","upload":"́—…로드"},"list":{"bulletedlist":"́ˆœ́„œ́—†ë” 목ë¡","numberedlist":"́ˆœ́„œ́ˆë” 목ë¡"},"magicline":{"title":"́—¬ê¸°́— ê·¸ë˜í”„ ́‚½́…"},"maximize":{"maximize":"́µœëŒ€","minimize":"́µœ́†Œ"},"pastetext":{"button":"í…́¤í¸ë¡œ 붙́—¬ë„£ê¸°","title":"í…́¤í¸ë¡œ 붙́—¬ë„£ê¸°"},"pastefromword":{"confirmCleanup":"붙́—¬ 넣기 í•  í…́¤í¸ë” MS Word́—́„œ ë³µ́‚¬ í•œ 것́…니다. 붙́—¬ 넣기 ́ „́— MS Word í¬ë©§́„ ́‚­́ œ 하́‹œê² ́µë‹ˆê¹Œ?","error":"내부 ́˜¤ë¥˜ë¡œ 붙́—¬ ë„£́€ ë°́´í„°ë¥¼ ́ •ë¦¬ í•  ́ˆ˜ ́—†́µë‹ˆë‹¤.","title":"MS Word 형́‹́—́„œ 붙́—¬ë„£ê¸°","toolbar":"MS Word 형́‹́—́„œ 붙́—¬ë„£ê¸°"},"removeformat":{"toolbar":"í¬ë§· ́§€́°ê¸°"},"sourcearea":{"toolbar":"́†Œ́¤"},"specialchar":{"options":"í¹́ˆ˜ë¬¸́ ́˜µ́…˜","title":"í¹́ˆ˜ë¬¸́ ́„ íƒ","toolbar":"í¹́ˆ˜ë¬¸́ ́‚½́…"},"scayt":{"btn_about":"About SCAYT","btn_dictionaries":"Dictionaries","btn_disable":"Disable SCAYT","btn_enable":"Enable SCAYT","btn_langs":"Languages","btn_options":"Options","text_title":"Spell Check As You Type"},"stylescombo":{"label":"́¤íƒ€́¼","panelTitle":"́ „́²´ 구́„± ́¤íƒ€́¼","panelTitle1":"ë¸”ë¡ ́¤íƒ€́¼","panelTitle2":"́¸ë¼́¸ ́¤íƒ€́¼","panelTitle3":"́˜¤ë¸Œ́ í¸ ́¤íƒ€́¼"},"table":{"border":"í…Œë‘리 í¬ê¸°","caption":"́º¡́…˜","cell":{"menu":"́…€/́¹¸(Cell)","insertBefore":"́•́— ́…€/́¹¸ ́‚½́…","insertAfter":"ë’¤́— ́…€/́¹¸ ́‚½́…","deleteCell":"́…€ ́‚­́ œ","merge":"́…€ í•©́¹˜ê¸°","mergeRight":"́˜¤ë¥¸́ª½ ë­‰́¹˜ê¸°","mergeDown":"́™¼́ª½ ë­‰́¹˜ê¸°","splitHorizontal":"́ˆ˜í‰ 나누기","splitVertical":"́ˆ˜́§ 나누기","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":"́…€ ́—¬ë°±","cellSpace":"́…€ 간격","column":{"menu":"́—´(Column)","insertBefore":"́•́— ́—´ ́‚½́…","insertAfter":"ë’¤́— ́—´ ́‚½́…","deleteColumn":"́„¸ë¡œ́¤„ ́‚­́ œ"},"columns":"́„¸ë¡œ́¤„","deleteTable":"í‘œ ́‚­́ œ","headers":"í•´ë”","headersBoth":"모ë‘","headersColumn":"́²« ́—´","headersNone":"None","headersRow":"́²« í–‰","invalidBorder":"í…Œë‘리 í¬ê¸°ë” ́ˆ«́́—¬́•¼ 합니다.","invalidCellPadding":"́…€ ́•ˆ́ª½́˜ ́—¬ë°±́€ 0 ́´́ƒ́´́–´́•¼ 합니다.","invalidCellSpacing":"́…€ 간격́€ 0 ́´́ƒ́´́–´́•¼ 합니다.","invalidCols":"í–‰ ë²ˆí˜¸ë” 0보다 í° ́ˆ«́́—¬́•¼ 합니다.","invalidHeight":"í‘œ 높́´ë” ́ˆ«́́—¬́•¼ 합니다.","invalidRows":"í–‰ ë²ˆí˜¸ë” 0보다 í° ́ˆ«́́—¬́•¼ 합니다.","invalidWidth":"í‘œ́˜ í­́€ ́ˆ«́́—¬́•¼ 합니다.","menu":"í‘œ ́„¤́ •","row":{"menu":"í–‰(Row)","insertBefore":"́•́— í–‰ ́‚½́…","insertAfter":"ë’¤́— í–‰ ́‚½́…","deleteRow":"가로́¤„ ́‚­́ œ"},"rows":"가로́¤„","summary":"́”́•½","title":"í‘œ ́„¤́ •","toolbar":"í‘œ","widthPc":"í¼́„¼í¸","widthPx":"픽́…€","widthUnit":"í­ ë‹΅œ„"},"undo":{"redo":"́¬́‹¤í–‰","undo":"́·΅†Œ"},"wsc":{"btnIgnore":"건너뜀","btnIgnoreAll":"ëª¨ë‘ ê±´ë„ˆëœ€","btnReplace":"변경","btnReplaceAll":"ëª¨ë‘ ë³€ê²½","btnUndo":"́·΅†Œ","changeTo":"변경할 단́–´","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"́² ́ ê²€́‚¬ê¸°ê°€ ́² ́¹˜ë˜́§€ ́•́•˜́µë‹ˆë‹¤. ́§€ê¸ˆ 다́´ë¡œë“œí•˜́‹œê² ́µë‹ˆê¹Œ?","manyChanges":"́² ́ê²€́‚¬ ́™„료: %1 단́–´ê°€ 변경ë˜́—ˆ́µë‹ˆë‹¤.","noChanges":"́² ́ê²€́‚¬ ́™„료: ë³€ê²½ëœ ë‹΅–´ê°€ ́—†́µë‹ˆë‹¤.","noMispell":"́² ́ê²€́‚¬ ́™„료: ́˜ëª»ëœ ́² ́ê°€ ́—†́µë‹ˆë‹¤.","noSuggestions":"- ́¶”́²œë‹΅–´ ́—†́Œ -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"́‚¬́ „́— ́—†ë” 단́–´","oneChange":"́² ́ê²€́‚¬ ́™„료: 단́–´ê°€ 변경ë˜́—ˆ́µë‹ˆë‹¤.","progress":"́² ́ê²€́‚¬ë¥¼ ́§„í–‰́¤‘́…니다...","title":"Spell Check","toolbar":"́² ́ê²€́‚¬"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/ku.js b/js/ckeditor/lang/ku.js
new file mode 100644
index 0000000..ec90e9f
--- /dev/null
+++ b/js/ckeditor/lang/ku.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['ku']={"editor":"سەرنووسەی دەقی تەواو","editorPanel":"بڕگەی سەرنووسەی دەقی تەواو","common":{"editorHelp":"کلیکی ALT Ù„Û•Ú¯Û•Úµ 0 بکه‌ بۆ یارمەتی","browseServer":"Ù‡Ûنانی ڕاژە","url":"ناونیشانی بەستەر","protocol":"پڕۆتۆکۆڵ","upload":"بارکردن","uploadSubmit":"ناردنی بۆ ڕاژە","image":"ÙˆÛÙ†Û•","flash":"Ùلاش","form":"داڕشتە","checkbox":"خانەی نیشانکردن","radio":"جÛگرەوەی دوگمە","textField":"خانەی دەق","textarea":"ڕووبەری دەق","hiddenField":"شاردنەوی خانە","button":"دوگمە","select":"هەڵبژاردەی خانە","imageButton":"دوگمەی ÙˆÛÙ†Û•","notSet":"<هیچ دانەدراوە>","id":"ناسنامە","name":"ناو","langDir":"ئاراستەی زمان","langDirLtr":"Ú†Û•Ù¾ بۆ ڕاست (LTR)","langDirRtl":"ڕاست بۆ Ú†Û•Ù¾ (RTL)","langCode":"Ù‡Ûمای زمان","longDescr":"Ù¾Ûناسەی درÛÚ˜ÛŒ بەستەر","cssClass":"Ø´Ûوازی چینی په‌ڕە","advisoryTitle":"ڕاوÛژکاری سەردÛÚ•","cssStyle":"Ø´Ûواز","ok":"باشە","cancel":"پاشگەزبوونەوە","close":"داخستن","preview":"Ù¾Ûشبینین","resize":"گۆڕینی ئەندازە","generalTab":"گشتی","advancedTab":"پەرەسەندوو","validateNumberFailed":"ئەم نرخە ژمارە نیە، تکایە نرخÛÚ©ÛŒ ژمارە بنووسە.","confirmNewPage":"سەرجەم گۆڕانکاریەکان Ùˆ Ù¾Ûکهاتەکانی ناووەوە لەدەست دەدەی گەر بÛتوو پاشکەوتی Ù†Û•Ú©Û•ÛŒ یەکەم جار، تۆ هەر دڵنیایی لەکردنەوەی پەنجەرەکی نوÛØŸ","confirmCancel":"هەندÛÙƒ هەڵبژاردە گۆڕدراوە. تۆ دڵنیایی Ù„Û• داخستنی ئەم دیالۆگە؟","options":"هەڵبژاردەکان","target":"ئامانج","targetNew":"پەنجەرەیەکی Ù†ÙˆÛ (_blank)","targetTop":"لووتکەی پەنجەرە (_top)","targetSelf":"لەهەمان پەنجەرە (_self)","targetParent":"پەنجەرەی باوان (_parent)","langDirLTR":"Ú†Û•Ù¾ بۆ ڕاست (LTR)","langDirRTL":"ڕاست بۆ Ú†Û•Ù¾ (RTL)","styles":"Ø´Ûواز","cssClasses":"Ø´Ûوازی چینی Ù¾Û•Ú•Û•","width":"پانی","height":"درÛÚ˜ÛŒ","align":"Ú•Ûککەرەوە","alignLeft":"Ú†Û•Ù¾","alignRight":"ڕاست","alignCenter":"ناوەڕاست","alignJustify":"هاوستوونی","alignTop":"سەرەوە","alignMiddle":"ناوەند","alignBottom":"Ú˜Ûرەوە","alignNone":"هیچ","invalidValue":"نرخÛÚ©ÛŒ نادرووست.","invalidHeight":"درÛÚ˜ÛŒ دەبÛت ژمارە بÛت.","invalidWidth":"پانی دەبÛت ژمارە بÛت.","invalidCssLength":"ئەم نرخەی دراوە بۆ خانەی \"%1\" دەبÛت ژمارەکی درووست بÛت یان Ø¨Û Ù†Ø§ÙˆÙ†ÛŒØ´Ø§Ù†ÛŒ ئامرازی (px, %, in, cm, mm, em, ex, pt, یان pc).","invalidHtmlLength":"ئەم نرخەی دراوە بۆ خانەی \"%1\" دەبÛت ژمارەکی درووست بÛت یان Ø¨Û Ù†Ø§ÙˆÙ†ÛŒØ´Ø§Ù†ÛŒ ئامرازی HTML (px یان %).","invalidInlineStyle":"دانەی نرخی Ø´Ûوازی ناوهÛÚµ دەبÛت Ù¾ÛکهاتبÛت لەیەك یان زیاتری داڕشتە \"ناو : نرخ\", جیاکردنەوەی بە Ùاریزە Ùˆ خاڵ","cssLengthTooltip":"ژمارەیەك بنووسه‌ بۆ نرخی piksel یان ئامرازÛÚ©ÛŒ درووستی CSS (px, %, in, cm, mm, em, ex, pt, یان pc).","unavailable":"%1<span class=\"cke_accessibility\">, ئامادە نیە</span>"},"about":{"copy":"ماÙÛŒ لەبەرگەرتنەوەی &copy; $1. گشتی پارÛزراوه. ورگÛڕانی بۆ کوردی لەلایەن Ù‡Û†Ú˜Û• کۆیی.","dlgTitle":"دەربارەی CKEditor","help":"سەیری $1 بکه بۆ یارمەتی.","moreInfo":"بۆ زانیاری زیاتر دەربارەی مۆڵەتی بەکارهÛنان، تکایه سەردانی ماڵپەڕەکەمان بکه:","title":"دەربارەی CKEditor","userGuide":"Ú•Ûپیشاندەری CKEditors"},"basicstyles":{"bold":"Ù‚Û•ÚµÛ•Ùˆ","italic":"لار","strike":"Ù„Ûدان","subscript":"Ú˜Ûرنووس","superscript":"سەرنووس","underline":"Ú˜ÛرهÛÚµ"},"blockquote":{"toolbar":"بەربەستکردنی ووتەی وەرگیراو"},"clipboard":{"copy":"لەبەرگرتنەوە","copyError":"پارÛزی ÙˆÛبگەڕەکەت Ú•Ûگەنادات بەسەرنووسەکە Ù„Û• لکاندنی دەقی خۆکارارنە. تکایە لەبری ئەمە ئەم Ùەرمانە بەکاربهÛÙ†Û• بەداگرتنی کلیلی (Ctrl/Cmd+C).","cut":"بڕین","cutError":"پارÛزی ÙˆÛبگەڕەکەت Ú•Ûگەنادات بە سەرنووسەکە لەبڕینی خۆکارانە. تکایە لەبری ئەمە ئەم Ùەرمانە بەکاربهÛÙ†Û• بەداگرتنی کلیلی (Ctrl/Cmd+X).","paste":"لکاندن","pasteArea":"ناوچەی لکاندن","pasteMsg":"تکایە بیلکÛÙ†Û• لەناوەوەی ئەم سنوقە Ù„Û•Ú•ÛÛŒ تەختەکلیلەکەت بە بەکارهÛنانی کلیلی (<STRONG>Ctrl/Cmd+V</STRONG>) دووای کلیکی باشە بکە.","securityMsg":"بەهۆی Ø´ÛÙˆÛ•Ù¾Ûدانی پارÛزی ÙˆÛبگەڕەکەت، سەرنووسەکه ناتوانÛت دەستبگەیەنÛت بەهەڵگیراوەکە ڕاستەوخۆ. بۆیه Ù¾Ûویسته دووباره بیلکÛنیت Ù„Û•Ù… پەنجەرەیه.","title":"لکاندن"},"contextmenu":{"options":"هەڵبژاردەی لیستەی کلیکی دەستی ڕاست"},"button":{"selectedLabel":"%1 (هەڵبژÛردراو)"},"toolbar":{"toolbarCollapse":"شاردنەوی Ù‡ÛÚµÛŒ تووڵامراز","toolbarExpand":"نیشاندانی Ù‡ÛÚµÛŒ تووڵامراز","toolbarGroups":{"document":"Ù¾Û•Ú•Ù‡","clipboard":"بڕین/پووچکردنەوە","editing":"چاکسازی","forms":"داڕشتە","basicstyles":"Ø´Ûوازی بنچینەیی","paragraph":"بڕگە","links":"بەستەر","insert":"خستنە ناو","styles":"Ø´Ûواز","colors":"ڕەنگەکان","tools":"ئامرازەکان"},"toolbars":"تووڵامرازی دەسکاریکەر"},"elementspath":{"eleLabel":"Ú•ÛÚ•Û•ÙˆÛŒ توخمەکان","eleTitle":"%1 توخم"},"format":{"label":"ڕازاندنەوە","panelTitle":"بەشی ڕازاندنەوه","tag_address":"ناونیشان","tag_div":"(DIV)-ÛŒ ئاسایی","tag_h1":"سەرنووسەی Ù¡","tag_h2":"سەرنووسەی Ù¢","tag_h3":"سەرنووسەی Ù£","tag_h4":"سەرنووسەی Ù¤","tag_h5":"سەرنووسەی Ù¥","tag_h6":"سەرنووسەی Ù¦","tag_p":"ئاسایی","tag_pre":"Ø´Ûوازکراو"},"horizontalrule":{"toolbar":"دانانی Ù‡ÛÙ„ÛŒ ئاسۆیی"},"image":{"alertUrl":"تکایه ناونیشانی بەستەری ÙˆÛنه بنووسه","alt":"جÛگرەوەی دەق","border":"پەراوÛز","btnUpload":"ناردنی بۆ ڕاژه","button2Img":"تۆ دەتەوÛت دوگمەی ÙˆÛÙ†Û•ÛŒ دیاریکراو بگۆڕیت بۆ ÙˆÛنەیەکی ئاسایی؟","hSpace":"بۆشایی ئاسۆیی","img2Button":"تۆ دەتەوÛت ÙˆÛÙ†Û•ÛŒ دیاریکراو بگۆڕیت بۆ دوگمەی ÙˆÛنه؟","infoTab":"زانیاری ÙˆÛنه","linkTab":"بەستەر","lockRatio":"داخستنی Ú•ÛÚ˜Ù‡","menu":"خاسیەتی ÙˆÛنه","resetSize":"Ú•Ûکخستنەوەی قەباره","title":"خاسیەتی ÙˆÛنه","titleButton":"خاسیەتی دوگمەی ÙˆÛنه","upload":"بارکردن","urlMissing":"سەرچاوەی بەستەری ÙˆÛنه بزره","vSpace":"بۆشایی ئەستونی","validateBorder":"پەراوÛز دەبÛت بەتەواوی تەنها ژماره بÛت.","validateHSpace":"بۆشایی ئاسۆیی دەبÛت بەتەواوی تەنها ژمارە بÛت.","validateVSpace":"بۆشایی ئەستونی دەبÛت بەتەواوی تەنها ژماره بÛت."},"indent":{"indent":"زیادکردنی بۆشایی","outdent":"کەمکردنەوەی بۆشایی"},"fakeobjects":{"anchor":"لەنگەر","flash":"Ùلاش","hiddenfield":"شاردنەوەی خانه","iframe":"لەچوارچÛÙˆÛ•","unknown":"بەرکارÛÚ©ÛŒ نەناسراو"},"link":{"acccessKey":"کلیلی دەستپÛگەیشتن","advanced":"Ù¾Ûشکەوتوو","advisoryContentType":"جۆری ناوەڕۆکی ڕاویژکار","advisoryTitle":"ڕاوÛژکاری سەردÛÚ•","anchor":{"toolbar":"دانان/چاکسازی لەنگەر","menu":"چاکسازی لەنگەر","title":"خاسیەتی لەنگەر","name":"ناوی لەنگەر","errorName":"تکایه ناوی لەنگەر بنووسه","remove":"لابردنی لەنگەر"},"anchorId":"بەپÛÛŒ ناسنامەی توخم","anchorName":"بەپÛÛŒ ناوی لەنگەر","charset":"بەستەری سەرچاوەی نووسە","cssClasses":"Ø´Ûوازی چینی Ù¾Û•Ú•Ù‡","emailAddress":"ناونیشانی ئیمەیل","emailBody":"ناوەڕۆکی نامە","emailSubject":"بابەتی نامە","id":"ناسنامە","info":"زانیاری بەستەر","langCode":"Ù‡Ûمای زمان","langDir":"ئاراستەی زمان","langDirLTR":"Ú†Û•Ù¾ بۆ ڕاست (LTR)","langDirRTL":"ڕاست بۆ Ú†Û•Ù¾ (RTL)","menu":"چاکسازی بەستەر","name":"ناو","noAnchors":"(هیچ جۆرÛÚ©ÛŒ لەنگەر ئامادە نیە Ù„Û•Ù… پەڕەیه)","noEmail":"تکایە ناونیشانی ئیمەیل بنووسە","noUrl":"تکایە ناونیشانی بەستەر بنووسە","other":"<هیتر>","popupDependent":"Ù¾Ûوەبەستراو (Netscape)","popupFeatures":"خاسیەتی پەنجەرەی سەرهەڵدەر","popupFullScreen":"Ù¾Ú• بەپڕی شاشە (IE)","popupLeft":"جÛگای Ú†Û•Ù¾","popupLocationBar":"Ù‡ÛÚµÛŒ ناونیشانی بەستەر","popupMenuBar":"Ù‡ÛÚµÛŒ لیسته","popupResizable":"توانای گۆڕینی قەباره","popupScrollBars":"Ù‡ÛÚµÛŒ هاتووچۆپÛکردن","popupStatusBar":"Ù‡ÛÚµÛŒ دۆخ","popupToolbar":"Ù‡ÛÚµÛŒ تووڵامراز","popupTop":"جÛگای سەرەوە","rel":"پەیوەندی","selectAnchor":"هەڵبژاردنی لەنگەرÛÙƒ","styles":"Ø´Ûواز","tabIndex":"بازدەری تابی ئیندÛکس","target":"ئامانج","targetFrame":"<چووارچÛÙˆÛ•>","targetFrameName":"ناوی ئامانجی چووارچÛÙˆÛ•","targetPopup":"<پەنجەرەی سەرهەڵدەر>","targetPopupName":"ناوی پەنجەرەی سەرهەڵدەر","title":"بەستەر","toAnchor":"بەستەر بۆ لەنگەر له دەق","toEmail":"ئیمەیل","toUrl":"ناونیشانی بەستەر","toolbar":"دانان/Ú•Ûکخستنی بەستەر","type":"جۆری بەستەر","unlink":"لابردنی بەستەر","upload":"بارکردن"},"list":{"bulletedlist":"دانان/لابردنی خاڵی لیست","numberedlist":"دانان/لابردنی ژمارەی لیست"},"magicline":{"title":"بڕگە Ù„Ûرە دابنÛ"},"maximize":{"maximize":"ئەوپەڕی گەورەیی","minimize":"ئەوپەڕی بچووکی"},"pastetext":{"button":"لکاندنی ÙˆÛ•Ùƒ دەقی ڕوون","title":"لکاندنی ÙˆÛ•Ùƒ دەقی ڕوون"},"pastefromword":{"confirmCleanup":"ئەم دەقەی بەتەمای بیلکÛÙ†ÛŒ Ù¾ÛدەچÛت له word Ù‡ÛنرابÛت. دەتەوÛت پاکی بکەیوه Ù¾ÛØ´ ئەوەی بیلکÛنی؟","error":"هیچ Ú•Ûگەیەك نەبوو لەلکاندنی دەقەکه بەهۆی هەڵەیەکی ناوەخۆیی","title":"لکاندنی لەلایەن Word","toolbar":"لکاندنی Ù„Û•Ú•ÛÛŒ Word"},"removeformat":{"toolbar":"لابردنی داڕشتەکە"},"sourcearea":{"toolbar":"سەرچاوە"},"specialchar":{"options":"هەڵبژاردەی نووسەی تایبەتی","title":"هەڵبژاردنی نووسەی تایبەتی","toolbar":"دانانی نووسەی تایبەتی"},"scayt":{"btn_about":"دهربارهی SCAYT","btn_dictionaries":"Ùهرههنگهکان","btn_disable":"ناچالاککردنی SCAYT","btn_enable":"چالاککردنی SCAYT","btn_langs":"زمانهکان","btn_options":"ههڵبژارده","text_title":"پشکنینی نووسه لهکاتی نووسین"},"stylescombo":{"label":"Ø´Ûواز","panelTitle":"Ø´Ûوازی ڕازاندنەوە","panelTitle1":"Ø´Ûوازی خشت","panelTitle2":"Ø´Ûوازی ناوهÛÚµ","panelTitle3":"Ø´Ûوازی بەرکار"},"table":{"border":"گەورەیی پەراوÛز","caption":"سەردÛÚ•","cell":{"menu":"خانه","insertBefore":"دانانی خانه Ù„Û•Ù¾ÛØ´","insertAfter":"دانانی خانه لەپاش","deleteCell":"سڕینەوەی خانه","merge":"تÛکەڵکردنی خانە","mergeRight":"تÛکەڵکردنی Ù„Û•Ú¯Û•Úµ ڕاست","mergeDown":"تÛکەڵکردنی Ù„Û•Ú¯Û•Úµ خوارەوە","splitHorizontal":"دابەشکردنی خانەی ئاسۆیی","splitVertical":"دابەشکردنی خانەی ئەستونی","title":"خاسیەتی خانه","cellType":"جۆری خانه","rowSpan":"ماوەی Ù†Ûوان ڕیز","colSpan":"بستی ئەستونی","wordWrap":"Ù¾Ûچانەوەی وشە","hAlign":"ڕیزکردنی ئاسۆیی","vAlign":"ڕیزکردنی ئەستونی","alignBaseline":"Ù‡Ûڵەبنەڕەت","bgColor":"Ú•Û•Ù†Ú¯ÛŒ پاشبنەما","borderColor":"Ú•Û•Ù†Ú¯ÛŒ پەراوÛز","data":"داتا","header":"سەرپەڕه","yes":"بەڵÛ","no":"Ù†Û•Ø®Ûر","invalidWidth":"پانی خانه دەبÛت بەتەواوی ژماره بÛت.","invalidHeight":"درÛÚ˜ÛŒ خانه بەتەواوی دەبÛت ژمارە بÛت.","invalidRowSpan":"ماوەی Ù†Ûوان ڕیز بەتەواوی دەبÛت ژمارە بÛت.","invalidColSpan":"ماوەی Ù†Ûوان ئەستونی بەتەواوی دەبÛت ژمارە بÛت.","chooseColor":"هەڵبژÛرە"},"cellPad":"بۆشایی ناوپۆش","cellSpace":"بۆشایی خانه","column":{"menu":"ئەستون","insertBefore":"دانانی ئەستون Ù„Û•Ù¾ÛØ´","insertAfter":"دانانی ئەستوون لەپاش","deleteColumn":"سڕینەوەی ئەستوون"},"columns":"ستوونەکان","deleteTable":"سڕینەوەی خشتە","headers":"سەرپەڕه","headersBoth":"هەردووك","headersColumn":"یەکەم ئەستوون","headersNone":"هیچ","headersRow":"یەکەم ڕیز","invalidBorder":"ژمارەی پەراوÛز دەبÛت تەنها ژماره بÛت.","invalidCellPadding":"ناوپۆشی خانه دەبÛت ژمارەکی درووست بÛت.","invalidCellSpacing":"بۆشایی خانه دەبÛت ژمارەکی درووست بÛت.","invalidCols":"ژمارەی ئەستوونی دەبÛت گەورەتر بÛت لەژمارەی 0.","invalidHeight":"درÛÚ˜ÛŒ خشته دهبÛت تهنها ژماره بÛت.","invalidRows":"ژمارەی ڕیز دەبÛت گەورەتر بÛت لەژمارەی 0.","invalidWidth":"پانی خشته دەبÛت تەنها ژماره بÛت.","menu":"خاسیەتی خشتە","row":{"menu":"ڕیز","insertBefore":"دانانی ڕیز Ù„Û•Ù¾ÛØ´","insertAfter":"دانانی ڕیز لەپاش","deleteRow":"سڕینەوەی ڕیز"},"rows":"ڕیز","summary":"کورتە","title":"خاسیەتی خشتە","toolbar":"خشتە","widthPc":"لەسەدا","widthPx":"ÙˆÛنەخاڵ - پیکسل","widthUnit":"پانی یەکە"},"undo":{"redo":"هەڵگەڕاندنەوە","undo":"پووچکردنەوە"},"wsc":{"btnIgnore":"Ù¾Ø´ØªÚ¯ÙˆÛ Ú©Ø±Ø¯Ù†","btnIgnoreAll":"پشتگوÛکردنی ههمووی","btnReplace":"لهبریدانن","btnReplaceAll":"لهبریدانانی ههمووی","btnUndo":"پووچکردنهوه","changeTo":"گۆڕینی بۆ","errorLoading":"ههڵه لههÛنانی داخوازینامهی خانهخۆÛÛŒ ڕاژه: %s.","ieSpellDownload":"پشکنینی Ú•Ûنووس دانهمزراوه. دهتهوÛت ئÛستا دایبگریت?","manyChanges":"پشکنینی Ú•Ûنووس کۆتای هات: لهسهدا %1 ÛŒ وشهکان گۆڕدرا","noChanges":"پشکنینی Ú•Ûنووس کۆتای هات: هیچ وشهیهك نۆگۆڕدرا","noMispell":"پشکنینی Ú•Ûنووس کۆتای هات: هیچ ههڵهیهکی Ú•Ûنووس نهدۆزراوه","noSuggestions":"- هیچ Ù¾ÛشنیارÛÙƒ -","notAvailable":"ببووره، لهمکاتهدا ڕاژهکه لهبهردهستا نیه.","notInDic":"لهÙهرههنگ دانیه","oneChange":"پشکنینی Ú•Ûنووس کۆتای هات: یهك وشه گۆڕدرا","progress":"پشکنینی Ú•Ûنووس لهبهردهوامبوون دایه...","title":"پشکنینی Ú•Ûنووس","toolbar":"پشکنینی Ú•Ûنووس"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/lt.js b/js/ckeditor/lang/lt.js
new file mode 100644
index 0000000..7eccad4
--- /dev/null
+++ b/js/ckeditor/lang/lt.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['lt']={"editor":"Pilnas redaktorius","editorPanel":"Pilno redagtoriaus skydelis","common":{"editorHelp":"Spauskite ALT 0 dÄ—l pagalbos","browseServer":"NarÅ¡yti po serverį","url":"URL","protocol":"Protokolas","upload":"Siųsti","uploadSubmit":"Siųsti į serverį","image":"Vaizdas","flash":"Flash","form":"Forma","checkbox":"Žymimasis langelis","radio":"Žymimoji akutÄ—","textField":"Teksto laukas","textarea":"Teksto sritis","hiddenField":"Nerodomas laukas","button":"Mygtukas","select":"Atrankos laukas","imageButton":"Vaizdinis mygtukas","notSet":"<nÄ—ra nustatyta>","id":"Id","name":"Vardas","langDir":"Teksto kryptis","langDirLtr":"IÅ¡ kairÄ—s į deÅ¡inÄ™ (LTR)","langDirRtl":"IÅ¡ deÅ¡inÄ—s į kairÄ™ (RTL)","langCode":"Kalbos kodas","longDescr":"Ilgas apraÅ¡ymas URL","cssClass":"Stilių lentelÄ—s klasÄ—s","advisoryTitle":"KonsultacinÄ— antraÅ¡tÄ—","cssStyle":"Stilius","ok":"OK","cancel":"Nutraukti","close":"Uždaryti","preview":"PeržiÅ«rÄ—ti","resize":"Pavilkite, kad pakeistumÄ—te dydį","generalTab":"Bendros savybÄ—s","advancedTab":"Papildomas","validateNumberFailed":"Å i reikÅ¡mÄ— nÄ—ra skaiÄius.","confirmNewPage":"Visas neiÅ¡saugotas turinys bus prarastas. Ar tikrai norite įkrauti naujÄ… puslapį?","confirmCancel":"Kai kurie parametrai pasikeitÄ—. Ar tikrai norite užverti langÄ…?","options":"Parametrai","target":"TikslinÄ— nuoroda","targetNew":"Naujas langas (_blank)","targetTop":"VirÅ¡utinis langas (_top)","targetSelf":"Esamas langas (_self)","targetParent":"Paskutinis langas (_parent)","langDirLTR":"IÅ¡ kairÄ—s į deÅ¡inÄ™ (LTR)","langDirRTL":"IÅ¡ deÅ¡inÄ—s į kairÄ™ (RTL)","styles":"Stilius","cssClasses":"Stilių klasÄ—s","width":"Plotis","height":"AukÅ¡tis","align":"Lygiuoti","alignLeft":"KairÄ™","alignRight":"DeÅ¡inÄ™","alignCenter":"CentrÄ…","alignJustify":"Lygiuoti abi puses","alignTop":"VirÅ¡Å«nÄ™","alignMiddle":"Vidurį","alignBottom":"ApaÄiÄ…","alignNone":"Niekas","invalidValue":"Neteisinga reikÅ¡mÄ—.","invalidHeight":"AukÅ¡tis turi bÅ«ti nurodytas skaiÄiais.","invalidWidth":"Plotis turi bÅ«ti nurodytas skaiÄiais.","invalidCssLength":"ReikÅ¡mÄ— nurodyta \"%1\" laukui, turi bÅ«ti teigiamas skaiÄius su arba be tinkamo CSS matavimo vieneto (px, %, in, cm, mm, em, ex, pt arba pc).","invalidHtmlLength":"ReikÅ¡mÄ— nurodyta \"%1\" laukui, turi bÅ«ti teigiamas skaiÄius su arba be tinkamo HTML matavimo vieneto (px arba %).","invalidInlineStyle":"ReikÅ¡mÄ— nurodyta vidiniame stiliuje turi bÅ«ti sudaryta iÅ¡ vieno Å¡ių reikÅ¡mių \"vardas : reikÅ¡mÄ—\", atskirta kabliataÅ¡kiais.","cssLengthTooltip":"Ä®veskite reikÅ¡mÄ™ pikseliais arba skaiÄiais su tinkamu CSS vienetu (px, %, in, cm, mm, em, ex, pt arba pc).","unavailable":"%1<span class=\"cke_accessibility\">, netinkamas</span>"},"about":{"copy":"Copyright &copy; $1. Visos teiss saugomos.","dlgTitle":"Apie CKEditor","help":"Patikrinkite $1 dÄ—l pagalbos.","moreInfo":"DÄ—l licencijavimo apsilankykite mÅ«sų svetainÄ—je:","title":"Apie CKEditor","userGuide":"CKEditor Vartotojo Gidas"},"basicstyles":{"bold":"Pusjuodis","italic":"Kursyvas","strike":"Perbrauktas","subscript":"Apatinis indeksas","superscript":"VirÅ¡utinis indeksas","underline":"Pabrauktas"},"blockquote":{"toolbar":"Citata"},"clipboard":{"copy":"Kopijuoti","copyError":"JÅ«sų narÅ¡yklÄ—s saugumo nustatymai neleidžia redaktoriui automatiÅ¡kai įvykdyti kopijavimo operacijų. Tam praÅ¡ome naudoti klaviatÅ«rÄ… (Ctrl/Cmd+C).","cut":"IÅ¡kirpti","cutError":"JÅ«sų narÅ¡yklÄ—s saugumo nustatymai neleidžia redaktoriui automatiÅ¡kai įvykdyti iÅ¡kirpimo operacijų. Tam praÅ¡ome naudoti klaviatÅ«rÄ… (Ctrl/Cmd+X).","paste":"Ä®dÄ—ti","pasteArea":"Ä®kelti dalį","pasteMsg":"Žemiau esanÄiame įvedimo lauke įdÄ—kite tekstÄ…, naudodami klaviatÅ«rÄ… (<STRONG>Ctrl/Cmd+V</STRONG>) ir paspauskite mygtukÄ… <STRONG>OK</STRONG>.","securityMsg":"DÄ—l jÅ«sų narÅ¡yklÄ—s saugumo nustatymų, redaktorius negali tiesiogiai pasiekti laikinosios atminties. Jums reikia nukopijuoti dar kartÄ… į šį langÄ….","title":"Ä®dÄ—ti"},"contextmenu":{"options":"Kontekstinio meniu parametrai"},"button":{"selectedLabel":"%1 (Pasirinkta)"},"toolbar":{"toolbarCollapse":"Apjungti įrankių juostÄ…","toolbarExpand":"IÅ¡plÄ—sti įrankių juostÄ…","toolbarGroups":{"document":"Dokumentas","clipboard":"AtmintinÄ—/Atgal","editing":"Redagavimas","forms":"Formos","basicstyles":"Pagrindiniai stiliai","paragraph":"Paragrafas","links":"Nuorodos","insert":"Ä®terpti","styles":"Stiliai","colors":"Spalvos","tools":"Ä®rankiai"},"toolbars":"Redaktoriaus įrankiai"},"elementspath":{"eleLabel":"Elemento kelias","eleTitle":"%1 elementas"},"format":{"label":"Å rifto formatas","panelTitle":"Å rifto formatas","tag_address":"Kreipinio","tag_div":"Normalus (DIV)","tag_h1":"AntraÅ¡tinis 1","tag_h2":"AntraÅ¡tinis 2","tag_h3":"AntraÅ¡tinis 3","tag_h4":"AntraÅ¡tinis 4","tag_h5":"AntraÅ¡tinis 5","tag_h6":"AntraÅ¡tinis 6","tag_p":"Normalus","tag_pre":"Formuotas"},"horizontalrule":{"toolbar":"Ä®terpti horizontaliÄ… linijÄ…"},"image":{"alertUrl":"PraÅ¡ome įvesti vaizdo URL","alt":"Alternatyvus Tekstas","border":"RÄ—melis","btnUpload":"Siųsti į serverį","button2Img":"Ar norite mygtukÄ… paversti paprastu paveiksliuku?","hSpace":"Hor.ErdvÄ—","img2Button":"Ar norite paveiksliukÄ… paversti mygtuku?","infoTab":"Vaizdo informacija","linkTab":"Nuoroda","lockRatio":"IÅ¡laikyti proporcijÄ…","menu":"Vaizdo savybÄ—s","resetSize":"Atstatyti dydį","title":"Vaizdo savybÄ—s","titleButton":"Vaizdinio mygtuko savybÄ—s","upload":"Nusiųsti","urlMissing":"Paveiksliuko nuorodos nÄ—ra.","vSpace":"Vert.ErdvÄ—","validateBorder":"ReikÅ¡mÄ— turi bÅ«ti sveikas skaiÄius.","validateHSpace":"ReikÅ¡mÄ— turi bÅ«ti sveikas skaiÄius.","validateVSpace":"ReikÅ¡mÄ— turi bÅ«ti sveikas skaiÄius."},"indent":{"indent":"Padidinti įtraukÄ…","outdent":"Sumažinti įtraukÄ…"},"fakeobjects":{"anchor":"ŽymÄ—","flash":"Flash animacija","hiddenfield":"PaslÄ—ptas laukas","iframe":"IFrame","unknown":"Nežinomas objektas"},"link":{"acccessKey":"Prieigos raktas","advanced":"Papildomas","advisoryContentType":"Konsultacinio turinio tipas","advisoryTitle":"KonsultacinÄ— antraÅ¡tÄ—","anchor":{"toolbar":"Ä®terpti/modifikuoti žymÄ™","menu":"ŽymÄ—s savybÄ—s","title":"ŽymÄ—s savybÄ—s","name":"ŽymÄ—s vardas","errorName":"PraÅ¡ome įvesti žymÄ—s vardÄ…","remove":"PaÅ¡alinti žymÄ™"},"anchorId":"Pagal žymÄ—s Id","anchorName":"Pagal žymÄ—s vardÄ…","charset":"Susietų iÅ¡teklių simbolių lentelÄ—","cssClasses":"Stilių lentelÄ—s klasÄ—s","emailAddress":"El.paÅ¡to adresas","emailBody":"ŽinutÄ—s turinys","emailSubject":"ŽinutÄ—s tema","id":"Id","info":"Nuorodos informacija","langCode":"Teksto kryptis","langDir":"Teksto kryptis","langDirLTR":"IÅ¡ kairÄ—s į deÅ¡inÄ™ (LTR)","langDirRTL":"IÅ¡ deÅ¡inÄ—s į kairÄ™ (RTL)","menu":"Taisyti nuorodÄ…","name":"Vardas","noAnchors":"(Å iame dokumente žymių nÄ—ra)","noEmail":"PraÅ¡ome įvesti el.paÅ¡to adresÄ…","noUrl":"PraÅ¡ome įvesti nuorodos URL","other":"<kitas>","popupDependent":"Priklausomas (Netscape)","popupFeatures":"IÅ¡skleidžiamo lango savybÄ—s","popupFullScreen":"Visas ekranas (IE)","popupLeft":"KairÄ— pozicija","popupLocationBar":"Adreso juosta","popupMenuBar":"Meniu juosta","popupResizable":"Kintamas dydis","popupScrollBars":"Slinkties juostos","popupStatusBar":"BÅ«senos juosta","popupToolbar":"Mygtukų juosta","popupTop":"VirÅ¡utinÄ— pozicija","rel":"SÄ…sajos","selectAnchor":"Pasirinkite žymÄ™","styles":"Stilius","tabIndex":"Tabuliavimo indeksas","target":"Paskirties vieta","targetFrame":"<kadras>","targetFrameName":"Paskirties kadro vardas","targetPopup":"<iÅ¡skleidžiamas langas>","targetPopupName":"Paskirties lango vardas","title":"Nuoroda","toAnchor":"ŽymÄ— Å¡iame puslapyje","toEmail":"El.paÅ¡tas","toUrl":"Nuoroda","toolbar":"Ä®terpti/taisyti nuorodÄ…","type":"Nuorodos tipas","unlink":"Panaikinti nuorodÄ…","upload":"Siųsti"},"list":{"bulletedlist":"Suženklintas sÄ…raÅ¡as","numberedlist":"Numeruotas sÄ…raÅ¡as"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"IÅ¡didinti","minimize":"Sumažinti"},"pastetext":{"button":"Ä®dÄ—ti kaip grynÄ… tekstÄ…","title":"Ä®dÄ—ti kaip grynÄ… tekstÄ…"},"pastefromword":{"confirmCleanup":"Tekstas, kurį įkeliate yra kopijuojamas iÅ¡ Word. Ar norite jį iÅ¡valyti prieÅ¡ įkeliant?","error":"DÄ—l vidinių sutrikimų, nepavyko iÅ¡valyti įkeliamo teksto","title":"Ä®dÄ—ti iÅ¡ Word","toolbar":"Ä®dÄ—ti iÅ¡ Word"},"removeformat":{"toolbar":"Panaikinti formatÄ…"},"sourcearea":{"toolbar":"Å altinis"},"specialchar":{"options":"Specialaus simbolio nustatymai","title":"Pasirinkite specialų simbolį","toolbar":"Ä®terpti specialų simbolį"},"scayt":{"btn_about":"Apie SCAYT","btn_dictionaries":"Žodynai","btn_disable":"IÅ¡jungti SCAYT","btn_enable":"Ä®jungti SCAYT","btn_langs":"Kalbos","btn_options":"Parametrai","text_title":"Tikrinti klaidas kai raÅ¡oma"},"stylescombo":{"label":"Stilius","panelTitle":"Stilių formatavimas","panelTitle1":"Blokų stiliai","panelTitle2":"Vidiniai stiliai","panelTitle3":"Objektų stiliai"},"table":{"border":"RÄ—melio dydis","caption":"AntraÅ¡tÄ—","cell":{"menu":"Langelis","insertBefore":"Ä®terpti langelį prieÅ¡","insertAfter":"Ä®terpti langelį po","deleteCell":"Å alinti langelius","merge":"Sujungti langelius","mergeRight":"Sujungti su deÅ¡ine","mergeDown":"Sujungti su apaÄia","splitHorizontal":"Skaidyti langelį horizontaliai","splitVertical":"Skaidyti langelį vertikaliai","title":"Cell nustatymai","cellType":"Cell rÅ«Å¡is","rowSpan":"EiluÄių Span","colSpan":"Stulpelių Span","wordWrap":"Sutraukti raides","hAlign":"Horizontalus lygiavimas","vAlign":"Vertikalus lygiavimas","alignBaseline":"ApatinÄ— linija","bgColor":"Fono spalva","borderColor":"RÄ—melio spalva","data":"Data","header":"AntraÅ¡tÄ—","yes":"Taip","no":"Ne","invalidWidth":"ReikÅ¡mÄ— turi bÅ«ti skaiÄius.","invalidHeight":"ReikÅ¡mÄ— turi bÅ«ti skaiÄius.","invalidRowSpan":"ReikÅ¡mÄ— turi bÅ«ti skaiÄius.","invalidColSpan":"ReikÅ¡mÄ— turi bÅ«ti skaiÄius.","chooseColor":"Pasirinkite"},"cellPad":"Tarpas nuo langelio rÄ—mo iki teksto","cellSpace":"Tarpas tarp langelių","column":{"menu":"Stulpelis","insertBefore":"Ä®terpti stulpelį prieÅ¡","insertAfter":"Ä®terpti stulpelį po","deleteColumn":"Å alinti stulpelius"},"columns":"Stulpeliai","deleteTable":"Å alinti lentelÄ™","headers":"AntraÅ¡tÄ—s","headersBoth":"Abu","headersColumn":"Pirmas stulpelis","headersNone":"NÄ—ra","headersRow":"Pirma eilutÄ—","invalidBorder":"ReikÅ¡mÄ— turi bÅ«ti nurodyta skaiÄiumi.","invalidCellPadding":"ReikÅ¡mÄ— turi bÅ«ti nurodyta skaiÄiumi.","invalidCellSpacing":"ReikÅ¡mÄ— turi bÅ«ti nurodyta skaiÄiumi.","invalidCols":"SkaiÄius turi bÅ«ti didesnis nei 0.","invalidHeight":"ReikÅ¡mÄ— turi bÅ«ti nurodyta skaiÄiumi.","invalidRows":"SkaiÄius turi bÅ«ti didesnis nei 0.","invalidWidth":"ReikÅ¡mÄ— turi bÅ«ti nurodyta skaiÄiumi.","menu":"LentelÄ—s savybÄ—s","row":{"menu":"EilutÄ—","insertBefore":"Ä®terpti eilutÄ™ prieÅ¡","insertAfter":"Ä®terpti eilutÄ™ po","deleteRow":"Å alinti eilutes"},"rows":"EilutÄ—s","summary":"Santrauka","title":"LentelÄ—s savybÄ—s","toolbar":"LentelÄ—","widthPc":"procentais","widthPx":"taÅ¡kais","widthUnit":"ploÄio vienetas"},"undo":{"redo":"Atstatyti","undo":"AtÅ¡aukti"},"wsc":{"btnIgnore":"Ignoruoti","btnIgnoreAll":"Ignoruoti visus","btnReplace":"Pakeisti","btnReplaceAll":"Pakeisti visus","btnUndo":"AtÅ¡aukti","changeTo":"Pakeisti į","errorLoading":"Klaida įkraunant servisÄ…: %s.","ieSpellDownload":"RaÅ¡ybos tikrinimas neinstaliuotas. Ar JÅ«s norite jį dabar atsisiųsti?","manyChanges":"RaÅ¡ybos tikrinimas baigtas: Pakeista %1 žodžių","noChanges":"RaÅ¡ybos tikrinimas baigtas: NÄ—ra pakeistų žodžių","noMispell":"RaÅ¡ybos tikrinimas baigtas: Nerasta raÅ¡ybos klaidų","noSuggestions":"- NÄ—ra pasiÅ«lymų -","notAvailable":"Atleiskite, Å¡iuo metu servisas neprieinamas.","notInDic":"Žodyne nerastas","oneChange":"RaÅ¡ybos tikrinimas baigtas: Vienas žodis pakeistas","progress":"Vyksta raÅ¡ybos tikrinimas...","title":"Tikrinti klaidas","toolbar":"RaÅ¡ybos tikrinimas"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/lv.js b/js/ckeditor/lang/lv.js
new file mode 100644
index 0000000..3df4d63
--- /dev/null
+++ b/js/ckeditor/lang/lv.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['lv']={"editor":"BagÄtinÄtÄ teksta redaktors","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"PalÄ«dzÄ«bai, nospiediet ALT 0 ","browseServer":"SkatÄ«t servera saturu","url":"URL","protocol":"Protokols","upload":"AugÅ¡upielÄdÄ“t","uploadSubmit":"NosÅ«tÄ«t serverim","image":"AttÄ“ls","flash":"Flash","form":"Forma","checkbox":"AtzÄ«mÄ“Å¡anas kastÄ«te","radio":"IzvÄ“les poga","textField":"Teksta rinda","textarea":"Teksta laukums","hiddenField":"PaslÄ“pta teksta rinda","button":"Poga","select":"IezÄ«mÄ“Å¡anas lauks","imageButton":"AttÄ“lpoga","notSet":"<nav iestatÄ«ts>","id":"Id","name":"Nosaukums","langDir":"Valodas lasÄ«Å¡anas virziens","langDirLtr":"No kreisÄs uz labo (LTR)","langDirRtl":"No labÄs uz kreiso (RTL)","langCode":"Valodas kods","longDescr":"Gara apraksta Hipersaite","cssClass":"Stilu saraksta klases","advisoryTitle":"KonsultatÄ«vs virsraksts","cssStyle":"Stils","ok":"DarÄ«ts!","cancel":"Atcelt","close":"AizvÄ“rt","preview":"PriekÅ¡skatÄ«jums","resize":"MÄ“rogot","generalTab":"VispÄrÄ«gi","advancedTab":"IzvÄ“rstais","validateNumberFailed":"Å Ä« vÄ“rtÄ«ba nav skaitlis","confirmNewPage":"Jebkuras nesaglabÄtÄs izmaiņas tiks zaudÄ“tas. Vai tieÅ¡Äm vÄ“laties atvÄ“rt jaunu lapu?","confirmCancel":"Daži no uzstÄdÄ«jumiem ir mainÄ«ti. Vai tieÅ¡Äm vÄ“laties aizvÄ“rt Å¡o dialogu?","options":"UzstÄdÄ«jumi","target":"MÄ“rÄ·is","targetNew":"Jauns logs (_blank)","targetTop":"VirsÄ“jais logs (_top)","targetSelf":"Tas pats logs (_self)","targetParent":"Avota logs (_parent)","langDirLTR":"Kreisais uz Labo (LTR)","langDirRTL":"Labais uz Kreiso (RTL)","styles":"Stils","cssClasses":"Stilu klases","width":"Platums","height":"Augstums","align":"NolÄ«dzinÄt","alignLeft":"Pa kreisi","alignRight":"Pa labi","alignCenter":"CentrÄ“ti","alignJustify":"IzlÄ«dzinÄt malas","alignTop":"AugÅ¡Ä","alignMiddle":"VertikÄli centrÄ“ts","alignBottom":"ApakÅ¡Ä","alignNone":"None","invalidValue":"Nekorekta vÄ“rtÄ«ba","invalidHeight":"Augstumam jÄbÅ«t skaitlim.","invalidWidth":"Platumam jÄbÅ«t skaitlim","invalidCssLength":"Laukam \"%1\" norÄdÄ«tajai vÄ“rtÄ«bai jÄbÅ«t pozitÄ«vam skaitlim ar vai bez korektÄm CSS mÄ“rvienÄ«bÄm (px, %, in, cm, mm, em, ex, pt, vai pc).","invalidHtmlLength":"Laukam \"%1\" norÄdÄ«tajai vÄ“rtÄ«bai jÄbÅ«t pozitÄ«vam skaitlim ar vai bez korektÄm HTML mÄ“rvienÄ«bÄm (px vai %).","invalidInlineStyle":"IekļautajÄ stilÄ norÄdÄ«tajai vÄ“rtÄ«bai jÄsastÄv no viena vai vairÄkiem pÄriem pÄ“c forma'ta \"nosaukums: vÄ“rtÄ«ba\", atdalÄ«tiem ar semikolu.","cssLengthTooltip":"Ievadiet vÄ“rtÄ«bu pikseļos vai skaitli ar derÄ«gu CSS mÄ“rvienÄ«bu (px, %, in, cm, mm, em, ex, pt, vai pc).","unavailable":"%1<span class=\"cke_accessibility\">, nav pieejams</span>"},"about":{"copy":"KopÄ“Å¡anas tiesÄ«bas &copy; $1. Visas tiesÄ«bas rezervÄ“tas.","dlgTitle":"Par CKEditor","help":"PÄrbaudiet $1 palÄ«dzÄ«bai.","moreInfo":"InformÄcijai par licenzÄ“Å¡anu apmeklÄ“jiet mÅ«su mÄjas lapu:","title":"Par CKEditor","userGuide":"CKEditor LietotÄja pamÄcÄ«ba"},"basicstyles":{"bold":"TrekninÄts","italic":"KursÄ«vs","strike":"PÄrsvÄ«trots","subscript":"ApakÅ¡rakstÄ","superscript":"AugÅ¡rakstÄ","underline":"PasvÄ«trots"},"blockquote":{"toolbar":"Bloka citÄts"},"clipboard":{"copy":"KopÄ“t","copyError":"JÅ«su pÄrlÅ«kprogrammas droÅ¡Ä«bas iestatÄ«jumi nepieļauj redaktoram automÄtiski veikt kopÄ“Å¡anas darbÄ«bu. LÅ«dzu, izmantojiet (Ctrl/Cmd+C), lai veiktu Å¡o darbÄ«bu.","cut":"Izgriezt","cutError":"JÅ«su pÄrlÅ«kprogrammas droÅ¡Ä«bas iestatÄ«jumi nepieļauj redaktoram automÄtiski veikt izgriezÅ¡anas darbÄ«bu. LÅ«dzu, izmantojiet (Ctrl/Cmd+X), lai veiktu Å¡o darbÄ«bu.","paste":"IelÄ«mÄ“t","pasteArea":"IelÄ«mÄ“Å¡anas zona","pasteMsg":"LÅ«dzu, ievietojiet tekstu Å¡ajÄ laukumÄ, izmantojot klaviatÅ«ru (<STRONG>Ctrl/Cmd+V</STRONG>) un apstipriniet ar <STRONG>DarÄ«ts!</STRONG>.","securityMsg":"JÅ«su pÄrlÅ«ka droÅ¡Ä«bas uzstÄdÄ«jumu dēļ, nav iespÄ“jams tieÅ¡i piekļūt jÅ«su starpliktuvei. Jums jÄielÄ«mÄ“ atkÄrtoti Å¡ajÄ logÄ.","title":"Ievietot"},"contextmenu":{"options":"UznirstoÅ¡Äs izvÄ“lnes uzstÄdÄ«jumi"},"button":{"selectedLabel":"%1 (Selected)"},"toolbar":{"toolbarCollapse":"AizvÄ“rt rÄ«kjoslu","toolbarExpand":"AtvÄ“rt rÄ«kjoslu","toolbarGroups":{"document":"Dokuments","clipboard":"Starpliktuve/Atcelt","editing":"LaboÅ¡ana","forms":"Formas","basicstyles":"Pamata stili","paragraph":"ParagrÄfs","links":"Saites","insert":"Ievietot","styles":"Stili","colors":"KrÄsas","tools":"RÄ«ki"},"toolbars":"Redaktora rÄ«kjoslas"},"elementspath":{"eleLabel":"Elementa ceļš","eleTitle":"%1 elements"},"format":{"label":"FormÄts","panelTitle":"FormÄts","tag_address":"Adrese","tag_div":"Rindkopa (DIV)","tag_h1":"Virsraksts 1","tag_h2":"Virsraksts 2","tag_h3":"Virsraksts 3","tag_h4":"Virsraksts 4","tag_h5":"Virsraksts 5","tag_h6":"Virsraksts 6","tag_p":"NormÄls teksts","tag_pre":"FormatÄ“ts teksts"},"horizontalrule":{"toolbar":"Ievietot horizontÄlu AtdalÄ«tÄjsvÄ«tru"},"image":{"alertUrl":"LÅ«dzu norÄdÄ«t attÄ“la hipersaiti","alt":"AlternatÄ«vais teksts","border":"RÄmis","btnUpload":"NosÅ«tÄ«t serverim","button2Img":"Vai vÄ“laties pÄrveidot izvÄ“lÄ“to attÄ“la pogu uz attÄ“la?","hSpace":"HorizontÄlÄ telpa","img2Button":"Vai vÄ“laties pÄrveidot izvÄ“lÄ“to attÄ“lu uz attÄ“la pogas?","infoTab":"InformÄcija par attÄ“lu","linkTab":"Hipersaite","lockRatio":"NemainÄ«ga Augstuma/Platuma attiecÄ«ba","menu":"AttÄ“la Ä«paÅ¡Ä«bas","resetSize":"Atjaunot sÄkotnÄ“jo izmÄ“ru","title":"AttÄ“la Ä«paÅ¡Ä«bas","titleButton":"AttÄ“lpogas Ä«paÅ¡Ä«bas","upload":"AugÅ¡upielÄdÄ“t","urlMissing":"TrÅ«kst attÄ“la atraÅ¡anÄs adrese.","vSpace":"VertikÄlÄ telpa","validateBorder":"Apmalei jÄbÅ«t veselam skaitlim","validateHSpace":"HSpace jÄbÅ«t veselam skaitlim","validateVSpace":"VSpace jÄbÅ«t veselam skaitlim"},"indent":{"indent":"PalielinÄt atkÄpi","outdent":"SamazinÄt atkÄpi"},"fakeobjects":{"anchor":"IezÄ«me","flash":"Flash animÄcija","hiddenfield":"SlÄ“pts lauks","iframe":"Iframe","unknown":"NezinÄms objekts"},"link":{"acccessKey":"Pieejas taustiņš","advanced":"IzvÄ“rstais","advisoryContentType":"KonsultatÄ«vs satura tips","advisoryTitle":"KonsultatÄ«vs virsraksts","anchor":{"toolbar":"Ievietot/Labot iezÄ«mi","menu":"Labot iezÄ«mi","title":"IezÄ«mes uzstÄdÄ«jumi","name":"IezÄ«mes nosaukums","errorName":"LÅ«dzu norÄdiet iezÄ«mes nosaukumu","remove":"Noņemt iezÄ«mi"},"anchorId":"PÄ“c elementa ID","anchorName":"PÄ“c iezÄ«mes nosaukuma","charset":"PievienotÄ resursa kodÄ“jums","cssClasses":"Stilu saraksta klases","emailAddress":"E-pasta adrese","emailBody":"Ziņas saturs","emailSubject":"Ziņas tÄ“ma","id":"ID","info":"Hipersaites informÄcija","langCode":"Valodas kods","langDir":"Valodas lasÄ«Å¡anas virziens","langDirLTR":"No kreisÄs uz labo (LTR)","langDirRTL":"No labÄs uz kreiso (RTL)","menu":"Labot hipersaiti","name":"Nosaukums","noAnchors":"(Å ajÄ dokumentÄ nav iezÄ«mju)","noEmail":"LÅ«dzu norÄdi e-pasta adresi","noUrl":"LÅ«dzu norÄdi hipersaiti","other":"<cits>","popupDependent":"AtkarÄ«gs (Netscape)","popupFeatures":"UznirstoÅ¡Ä loga nosaukums Ä«paÅ¡Ä«bas","popupFullScreen":"PilnÄ ekrÄnÄ (IE)","popupLeft":"KreisÄ koordinÄte","popupLocationBar":"AtraÅ¡anÄs vietas josla","popupMenuBar":"IzvÄ“lnes josla","popupResizable":"MÄ“rogojams","popupScrollBars":"Ritjoslas","popupStatusBar":"Statusa josla","popupToolbar":"RÄ«ku josla","popupTop":"AugÅ¡Ä“jÄ koordinÄte","rel":"RelÄcija","selectAnchor":"IzvÄ“lÄ“ties iezÄ«mi","styles":"Stils","tabIndex":"Ciļņu indekss","target":"MÄ“rÄ·is","targetFrame":"<ietvars>","targetFrameName":"MÄ“rÄ·a ietvara nosaukums","targetPopup":"<uznirstoÅ¡Ä logÄ>","targetPopupName":"UznirstoÅ¡Ä loga nosaukums","title":"Hipersaite","toAnchor":"IezÄ«me Å¡ajÄ lapÄ","toEmail":"E-pasts","toUrl":"Adrese","toolbar":"Ievietot/Labot hipersaiti","type":"Hipersaites tips","unlink":"Noņemt hipersaiti","upload":"AugÅ¡upielÄdÄ“t"},"list":{"bulletedlist":"Pievienot/Noņemt vienkÄrÅ¡u sarakstu","numberedlist":"NumurÄ“ts saraksts"},"magicline":{"title":"Ievietot Å¡eit rindkopu"},"maximize":{"maximize":"MaksimizÄ“t","minimize":"MinimizÄ“t"},"pastetext":{"button":"Ievietot kÄ vienkÄrÅ¡u tekstu","title":"Ievietot kÄ vienkÄrÅ¡u tekstu"},"pastefromword":{"confirmCleanup":"Teksts, kuru vÄ“laties ielÄ«mÄ“t, izskatÄs ir nokopÄ“ts no Word. Vai vÄ“laties to iztÄ«rÄ«t pirms ielÄ«mÄ“Å¡anas?","error":"IekÅ¡Ä“jas kļūdas dēļ, neizdevÄs iztÄ«rÄ«t ielÄ«mÄ“tos datus.","title":"Ievietot no Worda","toolbar":"Ievietot no Worda"},"removeformat":{"toolbar":"Noņemt stilus"},"sourcearea":{"toolbar":"HTML kods"},"specialchar":{"options":"SpeciÄlo simbolu uzstÄdÄ«jumi","title":"Ievietot Ä«paÅ¡u simbolu","toolbar":"Ievietot speciÄlo simbolu"},"scayt":{"btn_about":"Par SCAYT","btn_dictionaries":"VÄrdnÄ«cas","btn_disable":"AtslÄ“gt SCAYT","btn_enable":"IeslÄ“gt SCAYT","btn_langs":"Valodas","btn_options":"UzstÄdÄ«jumi","text_title":"PÄrbaudÄ«t gramatiku rakstot"},"stylescombo":{"label":"Stils","panelTitle":"FormatÄ“Å¡anas stili","panelTitle1":"Bloka stili","panelTitle2":"iekļautie stili","panelTitle3":"Objekta stili"},"table":{"border":"RÄmja izmÄ“rs","caption":"LeÄ£enda","cell":{"menu":"Å Å«na","insertBefore":"Pievienot Å¡Å«nu pirms","insertAfter":"Pievienot Å¡Å«nu pÄ“c","deleteCell":"DzÄ“st rÅ«tiņas","merge":"Apvienot rÅ«tiņas","mergeRight":"Apvieno pa labi","mergeDown":"Apvienot uz leju","splitHorizontal":"SadalÄ«t Å¡Å«nu horizontÄli","splitVertical":"SadalÄ«t Å¡Å«nu vertikÄli","title":"Å Å«nas uzstÄdÄ«jumi","cellType":"Å Å«nas tips","rowSpan":"Apvienotas rindas","colSpan":"Apvienotas kolonas","wordWrap":"VÄrdu pÄrnese","hAlign":"HorizontÄlais novietojums","vAlign":"VertikÄlais novietojums","alignBaseline":"Pamatrinda","bgColor":"Fona krÄsa","borderColor":"RÄmja krÄsa","data":"Dati","header":"Virsraksts","yes":"JÄ","no":"NÄ“","invalidWidth":"Å Å«nas platumam jÄbÅ«t skaitlim","invalidHeight":"Å Å«nas augstumam jÄbÅ«t skaitlim","invalidRowSpan":"Apvienojamo rindu skaitam jÄbÅ«t veselam skaitlim","invalidColSpan":"Apvienojamo kolonu skaitam jÄbÅ«t veselam skaitlim","chooseColor":"IzvÄ“lÄ“ties"},"cellPad":"RÅ«tiņu nobÄ«de","cellSpace":"RÅ«tiņu atstatums","column":{"menu":"Kolonna","insertBefore":"Ievietot kolonu pirms","insertAfter":"Ievieto kolonu pÄ“c","deleteColumn":"DzÄ“st kolonnas"},"columns":"Kolonnas","deleteTable":"DzÄ“st tabulu","headers":"Virsraksti","headersBoth":"Abi","headersColumn":"PirmÄ kolona","headersNone":"Nekas","headersRow":"PirmÄ rinda","invalidBorder":"RÄmju izmÄ“ram jÄbÅ«t skaitlim","invalidCellPadding":"Å Å«nu atkÄpÄ“m jÄbÅ«t pozitÄ«vam skaitlim","invalidCellSpacing":"Å Å«nu atstarpÄ“m jÄbÅ«t pozitÄ«vam skaitlim","invalidCols":"Kolonu skaitam jÄbÅ«t lielÄkam par 0","invalidHeight":"Tabulas augstumam jÄbÅ«t skaitlim","invalidRows":"Rindu skaitam jÄbÅ«t lielÄkam par 0","invalidWidth":"Tabulas platumam jÄbÅ«t skaitlim","menu":"Tabulas Ä«paÅ¡Ä«bas","row":{"menu":"Rinda","insertBefore":"Ievietot rindu pirms","insertAfter":"Ievietot rindu pÄ“c","deleteRow":"DzÄ“st rindas"},"rows":"Rindas","summary":"AnotÄcija","title":"Tabulas Ä«paÅ¡Ä«bas","toolbar":"Tabula","widthPc":"procentuÄli","widthPx":"pikseļos","widthUnit":"platuma mÄ“rvienÄ«ba"},"undo":{"redo":"AtkÄrtot","undo":"Atcelt"},"wsc":{"btnIgnore":"IgnorÄ“t","btnIgnoreAll":"IgnorÄ“t visu","btnReplace":"Aizvietot","btnReplaceAll":"Aizvietot visu","btnUndo":"Atcelt","changeTo":"NomainÄ«t uz","errorLoading":"Kļūda ielÄdÄ“jot aplikÄcijas servisa adresi: %s.","ieSpellDownload":"PareizrakstÄ«bas pÄrbaudÄ«tÄjs nav pievienots. Vai vÄ“laties to lejupielÄdÄ“t tagad?","manyChanges":"PareizrakstÄ«bas pÄrbaude pabeigta: %1 vÄrdi tika mainÄ«ti","noChanges":"PareizrakstÄ«bas pÄrbaude pabeigta: nekas netika labots","noMispell":"PareizrakstÄ«bas pÄrbaude pabeigta: kļūdas netika atrastas","noSuggestions":"- Nav ieteikumu -","notAvailable":"Atvainojiet, bet serviss Å¡obrÄ«d nav pieejams.","notInDic":"Netika atrasts vÄrdnÄ«cÄ","oneChange":"PareizrakstÄ«bas pÄrbaude pabeigta: 1 vÄrds izmainÄ«ts","progress":"Notiek pareizrakstÄ«bas pÄrbaude...","title":"PÄrbaudÄ«t gramatiku","toolbar":"PareizrakstÄ«bas pÄrbaude"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/mk.js b/js/ckeditor/lang/mk.js
new file mode 100644
index 0000000..dedab5d
--- /dev/null
+++ b/js/ckeditor/lang/mk.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['mk']={"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":"ĐĐ¿ÑˆÑ‚Đ¾","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","alignLeft":"Left","alignRight":"Right","alignCenter":"Center","alignJustify":"Justify","alignTop":"Top","alignMiddle":"Middle","alignBottom":"Bottom","alignNone":"None","invalidValue":"Invalid value.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","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>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Bold","italic":"Italic","strike":"Strikethrough","subscript":"Subscript","superscript":"Superscript","underline":"Underline"},"blockquote":{"toolbar":"Block Quote"},"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","pasteArea":"Paste Area","pasteMsg":"Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK","securityMsg":"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.","title":"Paste"},"contextmenu":{"options":"Context Menu Options"},"button":{"selectedLabel":"%1 (Selected)"},"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"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"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"},"image":{"alertUrl":"Please type the image URL","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"},"fakeobjects":{"anchor":"Anchor","flash":"Flash Animation","hiddenfield":"Hidden Field","iframe":"IFrame","unknown":"Unknown Object"},"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","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","other":"<other>","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","toolbar":"Link","type":"Link Type","unlink":"Unlink","upload":"Upload"},"list":{"bulletedlist":"Insert/Remove Bulleted List","numberedlist":"Insert/Remove Numbered List"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximize","minimize":"Minimize"},"pastetext":{"button":"Paste as plain text","title":"Paste as Plain Text"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Paste from Word","toolbar":"Paste from Word"},"removeformat":{"toolbar":"Remove Format"},"sourcearea":{"toolbar":"Source"},"specialchar":{"options":"Special Character Options","title":"Select Special Character","toolbar":"Insert Special Character"},"scayt":{"btn_about":"About SCAYT","btn_dictionaries":"Dictionaries","btn_disable":"Disable SCAYT","btn_enable":"Enable SCAYT","btn_langs":"Languages","btn_options":"Options","text_title":"Spell Check As You Type"},"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"},"wsc":{"btnIgnore":"Ignore","btnIgnoreAll":"Ignore All","btnReplace":"Replace","btnReplaceAll":"Replace All","btnUndo":"Undo","changeTo":"Change to","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Spell checker not installed. Do you want to download it now?","manyChanges":"Spell check complete: %1 words changed","noChanges":"Spell check complete: No words changed","noMispell":"Spell check complete: No misspellings found","noSuggestions":"- No suggestions -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Not in dictionary","oneChange":"Spell check complete: One word changed","progress":"Spell check in progress...","title":"Spell Checker","toolbar":"Check Spelling"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/mn.js b/js/ckeditor/lang/mn.js
new file mode 100644
index 0000000..e8b30c0
--- /dev/null
+++ b/js/ckeditor/lang/mn.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['mn']={"editor":"Đ¥ÑлбÑрт Đ±Đ¸Ñ‡Đ²ÑÑ€ Đ±Đ¾Đ»Đ¾Đ²ÑÑ€ÑƒÑƒĐ»Đ°Đ³Ñ‡","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Press ALT 0 for help","browseServer":"̉®Đ¹Đ»Ñ‡Đ»ÑĐ³Ñ‡ Ñ‚Đ¾Đ¾Ñ†Đ¾Đ¾Đ»ÑƒÑƒÑ€ (ÑĐµÑ€Đ²ÑÑ€)-Đ¸Đ¹Đ³ ̉¯Đ·ÑÑ…","url":"Ñ†Đ°Ñ…Đ¸Đ¼ Ñ…ÑƒÑƒĐ´Đ°ÑĐ½Ñ‹ Ñ…Đ°ÑĐ³ (URL)","protocol":"ĐŸÑ€Đ¾Ñ‚Đ¾ĐºĐ¾Đ»","upload":"Đ˜Đ»Đ³ÑÑж Đ°Ñ‡Đ°Đ°Đ»Đ°Ñ…","uploadSubmit":"̉®̉¯Đ½Đ¸Đ¹Đ³ ̉¯Đ¹Đ»Ñ‡Đ»ÑĐ³Ñ‡ Ñ‚Đ¾Đ¾Ñ†Đ¾Đ¾Đ»ÑƒÑƒÑ€ (ÑĐµÑ€Đ²ĐµÑ€) Đ»̉¯̉¯ Đ¸Đ»Đ³ÑÑÑ…","image":"Đ—ÑƒÑ€Đ°Đ³","flash":"Đ¤Đ»Đ°Ñˆ Ñ…Ó©Đ´Ó©Đ»Đ³Ó©Ó©Đ½Ñ‚ÑĐ¹ Đ·ÑƒÑ€Đ°Đ³","form":"ĐœĐ°ÑĐ³Ñ‚","checkbox":"Đ¢ÑĐ¼Đ´ÑĐ³Đ»ÑÑĐ½Đ¸Đ¹ Đ½̉¯Đ´","radio":"Đ Đ°Đ´Đ¸Đ¾ Ñ‚Đ¾Đ²Ñ‡Đ»ÑƒÑƒÑ€","textField":"Đ‘Đ¸Ñ‡Đ²ÑÑ€Đ¸Đ¹Đ½ Ñ‚Đ°Đ»Đ±Đ°Ñ€","textarea":"Đ‘Đ¸Ñ‡Đ²ÑÑ€Đ¸Đ¹Đ½ Đ·Đ°Đ¹","hiddenField":"Далд Ñ‚Đ°Đ»Đ±Đ°Ñ€","button":"Đ¢Đ¾Đ²Ñ‡Đ»ÑƒÑƒÑ€","select":"Đ¡Đ¾Đ½Đ³Đ¾Đ»Ñ‚Ñ‹Đ½ Ñ‚Đ°Đ»Đ±Đ°Ñ€","imageButton":"Đ—ÑƒÑ€Đ³Đ¸Đ¹ Ñ‚Đ¾Đ²Ñ‡ÑƒÑƒÑ€","notSet":"<Ñ‚Đ¾Ñ…Đ¸Ñ€ÑƒÑƒĐ»Đ°Đ°Đ³̉¯Đ¹>","id":"Id (Ñ‚ĐµÑ…Đ½Đ¸ĐºĐ¸Đ¹Đ½ Đ½ÑÑ€)","name":"ĐÑÑ€","langDir":"Đ¥ÑĐ»Đ½Đ¸Đ¹ Ñ‡Đ¸Đ³Đ»ÑĐ»","langDirLtr":"Đ—̉¯̉¯Đ½ÑÑÑ Đ±Đ°Ñ€ÑƒÑƒĐ½ (LTR)","langDirRtl":"Đ‘Đ°Ñ€ÑƒÑƒĐ½Đ°Đ°Ñ Đ·̉¯̉¯Đ½ (RTL)","langCode":"Đ¥ÑĐ»Đ½Đ¸Đ¹ ĐºĐ¾Đ´","longDescr":"Đ£Ñ€Ñ‚ Ñ‚Đ°Đ¹Đ»Đ±Đ°Ñ€Ñ‹Đ½ Đ²Ñб Ñ…Đ°ÑĐ³","cssClass":"Đ¥ÑлбÑÑ€Đ¸Đ¹Đ½ Ñ…ÑƒÑƒĐ´Đ°ÑĐ½Ñ‹ Đ°Đ½Đ³Đ¸ÑƒĐ´","advisoryTitle":"Đ—Ó©Đ²Đ»Ó©Ñ… Đ³Đ°Ñ€Ñ‡Đ¸Đ³","cssStyle":"Đ—Đ°Đ³Đ²Đ°Ñ€","ok":"Đ—Đ°","cancel":"Đ‘Đ¾Đ»Đ¸Ñ…","close":"Đ¥Đ°Đ°Ñ…","preview":"Đ£Ñ€ÑŒĐ´Ñ‡Đ¸Đ»Đ°Đ½ Ñ…Đ°Ñ€Đ°Ñ…","resize":"Resize","generalTab":"Đ•Ñ€Ó©Đ½Ñ…Đ¸Đ¹","advancedTab":"Đ“̉¯Đ½Đ·Đ³Đ¸Đ¹","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":"Đ¡Đ¾Đ½Đ³Đ¾Đ»Ñ‚","target":"Đ‘Đ°Đ¹","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"Đ—̉¯̉¯Đ½ Ñ‚Đ°Đ»Đ°Đ°Ñ Đ±Đ°Ñ€ÑƒÑƒĐ½ Ñ‚Đ¸Đ¹ÑˆÑÑ (LTR)","langDirRTL":"Đ‘Đ°Ñ€ÑƒÑƒĐ½ Ñ‚Đ°Đ»Đ°Đ°Ñ Đ·̉¯̉¯Đ½ Ñ‚Đ¸Đ¹ÑˆÑÑ (RTL)","styles":"Đ—Đ°Đ³Đ²Đ°Ñ€","cssClasses":"Đ¥ÑлбÑÑ€Đ¸Đ¹Đ½ Ñ…ÑƒÑƒĐ´Đ°ÑĐ½Ñ‹ Đ°Đ½Đ³Đ¸ÑƒĐ´","width":"Ó¨Ñ€Đ³Ó©Đ½","height":"Ó¨Đ½Đ´Ó©Ñ€","align":"Đ­Đ³Đ½ÑÑ","alignLeft":"Đ—̉¯̉¯Đ½","alignRight":"Đ‘Đ°Ñ€ÑƒÑƒĐ½","alignCenter":"Đ¢Ó©Đ²Đ´","alignJustify":"Đ¢ÑĐ³ÑˆĐ»ÑÑ…","alignTop":"Đ”ÑÑĐ´ Ñ‚Đ°Đ»Đ´","alignMiddle":"Đ”ÑƒĐ½Đ´","alignBottom":"Đ”Đ¾Đ¾Đ´ Ñ‚Đ°Đ»Đ´","alignNone":"None","invalidValue":"Invalid value.","invalidHeight":"Ó¨Đ½Đ´Ó©Ñ€ Đ½ÑŒ Ñ‚Đ¾Đ¾ Đ±Đ°Đ¹Ñ… Ñ‘ÑÑ‚Đ¾Đ¹.","invalidWidth":"Ó¨Ñ€Đ³Ó©Đ½ Đ½ÑŒ Ñ‚Đ¾Đ¾ Đ±Đ°Đ¹Ñ… Ñ‘ÑÑ‚Đ¾Đ¹.","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>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Đ¢Đ¾Đ´ б̉¯Đ´̉¯̉¯Đ½","italic":"ĐĐ°Đ»ÑƒÑƒ","strike":"Đ”ÑƒĐ½Đ´ÑƒÑƒÑ€ Đ½ÑŒ Đ·ÑƒÑ€Đ°Đ°ÑÑ‚Đ°Đ¹ Đ±Đ¾Đ»Đ³Đ¾Ñ…","subscript":"Đ¡ÑƒÑƒÑ€ÑŒ Đ±Đ¾Đ»Đ³Đ¾Ñ…","superscript":"Đ—ÑÑ€ÑĐ³ Đ±Đ¾Đ»Đ³Đ¾Ñ…","underline":"Đ”Đ¾Đ¾Đ³ÑƒÑƒÑ€ Đ½ÑŒ Đ·ÑƒÑ€Đ°Đ°ÑÑ‚Đ°Đ¹ Đ±Đ¾Đ»Đ³Đ¾Ñ…"},"blockquote":{"toolbar":"Đ˜ÑˆĐ»ÑĐ» Ñ…ÑÑÑĐ³"},"clipboard":{"copy":"Đ¥ÑƒÑƒĐ»Đ°Ñ…","copyError":"Đ¢Đ°Đ½Ñ‹ browser-Ñ‹Đ½ Ñ…Đ°Đ¼Đ³Đ°Đ°Đ»Đ°Đ»Ñ‚Ñ‹Đ½ Ñ‚Đ¾Ñ…Đ¸Ñ€Đ³Đ¾Đ¾ editor-Đ´ Đ°Đ²Ñ‚Đ¾Đ¼Đ°Ñ‚Đ°Đ°Ñ€ Ñ…ÑƒÑƒĐ»Đ°Ñ… ̉¯Đ¹Đ»Đ´ÑĐ»Đ¸Đ¹Đ³ Đ·Ó©Đ²ÑˆÓ©Ó©Ñ€Ó©Ñ…Đ³̉¯Đ¹ Đ±Đ°Đ¹Đ½Đ°. (Ctrl/Cmd+C) Ñ‚Đ¾Đ²Ñ‡Đ½Ñ‹ Ñ…Đ¾ÑĐ»Đ¾Đ»Ñ‹Đ³ Đ°ÑˆĐ¸Đ³Đ»Đ°Đ½Đ° уу.","cut":"Đ¥Đ°Đ¹Ñ‡Đ»Đ°Ñ…","cutError":"Đ¢Đ°Đ½Ñ‹ browser-Ñ‹Đ½ Ñ…Đ°Đ¼Đ³Đ°Đ°Đ»Đ°Đ»Ñ‚Ñ‹Đ½ Ñ‚Đ¾Ñ…Đ¸Ñ€Đ³Đ¾Đ¾ editor-Đ´ Đ°Đ²Ñ‚Đ¾Đ¼Đ°Ñ‚Đ°Đ°Ñ€ Ñ…Đ°Đ¹Ñ‡Đ»Đ°Ñ… ̉¯Đ¹Đ»Đ´ÑĐ»Đ¸Đ¹Đ³ Đ·Ó©Đ²ÑˆÓ©Ó©Ñ€Ó©Ñ…Đ³̉¯Đ¹ Đ±Đ°Đ¹Đ½Đ°. (Ctrl/Cmd+X) Ñ‚Đ¾Đ²Ñ‡Đ½Ñ‹ Ñ…Đ¾ÑĐ»Đ¾Đ»Ñ‹Đ³ Đ°ÑˆĐ¸Đ³Đ»Đ°Đ½Đ° уу.","paste":"Đ‘ÑƒÑƒĐ»Đ³Đ°Ñ…","pasteArea":"Paste Area","pasteMsg":"(<strong>Ctrl/Cmd+V</strong>) Ñ‚Đ¾Đ²Ñ‡Đ¸Đ¹Đ³ Đ°ÑˆĐ¸Đ³Đ»Đ°Đ½ paste Ñ…Đ¸Đ¹Đ½Ñ ̉¯̉¯. ĐœÓ©Đ½ <strong>OK</strong> Đ´Đ°Ñ€.","securityMsg":"Đ¢Đ°Đ½Ñ‹ ̉¯Đ·̉¯̉¯Đ»ÑĐ³Ñ‡/browser/-Đ½ Ñ…Đ°Đ¼Đ³Đ°Đ°Đ»Đ°Đ»Ñ‚Ñ‹Đ½ Ñ‚Đ¾Ñ…Đ¸Ñ€Đ³Đ¾Đ¾Đ½Đ¾Đ¾Ñ Đ±Đ¾Đ»Đ¾Đ¾Đ´ editor clipboard Ó©Đ³Ó©Đ³Đ´Ó©Đ»Ñ€̉¯̉¯ ÑˆÑƒÑƒĐ´ Ñ…Đ°Đ½Đ´Đ°Ñ… Đ±Đ¾Đ»Đ¾Đ¼Đ¶Đ³̉¯Đ¹. Đ­Đ½Ñ Ñ†Đ¾Đ½Ñ…Đ¾Đ´ Đ´Đ°Ñ…Đ¸Đ½ paste Ñ…Đ¸Đ¹Ñ…Đ¸Đ¹Đ³ Đ¾Ñ€Đ¾Đ»Đ´.","title":"Đ‘ÑƒÑƒĐ»Đ³Đ°Ñ…"},"contextmenu":{"options":"Context Menu Options"},"button":{"selectedLabel":"%1 (Selected)"},"toolbar":{"toolbarCollapse":"Collapse Toolbar","toolbarExpand":"Expand Toolbar","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Đ¥Đ¾Đ»Đ±Đ¾Đ¾ÑÑƒÑƒĐ´","insert":"ĐÑ€ÑƒÑƒĐ»Đ°Ñ…","styles":"Đ—Đ°Đ³Đ²Đ°Ñ€ÑƒÑƒĐ´","colors":"ĐĐ½Đ³Ó©Đ½̉¯̉¯Đ´","tools":"Đ¥ÑÑ€ÑĐ³ÑĐ»̉¯̉¯Đ´"},"toolbars":"Đ‘Đ¾Đ»Đ¾ÑÑ€ÑƒÑƒĐ»Đ°Đ³Ñ‡Đ¸Đ¹Đ½ Ñ…ÑÑ€ÑĐ³ÑĐ»Đ¸Đ¹Đ½ ÑĐ°Đ¼Đ±Đ°Ñ€"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"format":{"label":"ĐŸĐ°Ñ€Đ°Ñ€Đ³Đ°Ñ„Ñ‹Đ½ Đ·Đ°Đ³Đ²Đ°Ñ€","panelTitle":"ĐŸĐ°Ñ€Đ°Ñ€Đ³Đ°Ñ„Ñ‹Đ½ Đ·Đ°Đ³Đ²Đ°Ñ€","tag_address":"Đ¥Đ°ÑĐ³","tag_div":"Paragraph (DIV)","tag_h1":"Đ“Đ°Ñ€Ñ‡Đ¸Đ³ 1","tag_h2":"Đ“Đ°Ñ€Ñ‡Đ¸Đ³ 2","tag_h3":"Đ“Đ°Ñ€Ñ‡Đ¸Đ³ 3","tag_h4":"Đ“Đ°Ñ€Ñ‡Đ¸Đ³ 4","tag_h5":"Đ“Đ°Ñ€Ñ‡Đ¸Đ³ 5","tag_h6":"Đ“Đ°Ñ€Ñ‡Đ¸Đ³ 6","tag_p":"Đ¥ÑĐ²Đ¸Đ¹Đ½","tag_pre":"Formatted"},"horizontalrule":{"toolbar":"Đ¥Ó©Đ½Đ´Đ»Ó©Đ½ Đ·ÑƒÑ€Đ°Đ°Ñ Đ¾Ñ€ÑƒÑƒĐ»Đ°Ñ…"},"image":{"alertUrl":"Đ—ÑƒÑ€Đ°Đ³Đ½Ñ‹ URL-Ñ‹Đ½ Ñ‚Ó©Ñ€Đ»Đ¸Đ¹Đ½ ÑĐ¾Đ½Đ³Đ¾Đ½Đ¾ уу","alt":"Đ—ÑƒÑ€Đ³Đ¸Đ¹Đ³ Đ¾Ñ€Đ»Đ¾Ñ… Đ±Đ¸Ñ‡Đ²ÑÑ€","border":"Đ¥̉¯Ñ€ÑÑ","btnUpload":"̉®̉¯Đ½Đ¸Đ¹Đ³ ÑĐµÑ€Đ²Ñрр̉¯̉¯ Đ¸Đ»Đ³ÑÑ","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"Đ¥Ó©Đ½Đ´Đ»Ó©Đ½ Đ·Đ°Đ¹","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"Đ—ÑƒÑ€Đ°Đ³Đ½Ñ‹ Đ¼ÑĐ´ÑÑĐ»ÑĐ»","linkTab":"Đ¥Đ¾Đ»Đ±Đ¾Đ¾Ñ","lockRatio":"Đ Đ°Đ´Đ¸Đ¾ Ñ‚̉¯Đ³Đ¶Đ¸Ñ…","menu":"Đ—ÑƒÑ€Đ°Đ³","resetSize":"Ñ…ÑĐ¼Đ¶ÑÑ Đ´Đ°Ñ…Đ¸Đ½ Đ¾Đ½Đ¾Đ¾Ñ…","title":"Đ—ÑƒÑ€Đ°Đ³","titleButton":"Đ—ÑƒÑ€Đ³Đ°Đ½ Ñ‚Đ¾Đ²Ñ‡Đ½Ñ‹ ÑˆĐ¸Đ½Đ¶ Ñ‡Đ°Đ½Đ°Ñ€","upload":"Đ¥ÑƒÑƒĐ»Đ°Ñ…","urlMissing":"Đ—ÑƒÑ€Đ³Đ¸Đ¹Đ½ ÑÑ… ÑÑƒÑ€Đ²Đ°Đ»Đ¶Đ¸Đ¹Đ½ Ñ…Đ°ÑĐ³ (URL) Đ±Đ°Đ¹Ñ…Đ³̉¯Đ¹ Đ±Đ°Đ¹Đ½Đ°.","vSpace":"Đ‘Đ¾ÑĐ¾Đ¾ Đ·Đ°Đ¹","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"indent":{"indent":"Đ”Đ¾Đ³Đ¾Đ» Đ¼Ó©Ñ€ Ñ…Đ°ÑĐ°Ñ…","outdent":"Đ”Đ¾Đ³Đ¾Đ» Đ¼Ó©Ñ€ Đ½ÑĐ¼ÑÑ…"},"fakeobjects":{"anchor":"Đ—Đ°Đ½Đ³ÑƒÑƒ","flash":"Flash Animation","hiddenfield":"Đууц Ñ‚Đ°Đ»Đ±Đ°Ñ€","iframe":"IFrame","unknown":"Unknown Object"},"link":{"acccessKey":"Đ¥Đ¾Đ»Đ±Đ¾Ñ… Ñ‚̉¯Đ»Ñ…̉¯̉¯Ñ€","advanced":"ĐÑĐ¼ÑĐ»Ñ‚","advisoryContentType":"Đ—Ó©Đ²Đ»Ó©Đ»Đ´Ó©Ñ… Ñ‚Ó©Ñ€Đ»Đ¸Đ¹Đ½ Đ°Đ³ÑƒÑƒĐ»Đ³Đ°","advisoryTitle":"Đ—Ó©Đ²Đ»Ó©Đ»Đ´Ó©Ñ… Đ³Đ°Ñ€Ñ‡Đ¸Đ³","anchor":{"toolbar":"Đ—Đ°Đ½Đ³ÑƒÑƒ","menu":"Đ—Đ°Đ½Đ³ÑƒÑƒĐ³ Đ±Đ¾Đ»Đ¾ÑÑ€ÑƒÑƒĐ»Đ°Ñ…","title":"Đ—Đ°Đ½Đ³ÑƒÑƒĐ³Đ¸Đ¹Đ½ ÑˆĐ¸Đ½Đ¶ Ñ‡Đ°Đ½Đ°Ñ€","name":"Đ—Đ°Đ½Đ³ÑƒÑƒĐ³Đ¸Đ¹Đ½ Đ½ÑÑ€","errorName":"Đ—Đ°Đ½Đ³ÑƒÑƒĐ³Đ¸Đ¹Đ½ Đ½ÑÑ€Đ¸Đ¹Đ³ Đ¾Ñ€ÑƒÑƒĐ»Đ½Đ° уу","remove":"Đ—Đ°Đ½Đ³ÑƒÑƒĐ³ уÑÑ‚Đ³Đ°Ñ…"},"anchorId":"Đ­Đ»ĐµĐ¼ÑĐ½Ñ‚Đ¹Đ½ Id Đ½ÑÑ€ÑÑÑ€","anchorName":"Đ—Đ°Đ½Đ³ÑƒÑƒĐ³Đ¸Đ¹Đ½ Đ½ÑÑ€ÑÑÑ€","charset":"Đ¢ÑĐ¼Đ´ÑĐ³Ñ‚ Đ¾Đ½Đ¾Đ¾Ñ… Đ½Ó©Ó©Ñ†Ó©Đ´ Ñ…Đ¾Đ»Đ±Đ¾Đ³Đ´ÑĐ¾Đ½","cssClasses":"Stylesheet ĐºĐ»Đ°ÑÑÑƒÑƒĐ´","emailAddress":"Đ­-ÑˆÑƒÑƒĐ´Đ°Đ½Đ³Đ¸Đ¹Đ½ Ñ…Đ°ÑĐ³","emailBody":"Đ—ÑƒÑ€Đ²Đ°ÑĐ½Ñ‹ Đ¸Ñ… бие","emailSubject":"Đ—ÑƒÑ€Đ²Đ°ÑĐ½Ñ‹ Đ³Đ°Ñ€Ñ‡Đ¸Đ³","id":"Id","info":"Đ¥Đ¾Đ»Đ±Đ¾Đ¾ÑÑ‹Đ½ Ñ‚ÑƒÑ…Đ°Đ¹ Đ¼ÑĐ´ÑÑĐ»ÑĐ»","langCode":"Đ¥ÑĐ»Đ½Đ¸Đ¹ ĐºĐ¾Đ´","langDir":"Đ¥ÑĐ»Đ½Đ¸Đ¹ Ñ‡Đ¸Đ³Đ»ÑĐ»","langDirLTR":"Đ—̉¯̉¯Đ½ÑÑÑ Đ±Đ°Ñ€ÑƒÑƒĐ½ (LTR)","langDirRTL":"Đ‘Đ°Ñ€ÑƒÑƒĐ½Đ°Đ°Ñ Đ·̉¯̉¯Đ½ (RTL)","menu":"Đ¥Đ¾Đ»Đ±Đ¾Đ¾Ñ Đ·Đ°ÑĐ²Đ°Ñ€Đ»Đ°Ñ…","name":"ĐÑÑ€","noAnchors":"(Đ‘Đ°Ñ€Đ¸Đ¼Ñ‚ Đ±Đ¸Ñ‡Đ¸Đ³ Đ·Đ°Đ½Đ³ÑƒÑƒĐ³̉¯Đ¹ Đ±Đ°Đ¹Đ½Đ°)","noEmail":"Đ­-ÑˆÑƒÑƒĐ´Đ°Đ½Đ³Đ¸Đ¹ Ñ…Đ°ÑĐ³Đ°Đ° ÑˆĐ¸Đ²Đ½Ñ ̉¯̉¯","noUrl":"Đ¥Đ¾Đ»Đ±Đ¾Đ¾ÑĐ½Ñ‹ URL Ñ…Đ°ÑĐ³Đ¸Đ¹Đ³ ÑˆĐ¸Đ²Đ½Ñ ̉¯̉¯","other":"<other>","popupDependent":"Đ¥Đ°Đ¼Đ°Đ°Ñ‚Đ°Đ¹ (Netscape)","popupFeatures":"Popup Ñ†Đ¾Đ½Ñ…Đ½Ñ‹ Đ¾Đ½Ñ†Đ»Đ¾Đ³","popupFullScreen":"Đ¦Đ¾Đ½Ñ… Đ´̉¯̉¯Ñ€Đ³ÑÑ… (Internet Explorer)","popupLeft":"Đ—̉¯̉¯Đ½ Đ±Đ°Đ¹Ñ€Đ»Đ°Đ»","popupLocationBar":"Location Ñ…ÑÑÑĐ³","popupMenuBar":"ЦÑÑĐ½Đ¸Đ¹ ÑĐ°Đ¼Đ±Đ°Ñ€","popupResizable":"Resizable","popupScrollBars":"Đ¡ĐºÑ€Đ¾Đ» Ñ…ÑÑÑĐ³̉¯̉¯Đ´","popupStatusBar":"Đ¡Ñ‚Đ°Ñ‚ÑƒÑ Ñ…ÑÑÑĐ³","popupToolbar":"Đ‘Đ°Đ³Đ°Đ¶Đ½Ñ‹ ÑĐ°Đ¼Đ±Đ°Ñ€","popupTop":"Đ”ÑÑĐ´ Đ±Đ°Đ¹Ñ€Đ»Đ°Đ»","rel":"Relationship","selectAnchor":"ĐÑĐ³ Đ·Đ°Đ½Đ³ÑƒÑƒĐ³ ÑĐ¾Đ½Đ³Đ¾Đ½Đ¾ уу","styles":"Đ—Đ°Đ³Đ²Đ°Ñ€","tabIndex":"Tab Đ¸Đ½Đ´ĐµĐºÑ","target":"Đ‘Đ°Đ¹Ñ€Đ»Đ°Đ»","targetFrame":"<ĐĐ³ÑƒÑƒĐ»Đ°Ñ… Ñ…̉¯Ñ€ÑÑ>","targetFrameName":"ĐÑ‡Đ¸Ñ… Ñ„Ñ€ĐµĐ¼Ñ‹Đ½ Đ½ÑÑ€","targetPopup":"<popup Ñ†Đ¾Đ½Ñ…>","targetPopupName":"Popup Ñ†Đ¾Đ½Ñ…Đ½Ñ‹ Đ½ÑÑ€","title":"Đ¥Đ¾Đ»Đ±Đ¾Đ¾Ñ","toAnchor":"Đ­Đ½Ñ Đ±Đ¸Ñ‡Đ²ÑÑ€ Đ´ÑÑ… Đ·Đ°Đ½Đ³ÑƒÑƒ руу Đ¾Ñ‡Đ¸Ñ… Ñ…Đ¾Đ»Đ±Đ¾Đ¾Ñ","toEmail":"Đ­-Đ·Đ°Ñ…Đ¸Đ°","toUrl":"Ñ†Đ°Ñ…Đ¸Đ¼ Ñ…ÑƒÑƒĐ´Đ°ÑĐ½Ñ‹ Ñ…Đ°ÑĐ³ (URL)","toolbar":"Đ¥Đ¾Đ»Đ±Đ¾Đ¾Ñ","type":"Đ›Đ¸Đ½ĐºĐ¸Đ¹Đ½ Ñ‚Ó©Ñ€Ó©Đ»","unlink":"Đ¥Đ¾Đ»Đ±Đ¾Đ¾Ñ Đ°Đ²Ñ‡ Ñ…Đ°ÑÑ…","upload":"Đ¥ÑƒÑƒĐ»Đ°Ñ…"},"list":{"bulletedlist":"ЦÑĐ³Ñ‚ÑĐ¹ Đ¶Đ°Đ³ÑĐ°Đ°Đ»Ñ‚","numberedlist":"Đ”ÑƒĐ³Đ°Đ°Ñ€Đ»Đ°Đ³Đ´ÑĐ°Đ½ Đ¶Đ°Đ³ÑĐ°Đ°Đ»Ñ‚"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Đ”ÑĐ»Đ³Ñц Đ´̉¯̉¯Ñ€Đ³ÑÑ…","minimize":"Đ¦Đ¾Đ½Ñ…Ñ‹Đ³ Đ±Đ°Đ³ÑĐ³Đ°Đ¶ Ñ…Đ°Ñ€ÑƒÑƒĐ»Đ°Ñ…"},"pastetext":{"button":"Đ­Đ½Đ³Đ¸Đ¹Đ½ Đ±Đ¸Ñ‡Đ²ÑÑ€ÑÑÑ€ Đ±ÑƒÑƒĐ»Đ³Đ°Ñ…","title":"Đ­Đ½Đ³Đ¸Đ¹Đ½ Đ±Đ¸Ñ‡Đ²ÑÑ€ÑÑÑ€ Đ±ÑƒÑƒĐ»Đ³Đ°Ñ…"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Word-Đ¾Đ¾Ñ Đ±ÑƒÑƒĐ»Đ³Đ°Ñ…","toolbar":"Word-Đ¾Đ¾Ñ Đ±ÑƒÑƒĐ»Đ³Đ°Ñ…"},"removeformat":{"toolbar":"ĐŸĐ°Ñ€Đ°Ñ€Đ³Đ°Ñ„Ñ‹Đ½ Đ·Đ°Đ³Đ²Đ°Ñ€Ñ‹Đ³ Đ°Đ²Ñ‡ Ñ…Đ°ÑÑ…"},"sourcearea":{"toolbar":"ĐĐ¾Đ´"},"specialchar":{"options":"Special Character Options","title":"ĐĐ½Ñ†Đ³Đ¾Đ¹ Ñ‚ÑĐ¼Đ´ÑĐ³Ñ‚ ÑĐ¾Đ½Đ³Đ¾Ñ…","toolbar":"ĐĐ½Ñ†Đ³Đ¾Đ¹ Ñ‚ÑĐ¼Đ´ÑĐ³Ñ‚ Đ¾Ñ€ÑƒÑƒĐ»Đ°Ñ…"},"scayt":{"btn_about":"About SCAYT","btn_dictionaries":"Đ¢Đ¾Đ»ÑŒ Đ±Đ¸Ñ‡Đ³̉¯̉¯Đ´","btn_disable":"Disable SCAYT","btn_enable":"Enable SCAYT","btn_langs":"Đ¥ÑĐ»̉¯̉¯Đ´","btn_options":"Đ¡Đ¾Đ½Đ³Đ¾Đ»Ñ‚","text_title":"Spell Check As You Type"},"stylescombo":{"label":"Đ—Đ°Đ³Đ²Đ°Ñ€","panelTitle":"Đ—Đ°Đ³Đ²Đ°Ñ€ Ñ…ÑлбÑÑ€Đ¶̉¯̉¯Đ»ÑÑ…","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"Đ¥̉¯Ñ€ÑÑĐ½Đ¸Đ¹ Ñ…ÑĐ¼Đ¶ÑÑ","caption":"Đ¢Đ°Đ¹Đ»Đ±Đ°Ñ€","cell":{"menu":"Đ̉¯Ñ…/Đ·Đ°Đ¹","insertBefore":"Đ̉¯Ñ…/Đ·Đ°Đ¹ Ó©Đ¼Đ½Ó© Đ½ÑŒ Đ¾Ñ€ÑƒÑƒĐ»Đ°Ñ…","insertAfter":"Đ̉¯Ñ…/Đ·Đ°Đ¹ Đ´Đ°Ñ€Đ°Đ° Đ½ÑŒ Đ¾Ñ€ÑƒÑƒĐ»Đ°Ñ…","deleteCell":"Đ̉¯Ñ… уÑÑ‚Đ³Đ°Ñ…","merge":"Đ̉¯Ñ… Đ½ÑĐ³Ñ‚ÑÑ…","mergeRight":"Đ‘Đ°Ñ€ÑƒÑƒĐ½ Ñ‚Đ¸Đ¹Ñˆ Đ½ÑĐ³Ñ‚Đ³ÑÑ…","mergeDown":"Đ”Đ¾Đ¾Ñˆ Đ½ÑĐ³Ñ‚Đ³ÑÑ…","splitHorizontal":"Đ̉¯Ñ…/Đ·Đ°Đ¹Đ³ Đ±Đ¾ÑĐ¾Đ¾Đ³Đ¾Đ¾Ñ€ Đ½ÑŒ туÑĐ³Đ°Đ°Ñ€Đ»Đ°Ñ…","splitVertical":"Đ̉¯Ñ…/Đ·Đ°Đ¹Đ³ Ñ…Ó©Đ½Đ´Đ»Ó©Đ½Đ³Ó©Ó©Ñ€ Đ½ÑŒ туÑĐ³Đ°Đ°Ñ€Đ»Đ°Ñ…","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Đ¥ÑĐ²Ñ‚ÑÑĐ´ Ñ‚ÑĐ³ÑˆĐ»ÑÑ… Đ°Ñ€Đ³Đ°","vAlign":"Đ‘Đ¾ÑĐ¾Đ¾Đ´ Ñ‚ÑĐ³ÑˆĐ»ÑÑ… Đ°Ñ€Đ³Đ°","alignBaseline":"Baseline","bgColor":"Đ”ÑĐ²ÑĐ³ÑÑ€ Ó©Đ½Đ³Ó©","borderColor":"Đ¥̉¯Ñ€ÑÑĐ½Đ¸Đ¹ Ó©Đ½Đ³Ó©","data":"Data","header":"Header","yes":"Đ¢Đ¸Đ¹Đ¼","no":"̉®Đ³̉¯Đ¹","invalidWidth":"Đ̉¯Đ´Đ½Đ¸Đ¹ Ó©Ñ€Đ³Ó©Đ½ Đ½ÑŒ Ñ‚Đ¾Đ¾ Đ±Đ°Đ¹Ñ… Ñ‘ÑÑ‚Đ¾Đ¹.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Đ¡Đ¾Đ½Đ³Đ¾Ñ…"},"cellPad":"Đ̉¯Ñ… Đ´Đ¾Ñ‚Đ¾Ñ€Đ»Đ¾Ñ…(padding)","cellSpace":"Đ̉¯Ñ… Ñ…Đ¾Đ¾Ñ€Đ¾Đ½Đ´Ñ‹Đ½ Đ·Đ°Đ¹ (spacing)","column":{"menu":"Đ‘Đ°Đ³Đ°Đ½Đ°","insertBefore":"Đ‘Đ°Đ³Đ°Đ½Đ° Ó©Đ¼Đ½Ó© Đ½ÑŒ Đ¾Ñ€ÑƒÑƒĐ»Đ°Ñ…","insertAfter":"Đ‘Đ°Đ³Đ°Đ½Đ° Đ´Đ°Ñ€Đ°Đ° Đ½ÑŒ Đ¾Ñ€ÑƒÑƒĐ»Đ°Ñ…","deleteColumn":"Đ‘Đ°Đ³Đ°Đ½Đ° уÑÑ‚Đ³Đ°Ñ…"},"columns":"Đ‘Đ°Đ³Đ°Đ½Đ°","deleteTable":"Đ¥̉¯ÑĐ½ÑĐ³Ñ‚ уÑÑ‚Đ³Đ°Ñ…","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":"Đ¥̉¯ÑĐ½ÑĐ³Ñ‚Đ¸Đ¹Đ½ Ó©Ñ€Đ³Ó©Đ½ Đ½ÑŒ Ñ‚Đ¾Đ¾ Đ±Đ°Đ¹Ñ… Ñ‘ÑÑ‚Đ¾Đ¹.","menu":"Đ¥̉¯ÑĐ½ÑĐ³Ñ‚","row":{"menu":"ĐœÓ©Ñ€","insertBefore":"ĐœÓ©Ñ€ Ó©Đ¼Đ½Ó© Đ½ÑŒ Đ¾Ñ€ÑƒÑƒĐ»Đ°Ñ…","insertAfter":"ĐœÓ©Ñ€ Đ´Đ°Ñ€Đ°Đ° Đ½ÑŒ Đ¾Ñ€ÑƒÑƒĐ»Đ°Ñ…","deleteRow":"ĐœÓ©Ñ€ уÑÑ‚Đ³Đ°Ñ…"},"rows":"ĐœÓ©Ñ€","summary":"Đ¢Đ°Đ¹Đ»Đ±Đ°Ñ€","title":"Đ¥̉¯ÑĐ½ÑĐ³Ñ‚","toolbar":"Đ¥̉¯ÑĐ½ÑĐ³Ñ‚","widthPc":"Ñ…ÑƒĐ²ÑŒ","widthPx":"цÑĐ³","widthUnit":"Ó©Ñ€Đ³Ó©Đ½Đ¸Đ¹ Đ½ÑĐ³Đ¶"},"undo":{"redo":"Ó¨Đ¼Đ½Ó©Ñ… ̉¯Đ¹Đ»Đ´Đ»ÑÑ ÑÑÑ€Đ³ÑÑÑ…","undo":"Đ¥̉¯Ñ‡Đ¸Đ½Đ³̉¯Đ¹ Đ±Đ¾Đ»Đ³Đ¾Ñ…"},"wsc":{"btnIgnore":"Đ—Ó©Đ²ÑˆÓ©Ó©Ñ€Ó©Ñ…","btnIgnoreAll":"Đ‘̉¯Đ³Đ´Đ¸Đ¹Đ³ Đ·Ó©Đ²ÑˆÓ©Ó©Ñ€Ó©Ñ…","btnReplace":"Đ¡Đ¾Đ»Đ¸Ñ…","btnReplaceAll":"Đ‘̉¯Đ³Đ´Đ¸Đ¹Đ³ Đ”Đ°Ñ€Đ¶ Đ±Đ¸Ñ‡Đ¸Ñ…","btnUndo":"Đ‘ÑƒÑ†Đ°Đ°Ñ…","changeTo":"Ó¨Ó©Ñ€Ñ‡Đ»Ó©Ñ…","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Đ”̉¯Ñ€ÑĐ¼ ÑˆĐ°Đ»Đ³Đ°Đ³Ñ‡ ÑÑƒÑƒĐ³Đ°Đ°Đ³̉¯Đ¹ Đ±Đ°Đ¹Đ½Đ°. Đ¢Đ°Ñ‚Đ°Đ¶ Đ°Đ²Đ°Ñ…Ñ‹Đ³ Ñ…̉¯Ñч Đ±Đ°Đ¹Đ½Đ° уу?","manyChanges":"Đ”̉¯Ñ€ÑĐ¼ ÑˆĐ°Đ»Đ³Đ°Đ°Đ´ Đ´ÑƒÑƒÑÑĐ°Đ½: %1 ̉¯Đ³ Ó©Ó©Ñ€Ñ‡Đ»Ó©Đ³Đ´ÑÓ©Đ½","noChanges":"Đ”̉¯Ñ€ÑĐ¼ ÑˆĐ°Đ»Đ³Đ°Đ°Đ´ Đ´ÑƒÑƒÑÑĐ°Đ½: ̉¯Đ³ Ó©Ó©Ñ€Ñ‡Đ»Ó©Đ³Đ´Ó©Ó©Đ³̉¯Đ¹","noMispell":"Đ”̉¯Ñ€ÑĐ¼ ÑˆĐ°Đ»Đ³Đ°Đ°Đ´ Đ´ÑƒÑƒÑÑĐ°Đ½: Đлдаа Đ¾Đ»Đ´ÑĐ¾Đ½Đ³̉¯Đ¹","noSuggestions":"- Đ¢Đ°Đ¹Đ»Đ±Đ°Ñ€Đ³̉¯Đ¹ -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Đ¢Đ¾Đ»ÑŒ Đ±Đ¸Ñ‡Đ¸Đ³Đ³̉¯Đ¹","oneChange":"Đ”̉¯Ñ€ÑĐ¼ ÑˆĐ°Đ»Đ³Đ°Đ°Đ´ Đ´ÑƒÑƒÑÑĐ°Đ½: 1 ̉¯Đ³ Ó©Ó©Ñ€Ñ‡Đ»Ó©Đ³Đ´ÑÓ©Đ½","progress":"Đ”̉¯Ñ€ÑĐ¼ ÑˆĐ°Đ»Đ³Đ°Đ¶ Đ±Đ°Đ¹Đ³Đ°Đ° ̉¯Đ¹Đ» ÑĐ²Ñ†...","title":"Spell Checker","toolbar":"̉®Đ³Đ¸Đ¹Đ½ Đ´̉¯Ñ€ÑÑ… ÑˆĐ°Đ»Đ³Đ°Ñ…"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/ms.js b/js/ckeditor/lang/ms.js
new file mode 100644
index 0000000..e5e083f
--- /dev/null
+++ b/js/ckeditor/lang/ms.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['ms']={"editor":"Rich Text Editor","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Press ALT 0 for help","browseServer":"Browse Server","url":"URL","protocol":"Protokol","upload":"Muat Naik","uploadSubmit":"Hantar ke Server","image":"Gambar","flash":"Flash","form":"Borang","checkbox":"Checkbox","radio":"Butang Radio","textField":"Text Field","textarea":"Textarea","hiddenField":"Field Tersembunyi","button":"Butang","select":"Field Pilihan","imageButton":"Butang Bergambar","notSet":"<tidak di set>","id":"Id","name":"Nama","langDir":"Arah Tulisan","langDirLtr":"Kiri ke Kanan (LTR)","langDirRtl":"Kanan ke Kiri (RTL)","langCode":"Kod Bahasa","longDescr":"Butiran Panjang URL","cssClass":"Kelas-kelas Stylesheet","advisoryTitle":"Tajuk Makluman","cssStyle":"Stail","ok":"OK","cancel":"Batal","close":"Tutup","preview":"Prebiu","resize":"Resize","generalTab":"Umum","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":"Sasaran","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"Kiri ke Kanan (LTR)","langDirRTL":"Kanan ke Kiri (RTL)","styles":"Stail","cssClasses":"Kelas-kelas Stylesheet","width":"Lebar","height":"Tinggi","align":"Jajaran","alignLeft":"Kiri","alignRight":"Kanan","alignCenter":"Tengah","alignJustify":"Jajaran Blok","alignTop":"Atas","alignMiddle":"Pertengahan","alignBottom":"Bawah","alignNone":"None","invalidValue":"Nilai tidak sah.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","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>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Bold","italic":"Italic","strike":"Strike Through","subscript":"Subscript","superscript":"Superscript","underline":"Underline"},"blockquote":{"toolbar":"Block Quote"},"clipboard":{"copy":"Salin","copyError":"Keselamatan perisian browser anda tidak membenarkan operasi salinan text/imej. Sila gunakan papan kekunci (Ctrl/Cmd+C).","cut":"Potong","cutError":"Keselamatan perisian browser anda tidak membenarkan operasi suntingan text/imej. Sila gunakan papan kekunci (Ctrl/Cmd+X).","paste":"Tampal","pasteArea":"Paste Area","pasteMsg":"Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK","securityMsg":"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.","title":"Tampal"},"contextmenu":{"options":"Context Menu Options"},"button":{"selectedLabel":"%1 (Selected)"},"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"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"format":{"label":"Format","panelTitle":"Format","tag_address":"Alamat","tag_div":"Perenggan (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":"Telah Diformat"},"horizontalrule":{"toolbar":"Masukkan Garisan Membujur"},"image":{"alertUrl":"Sila taip URL untuk fail gambar","alt":"Text Alternatif","border":"Border","btnUpload":"Hantar ke Server","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"Ruang Melintang","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"Info Imej","linkTab":"Sambungan","lockRatio":"Tetapkan Nisbah","menu":"Ciri-ciri Imej","resetSize":"Saiz Set Semula","title":"Ciri-ciri Imej","titleButton":"Ciri-ciri Butang Bergambar","upload":"Muat Naik","urlMissing":"Image source URL is missing.","vSpace":"Ruang Menegak","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"indent":{"indent":"Tambahkan Inden","outdent":"Kurangkan Inden"},"fakeobjects":{"anchor":"Anchor","flash":"Flash Animation","hiddenfield":"Hidden Field","iframe":"IFrame","unknown":"Unknown Object"},"link":{"acccessKey":"Kunci Akses","advanced":"Advanced","advisoryContentType":"Jenis Kandungan Makluman","advisoryTitle":"Tajuk Makluman","anchor":{"toolbar":"Masukkan/Sunting Pautan","menu":"Ciri-ciri Pautan","title":"Ciri-ciri Pautan","name":"Nama Pautan","errorName":"Sila taip nama pautan","remove":"Remove Anchor"},"anchorId":"dengan menggunakan ID elemen","anchorName":"dengan menggunakan nama pautan","charset":"Linked Resource Charset","cssClasses":"Kelas-kelas Stylesheet","emailAddress":"Alamat E-Mail","emailBody":"Isi Kandungan Mesej","emailSubject":"Subjek Mesej","id":"Id","info":"Butiran Sambungan","langCode":"Arah Tulisan","langDir":"Arah Tulisan","langDirLTR":"Kiri ke Kanan (LTR)","langDirRTL":"Kanan ke Kiri (RTL)","menu":"Sunting Sambungan","name":"Nama","noAnchors":"(Tiada pautan terdapat dalam dokumen ini)","noEmail":"Sila taip alamat e-mail","noUrl":"Sila taip sambungan URL","other":"<lain>","popupDependent":"Bergantungan (Netscape)","popupFeatures":"Ciri Tetingkap Popup","popupFullScreen":"Skrin Penuh (IE)","popupLeft":"Posisi Kiri","popupLocationBar":"Bar Lokasi","popupMenuBar":"Bar Menu","popupResizable":"Resizable","popupScrollBars":"Bar-bar skrol","popupStatusBar":"Bar Status","popupToolbar":"Toolbar","popupTop":"Posisi Atas","rel":"Relationship","selectAnchor":"Sila pilih pautan","styles":"Stail","tabIndex":"Indeks Tab ","target":"Sasaran","targetFrame":"<bingkai>","targetFrameName":"Nama Bingkai Sasaran","targetPopup":"<tetingkap popup>","targetPopupName":"Nama Tetingkap Popup","title":"Sambungan","toAnchor":"Pautan dalam muka surat ini","toEmail":"E-Mail","toUrl":"URL","toolbar":"Masukkan/Sunting Sambungan","type":"Jenis Sambungan","unlink":"Buang Sambungan","upload":"Muat Naik"},"list":{"bulletedlist":"Senarai tidak bernombor","numberedlist":"Senarai bernombor"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximize","minimize":"Minimize"},"pastetext":{"button":"Tampal sebagai text biasa","title":"Tampal sebagai text biasa"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Tampal dari Word","toolbar":"Tampal dari Word"},"removeformat":{"toolbar":"Buang Format"},"sourcearea":{"toolbar":"Sumber"},"specialchar":{"options":"Special Character Options","title":"Sila pilih huruf istimewa","toolbar":"Masukkan Huruf Istimewa"},"scayt":{"btn_about":"About SCAYT","btn_dictionaries":"Dictionaries","btn_disable":"Disable SCAYT","btn_enable":"Enable SCAYT","btn_langs":"Languages","btn_options":"Options","text_title":"Spell Check As You Type"},"stylescombo":{"label":"Stail","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"Saiz Border","caption":"Keterangan","cell":{"menu":"Cell","insertBefore":"Insert Cell Before","insertAfter":"Insert Cell After","deleteCell":"Buangkan Sel-sel","merge":"Cantumkan Sel-sel","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":"Tambahan Ruang Sel","cellSpace":"Ruangan Antara Sel","column":{"menu":"Column","insertBefore":"Insert Column Before","insertAfter":"Insert Column After","deleteColumn":"Buangkan Lajur"},"columns":"Jaluran","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":"Ciri-ciri Jadual","row":{"menu":"Row","insertBefore":"Insert Row Before","insertAfter":"Insert Row After","deleteRow":"Buangkan Baris"},"rows":"Barisan","summary":"Summary","title":"Ciri-ciri Jadual","toolbar":"Jadual","widthPc":"peratus","widthPx":"piksel-piksel","widthUnit":"width unit"},"undo":{"redo":"Ulangkan","undo":"Batalkan"},"wsc":{"btnIgnore":"Biar","btnIgnoreAll":"Biarkan semua","btnReplace":"Ganti","btnReplaceAll":"Gantikan Semua","btnUndo":"Batalkan","changeTo":"Tukarkan kepada","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Pemeriksa ejaan tidak dipasang. Adakah anda mahu muat turun sekarang?","manyChanges":"Pemeriksaan ejaan siap: %1 perkataan diubah","noChanges":"Pemeriksaan ejaan siap: Tiada perkataan diubah","noMispell":"Pemeriksaan ejaan siap: Tiada salah ejaan","noSuggestions":"- Tiada cadangan -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Tidak terdapat didalam kamus","oneChange":"Pemeriksaan ejaan siap: Satu perkataan telah diubah","progress":"Pemeriksaan ejaan sedang diproses...","title":"Spell Checker","toolbar":"Semak Ejaan"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/nb.js b/js/ckeditor/lang/nb.js
new file mode 100644
index 0000000..778e06e
--- /dev/null
+++ b/js/ckeditor/lang/nb.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['nb']={"editor":"Rikteksteditor","editorPanel":"Panel for rikteksteditor","common":{"editorHelp":"Trykk ALT 0 for hjelp","browseServer":"Bla gjennom tjener","url":"URL","protocol":"Protokoll","upload":"Last opp","uploadSubmit":"Send det til serveren","image":"Bilde","flash":"Flash","form":"Skjema","checkbox":"Avmerkingsboks","radio":"Alternativknapp","textField":"Tekstboks","textarea":"TekstomrĂ¥de","hiddenField":"Skjult felt","button":"Knapp","select":"Rullegardinliste","imageButton":"Bildeknapp","notSet":"<ikke satt>","id":"Id","name":"Navn","langDir":"SprĂ¥kretning","langDirLtr":"Venstre til høyre (VTH)","langDirRtl":"Høyre til venstre (HTV)","langCode":"SprĂ¥kkode","longDescr":"Utvidet beskrivelse","cssClass":"Stilarkklasser","advisoryTitle":"Tittel","cssStyle":"Stil","ok":"OK","cancel":"Avbryt","close":"Lukk","preview":"ForhĂ¥ndsvis","resize":"Dra for Ă¥ skalere","generalTab":"Generelt","advancedTab":"Avansert","validateNumberFailed":"Denne verdien er ikke et tall.","confirmNewPage":"Alle ulagrede endringer som er gjort i dette innholdet vil gĂ¥ tapt. Er du sikker pĂ¥ at du vil laste en ny side?","confirmCancel":"Du har endret noen alternativer. Er du sikker pĂ¥ at du vil lukke dialogvinduet?","options":"Valg","target":"MĂ¥l","targetNew":"Nytt vindu (_blank)","targetTop":"Hele vindu (_top)","targetSelf":"Samme vindu (_self)","targetParent":"Foreldrevindu (_parent)","langDirLTR":"Venstre til høyre (VTH)","langDirRTL":"Høyre til venstre (HTV)","styles":"Stil","cssClasses":"Stilarkklasser","width":"Bredde","height":"Høyde","align":"Juster","alignLeft":"Venstre","alignRight":"Høyre","alignCenter":"Midtjuster","alignJustify":"Blokkjuster","alignTop":"Topp","alignMiddle":"Midten","alignBottom":"Bunn","alignNone":"Ingen","invalidValue":"Ugyldig verdi.","invalidHeight":"Høyde mĂ¥ være et tall.","invalidWidth":"Bredde mĂ¥ være et tall.","invalidCssLength":"Den angitte verdien for feltet \"%1\" mĂ¥ være et positivt tall med eller uten en gyldig CSS-mĂ¥lingsenhet (px, %, in, cm, mm, em, ex, pt, eller pc).","invalidHtmlLength":"Den angitte verdien for feltet \"%1\" mĂ¥ være et positivt tall med eller uten en gyldig HTML-mĂ¥lingsenhet (px eller %).","invalidInlineStyle":"Verdi angitt for inline stil mĂ¥ bestĂ¥ av en eller flere sett med formatet \"navn : verdi\", separert med semikolon","cssLengthTooltip":"Skriv inn et tall for en piksel-verdi eller et tall med en gyldig CSS-enhet (px, %, in, cm, mm, em, ex, pt, eller pc).","unavailable":"%1<span class=\"cke_accessibility\">, utilgjenglig</span>"},"about":{"copy":"Copyright &copy; $1. Alle rettigheter reservert.","dlgTitle":"Om CKEditor","help":"Se $1 for hjelp.","moreInfo":"For lisensieringsinformasjon, vennligst besøk vĂ¥rt nettsted:","title":"Om CKEditor","userGuide":"CKEditors brukerveiledning"},"basicstyles":{"bold":"Fet","italic":"Kursiv","strike":"Gjennomstreking","subscript":"Senket skrift","superscript":"Hevet skrift","underline":"Understreking"},"blockquote":{"toolbar":"Blokksitat"},"clipboard":{"copy":"Kopier","copyError":"Din nettlesers sikkerhetsinstillinger tillater ikke automatisk kopiering av tekst. Vennligst bruk tastatursnarveien (Ctrl/Cmd+C).","cut":"Klipp ut","cutError":"Din nettlesers sikkerhetsinstillinger tillater ikke automatisk utklipping av tekst. Vennligst bruk tastatursnarveien (Ctrl/Cmd+X).","paste":"Lim inn","pasteArea":"InnlimingsomrĂ¥de","pasteMsg":"Vennligst lim inn i følgende boks med tastaturet (<strong>Ctrl/Cmd+V</strong>) og trykk <strong>OK</strong>.","securityMsg":"Din nettlesers sikkerhetsinstillinger gir ikke redigeringsverktøyet direkte tilgang til utklippstavlen. Du mĂ¥ derfor lime det inn pĂ¥ nytt i dette vinduet.","title":"Lim inn"},"contextmenu":{"options":"Alternativer for høyreklikkmeny"},"button":{"selectedLabel":"%1 (Valgt)"},"toolbar":{"toolbarCollapse":"Skjul verktøylinje","toolbarExpand":"Vis verktøylinje","toolbarGroups":{"document":"Dokument","clipboard":"Utklippstavle/Angre","editing":"Redigering","forms":"Skjema","basicstyles":"Basisstiler","paragraph":"Avsnitt","links":"Lenker","insert":"Innsetting","styles":"Stiler","colors":"Farger","tools":"Verktøy"},"toolbars":"Verktøylinjer for editor"},"elementspath":{"eleLabel":"Element-sti","eleTitle":"%1 element"},"format":{"label":"Format","panelTitle":"Avsnittsformat","tag_address":"Adresse","tag_div":"Normal (DIV)","tag_h1":"Overskrift 1","tag_h2":"Overskrift 2","tag_h3":"Overskrift 3","tag_h4":"Overskrift 4","tag_h5":"Overskrift 5","tag_h6":"Overskrift 6","tag_p":"Normal","tag_pre":"Formatert"},"horizontalrule":{"toolbar":"Sett inn horisontal linje"},"image":{"alertUrl":"Vennligst skriv bilde-urlen","alt":"Alternativ tekst","border":"Ramme","btnUpload":"Send det til serveren","button2Img":"Vil du endre den valgte bildeknappen til et vanlig bilde?","hSpace":"HMarg","img2Button":"Vil du endre det valgte bildet til en bildeknapp?","infoTab":"Bildeinformasjon","linkTab":"Lenke","lockRatio":"LĂ¥s forhold","menu":"Bildeegenskaper","resetSize":"Tilbakestill størrelse","title":"Bildeegenskaper","titleButton":"Egenskaper for bildeknapp","upload":"Last opp","urlMissing":"Bildets adresse mangler.","vSpace":"VMarg","validateBorder":"Ramme mĂ¥ være et heltall.","validateHSpace":"HMarg mĂ¥ være et heltall.","validateVSpace":"VMarg mĂ¥ være et heltall."},"indent":{"indent":"Ă˜k innrykk","outdent":"Reduser innrykk"},"fakeobjects":{"anchor":"Anker","flash":"Flash-animasjon","hiddenfield":"Skjult felt","iframe":"IFrame","unknown":"Ukjent objekt"},"link":{"acccessKey":"Aksessknapp","advanced":"Avansert","advisoryContentType":"Type","advisoryTitle":"Tittel","anchor":{"toolbar":"Sett inn/Rediger anker","menu":"Egenskaper for anker","title":"Egenskaper for anker","name":"Ankernavn","errorName":"Vennligst skriv inn ankernavnet","remove":"Fjern anker"},"anchorId":"Element etter ID","anchorName":"Anker etter navn","charset":"Lenket tegnsett","cssClasses":"Stilarkklasser","emailAddress":"E-postadresse","emailBody":"Melding","emailSubject":"Meldingsemne","id":"Id","info":"Lenkeinfo","langCode":"SprĂ¥kkode","langDir":"SprĂ¥kretning","langDirLTR":"Venstre til høyre (VTH)","langDirRTL":"Høyre til venstre (HTV)","menu":"Rediger lenke","name":"Navn","noAnchors":"(Ingen anker i dokumentet)","noEmail":"Vennligst skriv inn e-postadressen","noUrl":"Vennligst skriv inn lenkens URL","other":"<annen>","popupDependent":"Avhenging (Netscape)","popupFeatures":"Egenskaper for popup-vindu","popupFullScreen":"Fullskjerm (IE)","popupLeft":"Venstre posisjon","popupLocationBar":"Adresselinje","popupMenuBar":"Menylinje","popupResizable":"Skalerbar","popupScrollBars":"Scrollbar","popupStatusBar":"Statuslinje","popupToolbar":"Verktøylinje","popupTop":"Topp-posisjon","rel":"Relasjon (rel)","selectAnchor":"Velg et anker","styles":"Stil","tabIndex":"Tabindeks","target":"MĂ¥l","targetFrame":"<ramme>","targetFrameName":"MĂ¥lramme","targetPopup":"<popup-vindu>","targetPopupName":"Navn pĂ¥ popup-vindu","title":"Lenke","toAnchor":"Lenke til anker i teksten","toEmail":"E-post","toUrl":"URL","toolbar":"Sett inn/Rediger lenke","type":"Lenketype","unlink":"Fjern lenke","upload":"Last opp"},"list":{"bulletedlist":"Legg til/Fjern punktmerket liste","numberedlist":"Legg til/Fjern nummerert liste"},"magicline":{"title":"Sett inn nytt avsnitt her"},"maximize":{"maximize":"Maksimer","minimize":"Minimer"},"pastetext":{"button":"Lim inn som ren tekst","title":"Lim inn som ren tekst"},"pastefromword":{"confirmCleanup":"Teksten du limer inn ser ut til Ă¥ være kopiert fra Word. Vil du renske den før du limer den inn?","error":"Det var ikke mulig Ă¥ renske den innlimte teksten pĂ¥ grunn av en intern feil","title":"Lim inn fra Word","toolbar":"Lim inn fra Word"},"removeformat":{"toolbar":"Fjern formatering"},"sourcearea":{"toolbar":"Kilde"},"specialchar":{"options":"Alternativer for spesialtegn","title":"Velg spesialtegn","toolbar":"Sett inn spesialtegn"},"scayt":{"btn_about":"Om SCAYT","btn_dictionaries":"Ordbøker","btn_disable":"SlĂ¥ av SCAYT","btn_enable":"SlĂ¥ pĂ¥ SCAYT","btn_langs":"SprĂ¥k","btn_options":"Valg","text_title":"Stavekontroll mens du skriver"},"stylescombo":{"label":"Stil","panelTitle":"Stilformater","panelTitle1":"Blokkstiler","panelTitle2":"Inlinestiler","panelTitle3":"Objektstiler"},"table":{"border":"Rammestørrelse","caption":"Tittel","cell":{"menu":"Celle","insertBefore":"Sett inn celle før","insertAfter":"Sett inn celle etter","deleteCell":"Slett celler","merge":"SlĂ¥ sammen celler","mergeRight":"SlĂ¥ sammen høyre","mergeDown":"SlĂ¥ sammen ned","splitHorizontal":"Del celle horisontalt","splitVertical":"Del celle vertikalt","title":"Celleegenskaper","cellType":"Celletype","rowSpan":"Radspenn","colSpan":"Kolonnespenn","wordWrap":"Tekstbrytning","hAlign":"Horisontal justering","vAlign":"Vertikal justering","alignBaseline":"Grunnlinje","bgColor":"Bakgrunnsfarge","borderColor":"Rammefarge","data":"Data","header":"Overskrift","yes":"Ja","no":"Nei","invalidWidth":"Cellebredde mĂ¥ være et tall.","invalidHeight":"Cellehøyde mĂ¥ være et tall.","invalidRowSpan":"Radspenn mĂ¥ være et heltall.","invalidColSpan":"Kolonnespenn mĂ¥ være et heltall.","chooseColor":"Velg"},"cellPad":"Cellepolstring","cellSpace":"Cellemarg","column":{"menu":"Kolonne","insertBefore":"Sett inn kolonne før","insertAfter":"Sett inn kolonne etter","deleteColumn":"Slett kolonner"},"columns":"Kolonner","deleteTable":"Slett tabell","headers":"Overskrifter","headersBoth":"Begge","headersColumn":"Første kolonne","headersNone":"Ingen","headersRow":"Første rad","invalidBorder":"Rammestørrelse mĂ¥ være et tall.","invalidCellPadding":"Cellepolstring mĂ¥ være et positivt tall.","invalidCellSpacing":"Cellemarg mĂ¥ være et positivt tall.","invalidCols":"Antall kolonner mĂ¥ være et tall større enn 0.","invalidHeight":"Tabellhøyde mĂ¥ være et tall.","invalidRows":"Antall rader mĂ¥ være et tall større enn 0.","invalidWidth":"Tabellbredde mĂ¥ være et tall.","menu":"Egenskaper for tabell","row":{"menu":"Rader","insertBefore":"Sett inn rad før","insertAfter":"Sett inn rad etter","deleteRow":"Slett rader"},"rows":"Rader","summary":"Sammendrag","title":"Egenskaper for tabell","toolbar":"Tabell","widthPc":"prosent","widthPx":"piksler","widthUnit":"Bredde-enhet"},"undo":{"redo":"Gjør om","undo":"Angre"},"wsc":{"btnIgnore":"Ignorer","btnIgnoreAll":"Ignorer alle","btnReplace":"Erstatt","btnReplaceAll":"Erstatt alle","btnUndo":"Angre","changeTo":"Endre til","errorLoading":"Feil under lasting av applikasjonstjenestetjener: %s.","ieSpellDownload":"Stavekontroll er ikke installert. Vil du laste den ned nĂ¥?","manyChanges":"Stavekontroll fullført: %1 ord endret","noChanges":"Stavekontroll fullført: ingen ord endret","noMispell":"Stavekontroll fullført: ingen feilstavinger funnet","noSuggestions":"- Ingen forslag -","notAvailable":"Beklager, tjenesten er utilgjenglig nĂ¥.","notInDic":"Ikke i ordboken","oneChange":"Stavekontroll fullført: Ett ord endret","progress":"Stavekontroll pĂ¥gĂ¥r...","title":"Stavekontroll","toolbar":"Stavekontroll"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/nl.js b/js/ckeditor/lang/nl.js
new file mode 100644
index 0000000..f991c9f
--- /dev/null
+++ b/js/ckeditor/lang/nl.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['nl']={"editor":"Tekstverwerker","editorPanel":"Tekstverwerker beheerpaneel","common":{"editorHelp":"Druk ALT 0 voor hulp","browseServer":"Bladeren op server","url":"URL","protocol":"Protocol","upload":"Upload","uploadSubmit":"Naar server verzenden","image":"Afbeelding","flash":"Flash","form":"Formulier","checkbox":"Selectievinkje","radio":"Keuzerondje","textField":"Tekstveld","textarea":"Tekstvak","hiddenField":"Verborgen veld","button":"Knop","select":"Selectieveld","imageButton":"Afbeeldingsknop","notSet":"<niet ingevuld>","id":"Id","name":"Naam","langDir":"Schrijfrichting","langDirLtr":"Links naar rechts (LTR)","langDirRtl":"Rechts naar links (RTL)","langCode":"Taalcode","longDescr":"Lange URL-omschrijving","cssClass":"Stylesheet-klassen","advisoryTitle":"Adviserende titel","cssStyle":"Stijl","ok":"OK","cancel":"Annuleren","close":"Sluiten","preview":"Voorbeeld","resize":"Sleep om te herschalen","generalTab":"Algemeen","advancedTab":"Geavanceerd","validateNumberFailed":"Deze waarde is geen geldig getal.","confirmNewPage":"Alle aangebrachte wijzigingen gaan verloren. Weet u zeker dat u een nieuwe pagina wilt openen?","confirmCancel":"Enkele opties zijn gewijzigd. Weet u zeker dat u dit dialoogvenster wilt sluiten?","options":"Opties","target":"Doelvenster","targetNew":"Nieuw venster (_blank)","targetTop":"Hele venster (_top)","targetSelf":"Zelfde venster (_self)","targetParent":"Origineel venster (_parent)","langDirLTR":"Links naar rechts (LTR)","langDirRTL":"Rechts naar links (RTL)","styles":"Stijl","cssClasses":"Stylesheet-klassen","width":"Breedte","height":"Hoogte","align":"Uitlijning","alignLeft":"Links","alignRight":"Rechts","alignCenter":"Centreren","alignJustify":"Uitvullen","alignTop":"Boven","alignMiddle":"Midden","alignBottom":"Onder","alignNone":"Geen","invalidValue":"Ongeldige waarde.","invalidHeight":"De hoogte moet een getal zijn.","invalidWidth":"De breedte moet een getal zijn.","invalidCssLength":"Waarde in veld \"%1\" moet een positief nummer zijn, met of zonder een geldige CSS meeteenheid (px, %, in, cm, mm, em, ex, pt of pc).","invalidHtmlLength":"Waarde in veld \"%1\" moet een positief nummer zijn, met of zonder een geldige HTML meeteenheid (px of %).","invalidInlineStyle":"Waarde voor de online stijl moet bestaan uit een of meerdere tupels met het formaat \"naam : waarde\", gescheiden door puntkomma's.","cssLengthTooltip":"Geef een nummer in voor een waarde in pixels of geef een nummer in met een geldige CSS eenheid (px, %, in, cm, mm, em, ex, pt, of pc).","unavailable":"%1<span class=\"cke_accessibility\">, niet beschikbaar</span>"},"about":{"copy":"Copyright &copy; $1. Alle rechten voorbehouden.","dlgTitle":"Over CKEditor","help":"Bekijk de $1 voor hulp.","moreInfo":"Bezoek onze website voor licentieinformatie:","title":"Over CKEditor","userGuide":"CKEditor gebruiksaanwijzing"},"basicstyles":{"bold":"Vet","italic":"Cursief","strike":"Doorhalen","subscript":"Subscript","superscript":"Superscript","underline":"Onderstrepen"},"blockquote":{"toolbar":"Citaatblok"},"clipboard":{"copy":"KopiĂ«ren","copyError":"De beveiligingsinstelling van de browser verhinderen het automatisch kopiĂ«ren. Gebruik de sneltoets Ctrl/Cmd+C van het toetsenbord.","cut":"Knippen","cutError":"De beveiligingsinstelling van de browser verhinderen het automatisch knippen. Gebruik de sneltoets Ctrl/Cmd+X van het toetsenbord.","paste":"Plakken","pasteArea":"Plakgebied","pasteMsg":"Plak de tekst in het volgende vak gebruikmakend van uw toetsenbord (<strong>Ctrl/Cmd+V</strong>) en klik op OK.","securityMsg":"Door de beveiligingsinstellingen van uw browser is het niet mogelijk om direct vanuit het klembord in de editor te plakken. Middels opnieuw plakken in dit venster kunt u de tekst alsnog plakken in de editor.","title":"Plakken"},"contextmenu":{"options":"Contextmenu opties"},"button":{"selectedLabel":"%1 (Geselecteerd)"},"toolbar":{"toolbarCollapse":"Werkbalk inklappen","toolbarExpand":"Werkbalk uitklappen","toolbarGroups":{"document":"Document","clipboard":"Klembord/Ongedaan maken","editing":"Bewerken","forms":"Formulieren","basicstyles":"Basisstijlen","paragraph":"Paragraaf","links":"Links","insert":"Invoegen","styles":"Stijlen","colors":"Kleuren","tools":"Toepassingen"},"toolbars":"Werkbalken"},"elementspath":{"eleLabel":"Elementenpad","eleTitle":"%1 element"},"format":{"label":"Opmaak","panelTitle":"Opmaak","tag_address":"Adres","tag_div":"Normaal (DIV)","tag_h1":"Kop 1","tag_h2":"Kop 2","tag_h3":"Kop 3","tag_h4":"Kop 4","tag_h5":"Kop 5","tag_h6":"Kop 6","tag_p":"Normaal","tag_pre":"Met opmaak"},"horizontalrule":{"toolbar":"Horizontale lijn invoegen"},"image":{"alertUrl":"Geef de URL van de afbeelding","alt":"Alternatieve tekst","border":"Rand","btnUpload":"Naar server verzenden","button2Img":"Wilt u de geselecteerde afbeeldingsknop vervangen door een eenvoudige afbeelding?","hSpace":"HSpace","img2Button":"Wilt u de geselecteerde afbeelding vervangen door een afbeeldingsknop?","infoTab":"Informatie afbeelding","linkTab":"Link","lockRatio":"Afmetingen vergrendelen","menu":"Eigenschappen afbeelding","resetSize":"Afmetingen resetten","title":"Eigenschappen afbeelding","titleButton":"Eigenschappen afbeeldingsknop","upload":"Upload","urlMissing":"De URL naar de afbeelding ontbreekt.","vSpace":"VSpace","validateBorder":"Rand moet een heel nummer zijn.","validateHSpace":"HSpace moet een heel nummer zijn.","validateVSpace":"VSpace moet een heel nummer zijn."},"indent":{"indent":"Inspringing vergroten","outdent":"Inspringing verkleinen"},"fakeobjects":{"anchor":"Interne link","flash":"Flash animatie","hiddenfield":"Verborgen veld","iframe":"IFrame","unknown":"Onbekend object"},"link":{"acccessKey":"Toegangstoets","advanced":"Geavanceerd","advisoryContentType":"Aanbevolen content-type","advisoryTitle":"Adviserende titel","anchor":{"toolbar":"Interne link","menu":"Eigenschappen interne link","title":"Eigenschappen interne link","name":"Naam interne link","errorName":"Geef de naam van de interne link op","remove":"Interne link verwijderen"},"anchorId":"Op kenmerk interne link","anchorName":"Op naam interne link","charset":"Karakterset van gelinkte bron","cssClasses":"Stylesheet-klassen","emailAddress":"E-mailadres","emailBody":"Inhoud bericht","emailSubject":"Onderwerp bericht","id":"Id","info":"Linkomschrijving","langCode":"Taalcode","langDir":"Schrijfrichting","langDirLTR":"Links naar rechts (LTR)","langDirRTL":"Rechts naar links (RTL)","menu":"Link wijzigen","name":"Naam","noAnchors":"(Geen interne links in document gevonden)","noEmail":"Geef een e-mailadres","noUrl":"Geef de link van de URL","other":"<ander>","popupDependent":"Afhankelijk (Netscape)","popupFeatures":"Instellingen popupvenster","popupFullScreen":"Volledig scherm (IE)","popupLeft":"Positie links","popupLocationBar":"Locatiemenu","popupMenuBar":"Menubalk","popupResizable":"Herschaalbaar","popupScrollBars":"Schuifbalken","popupStatusBar":"Statusbalk","popupToolbar":"Werkbalk","popupTop":"Positie boven","rel":"Relatie","selectAnchor":"Kies een interne link","styles":"Stijl","tabIndex":"Tabvolgorde","target":"Doelvenster","targetFrame":"<frame>","targetFrameName":"Naam doelframe","targetPopup":"<popupvenster>","targetPopupName":"Naam popupvenster","title":"Link","toAnchor":"Interne link in pagina","toEmail":"E-mail","toUrl":"URL","toolbar":"Link invoegen/wijzigen","type":"Linktype","unlink":"Link verwijderen","upload":"Upload"},"list":{"bulletedlist":"Opsomming invoegen","numberedlist":"Genummerde lijst invoegen"},"magicline":{"title":"Hier paragraaf invoeren"},"maximize":{"maximize":"Maximaliseren","minimize":"Minimaliseren"},"pastetext":{"button":"Plakken als platte tekst","title":"Plakken als platte tekst"},"pastefromword":{"confirmCleanup":"De tekst die u wilt plakken lijkt gekopieerd te zijn vanuit Word. Wilt u de tekst opschonen voordat deze geplakt wordt?","error":"Het was niet mogelijk om de geplakte tekst op te schonen door een interne fout","title":"Plakken vanuit Word","toolbar":"Plakken vanuit Word"},"removeformat":{"toolbar":"Opmaak verwijderen"},"sourcearea":{"toolbar":"Broncode"},"specialchar":{"options":"Speciale tekens opties","title":"Selecteer speciaal teken","toolbar":"Speciaal teken invoegen"},"scayt":{"btn_about":"Over SCAYT","btn_dictionaries":"Woordenboeken","btn_disable":"SCAYT uitschakelen","btn_enable":"SCAYT inschakelen","btn_langs":"Talen","btn_options":"Opties","text_title":"Controleer de spelling tijdens het typen"},"stylescombo":{"label":"Stijl","panelTitle":"Opmaakstijlen","panelTitle1":"Blok stijlen","panelTitle2":"Inline stijlen","panelTitle3":"Object stijlen"},"table":{"border":"Randdikte","caption":"Onderschrift","cell":{"menu":"Cel","insertBefore":"Voeg cel in voor","insertAfter":"Voeg cel in na","deleteCell":"Cellen verwijderen","merge":"Cellen samenvoegen","mergeRight":"Voeg samen naar rechts","mergeDown":"Voeg samen naar beneden","splitHorizontal":"Splits cel horizontaal","splitVertical":"Splits cel vertikaal","title":"Celeigenschappen","cellType":"Celtype","rowSpan":"Rijen samenvoegen","colSpan":"Kolommen samenvoegen","wordWrap":"Automatische terugloop","hAlign":"Horizontale uitlijning","vAlign":"Verticale uitlijning","alignBaseline":"Tekstregel","bgColor":"Achtergrondkleur","borderColor":"Randkleur","data":"Gegevens","header":"Kop","yes":"Ja","no":"Nee","invalidWidth":"De celbreedte moet een getal zijn.","invalidHeight":"De celhoogte moet een getal zijn.","invalidRowSpan":"Rijen samenvoegen moet een heel getal zijn.","invalidColSpan":"Kolommen samenvoegen moet een heel getal zijn.","chooseColor":"Kies"},"cellPad":"Celopvulling","cellSpace":"Celafstand","column":{"menu":"Kolom","insertBefore":"Voeg kolom in voor","insertAfter":"Voeg kolom in na","deleteColumn":"Kolommen verwijderen"},"columns":"Kolommen","deleteTable":"Tabel verwijderen","headers":"Koppen","headersBoth":"Beide","headersColumn":"Eerste kolom","headersNone":"Geen","headersRow":"Eerste rij","invalidBorder":"De randdikte moet een getal zijn.","invalidCellPadding":"Celopvulling moet een getal zijn.","invalidCellSpacing":"Celafstand moet een getal zijn.","invalidCols":"Het aantal kolommen moet een getal zijn groter dan 0.","invalidHeight":"De tabelhoogte moet een getal zijn.","invalidRows":"Het aantal rijen moet een getal zijn groter dan 0.","invalidWidth":"De tabelbreedte moet een getal zijn.","menu":"Tabeleigenschappen","row":{"menu":"Rij","insertBefore":"Voeg rij in voor","insertAfter":"Voeg rij in na","deleteRow":"Rijen verwijderen"},"rows":"Rijen","summary":"Samenvatting","title":"Tabeleigenschappen","toolbar":"Tabel","widthPc":"procent","widthPx":"pixels","widthUnit":"eenheid breedte"},"undo":{"redo":"Opnieuw uitvoeren","undo":"Ongedaan maken"},"wsc":{"btnIgnore":"Negeren","btnIgnoreAll":"Alles negeren","btnReplace":"Vervangen","btnReplaceAll":"Alles vervangen","btnUndo":"Ongedaan maken","changeTo":"Wijzig in","errorLoading":"Er is een fout opgetreden bij het laden van de dienst: %s.","ieSpellDownload":"De spellingscontrole is niet geĂ¯nstalleerd. Wilt u deze nu downloaden?","manyChanges":"Klaar met spellingscontrole: %1 woorden aangepast","noChanges":"Klaar met spellingscontrole: geen woorden aangepast","noMispell":"Klaar met spellingscontrole: geen fouten gevonden","noSuggestions":"- Geen suggesties -","notAvailable":"Excuses, deze dienst is momenteel niet beschikbaar.","notInDic":"Niet in het woordenboek","oneChange":"Klaar met spellingscontrole: Ă©Ă©n woord aangepast","progress":"Bezig met spellingscontrole...","title":"Spellingscontrole","toolbar":"Spellingscontrole"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/no.js b/js/ckeditor/lang/no.js
new file mode 100644
index 0000000..3bbb660
--- /dev/null
+++ b/js/ckeditor/lang/no.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['no']={"editor":"Rikteksteditor","editorPanel":"Panel for rikteksteditor","common":{"editorHelp":"Trykk ALT 0 for hjelp","browseServer":"Bla igjennom server","url":"URL","protocol":"Protokoll","upload":"Last opp","uploadSubmit":"Send det til serveren","image":"Bilde","flash":"Flash","form":"Skjema","checkbox":"Avmerkingsboks","radio":"Alternativknapp","textField":"Tekstboks","textarea":"TekstomrĂ¥de","hiddenField":"Skjult felt","button":"Knapp","select":"Rullegardinliste","imageButton":"Bildeknapp","notSet":"<ikke satt>","id":"Id","name":"Navn","langDir":"SprĂ¥kretning","langDirLtr":"Venstre til høyre (VTH)","langDirRtl":"Høyre til venstre (HTV)","langCode":"SprĂ¥kkode","longDescr":"Utvidet beskrivelse","cssClass":"Stilarkklasser","advisoryTitle":"Tittel","cssStyle":"Stil","ok":"OK","cancel":"Avbryt","close":"Lukk","preview":"ForhĂ¥ndsvis","resize":"Dra for Ă¥ skalere","generalTab":"Generelt","advancedTab":"Avansert","validateNumberFailed":"Denne verdien er ikke et tall.","confirmNewPage":"Alle ulagrede endringer som er gjort i dette innholdet vil bli tapt. Er du sikker pĂ¥ at du vil laste en ny side?","confirmCancel":"Noen av valgene har blitt endret. Er du sikker pĂ¥ at du vil lukke dialogen?","options":"Valg","target":"MĂ¥l","targetNew":"Nytt vindu (_blank)","targetTop":"Hele vindu (_top)","targetSelf":"Samme vindu (_self)","targetParent":"Foreldrevindu (_parent)","langDirLTR":"Venstre til høyre (VTH)","langDirRTL":"Høyre til venstre (HTV)","styles":"Stil","cssClasses":"Stilarkklasser","width":"Bredde","height":"Høyde","align":"Juster","alignLeft":"Venstre","alignRight":"Høyre","alignCenter":"Midtjuster","alignJustify":"Blokkjuster","alignTop":"Topp","alignMiddle":"Midten","alignBottom":"Bunn","alignNone":"Ingen","invalidValue":"Ugyldig verdi.","invalidHeight":"Høyde mĂ¥ være et tall.","invalidWidth":"Bredde mĂ¥ være et tall.","invalidCssLength":"Den angitte verdien for feltet \"%1\" mĂ¥ være et positivt tall med eller uten en gyldig CSS-mĂ¥lingsenhet (px, %, in, cm, mm, em, ex, pt, eller pc).","invalidHtmlLength":"Den angitte verdien for feltet \"%1\" mĂ¥ være et positivt tall med eller uten en gyldig HTML-mĂ¥lingsenhet (px eller %).","invalidInlineStyle":"Verdi angitt for inline stil mĂ¥ bestĂ¥ av en eller flere sett med formatet \"navn : verdi\", separert med semikolon","cssLengthTooltip":"Skriv inn et tall for en piksel-verdi eller et tall med en gyldig CSS-enhet (px, %, in, cm, mm, em, ex, pt, eller pc).","unavailable":"%1<span class=\"cke_accessibility\">, utilgjenglig</span>"},"about":{"copy":"Copyright &copy; $1. Alle rettigheter reservert.","dlgTitle":"Om CKEditor","help":"Se $1 for hjelp.","moreInfo":"For lisensieringsinformasjon, vennligst besøk vĂ¥rt nettsted:","title":"Om CKEditor","userGuide":"CKEditors brukerveiledning"},"basicstyles":{"bold":"Fet","italic":"Kursiv","strike":"Gjennomstreking","subscript":"Senket skrift","superscript":"Hevet skrift","underline":"Understreking"},"blockquote":{"toolbar":"Blokksitat"},"clipboard":{"copy":"Kopier","copyError":"Din nettlesers sikkerhetsinstillinger tillater ikke automatisk kopiering av tekst. Vennligst bruk snarveien (Ctrl/Cmd+C).","cut":"Klipp ut","cutError":"Din nettlesers sikkerhetsinstillinger tillater ikke automatisk utklipping av tekst. Vennligst bruk snarveien (Ctrl/Cmd+X).","paste":"Lim inn","pasteArea":"InnlimingsomrĂ¥de","pasteMsg":"Vennligst lim inn i følgende boks med tastaturet (<STRONG>Ctrl/Cmd+V</STRONG>) og trykk <STRONG>OK</STRONG>.","securityMsg":"Din nettlesers sikkerhetsinstillinger gir ikke redigeringsverktøyet direkte tilgang til utklippstavlen. Du mĂ¥ derfor lime det inn pĂ¥ nytt i dette vinduet.","title":"Lim inn"},"contextmenu":{"options":"Alternativer for høyreklikkmeny"},"button":{"selectedLabel":"%1 (Selected)"},"toolbar":{"toolbarCollapse":"Skjul verktøylinje","toolbarExpand":"Vis verktøylinje","toolbarGroups":{"document":"Dokument","clipboard":"Utklippstavle/Angre","editing":"Redigering","forms":"Skjema","basicstyles":"Basisstiler","paragraph":"Avsnitt","links":"Lenker","insert":"Innsetting","styles":"Stiler","colors":"Farger","tools":"Verktøy"},"toolbars":"Verktøylinjer for editor"},"elementspath":{"eleLabel":"Element-sti","eleTitle":"%1 element"},"format":{"label":"Format","panelTitle":"Avsnittsformat","tag_address":"Adresse","tag_div":"Normal (DIV)","tag_h1":"Overskrift 1","tag_h2":"Overskrift 2","tag_h3":"Overskrift 3","tag_h4":"Overskrift 4","tag_h5":"Overskrift 5","tag_h6":"Overskrift 6","tag_p":"Normal","tag_pre":"Formatert"},"horizontalrule":{"toolbar":"Sett inn horisontal linje"},"image":{"alertUrl":"Vennligst skriv bilde-urlen","alt":"Alternativ tekst","border":"Ramme","btnUpload":"Send det til serveren","button2Img":"Vil du endre den valgte bildeknappen til et vanlig bilde?","hSpace":"HMarg","img2Button":"Vil du endre det valgte bildet til en bildeknapp?","infoTab":"Bildeinformasjon","linkTab":"Lenke","lockRatio":"LĂ¥s forhold","menu":"Bildeegenskaper","resetSize":"Tilbakestill størrelse","title":"Bildeegenskaper","titleButton":"Egenskaper for bildeknapp","upload":"Last opp","urlMissing":"Bildets adresse mangler.","vSpace":"VMarg","validateBorder":"Ramme mĂ¥ være et heltall.","validateHSpace":"HMarg mĂ¥ være et heltall.","validateVSpace":"VMarg mĂ¥ være et heltall."},"indent":{"indent":"Ă˜k innrykk","outdent":"Reduser innrykk"},"fakeobjects":{"anchor":"Anker","flash":"Flash-animasjon","hiddenfield":"Skjult felt","iframe":"IFrame","unknown":"Ukjent objekt"},"link":{"acccessKey":"Aksessknapp","advanced":"Avansert","advisoryContentType":"Type","advisoryTitle":"Tittel","anchor":{"toolbar":"Sett inn/Rediger anker","menu":"Egenskaper for anker","title":"Egenskaper for anker","name":"Ankernavn","errorName":"Vennligst skriv inn ankernavnet","remove":"Fjern anker"},"anchorId":"Element etter ID","anchorName":"Anker etter navn","charset":"Lenket tegnsett","cssClasses":"Stilarkklasser","emailAddress":"E-postadresse","emailBody":"Melding","emailSubject":"Meldingsemne","id":"Id","info":"Lenkeinfo","langCode":"SprĂ¥kkode","langDir":"SprĂ¥kretning","langDirLTR":"Venstre til høyre (VTH)","langDirRTL":"Høyre til venstre (HTV)","menu":"Rediger lenke","name":"Navn","noAnchors":"(Ingen anker i dokumentet)","noEmail":"Vennligst skriv inn e-postadressen","noUrl":"Vennligst skriv inn lenkens URL","other":"<annen>","popupDependent":"Avhenging (Netscape)","popupFeatures":"Egenskaper for popup-vindu","popupFullScreen":"Fullskjerm (IE)","popupLeft":"Venstre posisjon","popupLocationBar":"Adresselinje","popupMenuBar":"Menylinje","popupResizable":"Skalerbar","popupScrollBars":"Scrollbar","popupStatusBar":"Statuslinje","popupToolbar":"Verktøylinje","popupTop":"Topp-posisjon","rel":"Relasjon (rel)","selectAnchor":"Velg et anker","styles":"Stil","tabIndex":"Tabindeks","target":"MĂ¥l","targetFrame":"<ramme>","targetFrameName":"MĂ¥lramme","targetPopup":"<popup-vindu>","targetPopupName":"Navn pĂ¥ popup-vindu","title":"Lenke","toAnchor":"Lenke til anker i teksten","toEmail":"E-post","toUrl":"URL","toolbar":"Sett inn/Rediger lenke","type":"Lenketype","unlink":"Fjern lenke","upload":"Last opp"},"list":{"bulletedlist":"Legg til/Fjern punktmerket liste","numberedlist":"Legg til/Fjern nummerert liste"},"magicline":{"title":"Sett inn nytt avsnitt her"},"maximize":{"maximize":"Maksimer","minimize":"Minimer"},"pastetext":{"button":"Lim inn som ren tekst","title":"Lim inn som ren tekst"},"pastefromword":{"confirmCleanup":"Teksten du limer inn ser ut til Ă¥ være kopiert fra Word. Vil du renske den før du limer den inn?","error":"Det var ikke mulig Ă¥ renske den innlimte teksten pĂ¥ grunn av en intern feil","title":"Lim inn fra Word","toolbar":"Lim inn fra Word"},"removeformat":{"toolbar":"Fjern formatering"},"sourcearea":{"toolbar":"Kilde"},"specialchar":{"options":"Alternativer for spesialtegn","title":"Velg spesialtegn","toolbar":"Sett inn spesialtegn"},"scayt":{"btn_about":"Om SCAYT","btn_dictionaries":"Ordbøker","btn_disable":"SlĂ¥ av SCAYT","btn_enable":"SlĂ¥ pĂ¥ SCAYT","btn_langs":"SprĂ¥k","btn_options":"Valg","text_title":"Stavekontroll mens du skriver"},"stylescombo":{"label":"Stil","panelTitle":"Stilformater","panelTitle1":"Blokkstiler","panelTitle2":"Inlinestiler","panelTitle3":"Objektstiler"},"table":{"border":"Rammestørrelse","caption":"Tittel","cell":{"menu":"Celle","insertBefore":"Sett inn celle før","insertAfter":"Sett inn celle etter","deleteCell":"Slett celler","merge":"SlĂ¥ sammen celler","mergeRight":"SlĂ¥ sammen høyre","mergeDown":"SlĂ¥ sammen ned","splitHorizontal":"Del celle horisontalt","splitVertical":"Del celle vertikalt","title":"Celleegenskaper","cellType":"Celletype","rowSpan":"Radspenn","colSpan":"Kolonnespenn","wordWrap":"Tekstbrytning","hAlign":"Horisontal justering","vAlign":"Vertikal justering","alignBaseline":"Grunnlinje","bgColor":"Bakgrunnsfarge","borderColor":"Rammefarge","data":"Data","header":"Overskrift","yes":"Ja","no":"Nei","invalidWidth":"Cellebredde mĂ¥ være et tall.","invalidHeight":"Cellehøyde mĂ¥ være et tall.","invalidRowSpan":"Radspenn mĂ¥ være et heltall.","invalidColSpan":"Kolonnespenn mĂ¥ være et heltall.","chooseColor":"Velg"},"cellPad":"Cellepolstring","cellSpace":"Cellemarg","column":{"menu":"Kolonne","insertBefore":"Sett inn kolonne før","insertAfter":"Sett inn kolonne etter","deleteColumn":"Slett kolonner"},"columns":"Kolonner","deleteTable":"Slett tabell","headers":"Overskrifter","headersBoth":"Begge","headersColumn":"Første kolonne","headersNone":"Ingen","headersRow":"Første rad","invalidBorder":"Rammestørrelse mĂ¥ være et tall.","invalidCellPadding":"Cellepolstring mĂ¥ være et positivt tall.","invalidCellSpacing":"Cellemarg mĂ¥ være et positivt tall.","invalidCols":"Antall kolonner mĂ¥ være et tall større enn 0.","invalidHeight":"Tabellhøyde mĂ¥ være et tall.","invalidRows":"Antall rader mĂ¥ være et tall større enn 0.","invalidWidth":"Tabellbredde mĂ¥ være et tall.","menu":"Egenskaper for tabell","row":{"menu":"Rader","insertBefore":"Sett inn rad før","insertAfter":"Sett inn rad etter","deleteRow":"Slett rader"},"rows":"Rader","summary":"Sammendrag","title":"Egenskaper for tabell","toolbar":"Tabell","widthPc":"prosent","widthPx":"piksler","widthUnit":"Bredde-enhet"},"undo":{"redo":"Gjør om","undo":"Angre"},"wsc":{"btnIgnore":"Ignorer","btnIgnoreAll":"Ignorer alle","btnReplace":"Erstatt","btnReplaceAll":"Erstatt alle","btnUndo":"Angre","changeTo":"Endre til","errorLoading":"Feil under lasting av applikasjonstjenestetjener: %s.","ieSpellDownload":"Stavekontroll er ikke installert. Vil du laste den ned nĂ¥?","manyChanges":"Stavekontroll fullført: %1 ord endret","noChanges":"Stavekontroll fullført: ingen ord endret","noMispell":"Stavekontroll fullført: ingen feilstavinger funnet","noSuggestions":"- Ingen forslag -","notAvailable":"Beklager, tjenesten er utilgjenglig nĂ¥.","notInDic":"Ikke i ordboken","oneChange":"Stavekontroll fullført: Ett ord endret","progress":"Stavekontroll pĂ¥gĂ¥r...","title":"Stavekontroll","toolbar":"Stavekontroll"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/pl.js b/js/ckeditor/lang/pl.js
new file mode 100644
index 0000000..1276d6a
--- /dev/null
+++ b/js/ckeditor/lang/pl.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['pl']={"editor":"Edytor tekstu sformatowanego","editorPanel":"Panel edytora tekstu sformatowanego","common":{"editorHelp":"W celu uzyskania pomocy naciÅ›nij ALT 0","browseServer":"PrzeglÄ…daj","url":"Adres URL","protocol":"ProtokĂ³Å‚","upload":"WyÅ›lij","uploadSubmit":"WyÅ›lij","image":"Obrazek","flash":"Flash","form":"Formularz","checkbox":"Pole wyboru (checkbox)","radio":"Przycisk opcji (radio)","textField":"Pole tekstowe","textarea":"Obszar tekstowy","hiddenField":"Pole ukryte","button":"Przycisk","select":"Lista wyboru","imageButton":"Przycisk graficzny","notSet":"<nie ustawiono>","id":"Id","name":"Nazwa","langDir":"Kierunek tekstu","langDirLtr":"Od lewej do prawej (LTR)","langDirRtl":"Od prawej do lewej (RTL)","langCode":"Kod jÄ™zyka","longDescr":"Adres URL dÅ‚ugiego opisu","cssClass":"Nazwa klasy CSS","advisoryTitle":"Opis obiektu docelowego","cssStyle":"Styl","ok":"OK","cancel":"Anuluj","close":"Zamknij","preview":"PodglÄ…d","resize":"PrzeciÄ…gnij, aby zmienić rozmiar","generalTab":"OgĂ³lne","advancedTab":"Zaawansowane","validateNumberFailed":"Ta wartość nie jest liczbÄ….","confirmNewPage":"Wszystkie niezapisane zmiany zostanÄ… utracone. Czy na pewno wczytać nowÄ… stronÄ™?","confirmCancel":"Pewne opcje zostaÅ‚y zmienione. Czy na pewno zamknąć okno dialogowe?","options":"Opcje","target":"Obiekt docelowy","targetNew":"Nowe okno (_blank)","targetTop":"Okno najwyżej w hierarchii (_top)","targetSelf":"To samo okno (_self)","targetParent":"Okno nadrzÄ™dne (_parent)","langDirLTR":"Od lewej do prawej (LTR)","langDirRTL":"Od prawej do lewej (RTL)","styles":"Style","cssClasses":"Klasy arkusza stylĂ³w","width":"Szerokość","height":"Wysokość","align":"WyrĂ³wnaj","alignLeft":"Do lewej","alignRight":"Do prawej","alignCenter":"Do Å›rodka","alignJustify":"Wyjustuj","alignTop":"Do gĂ³ry","alignMiddle":"Do Å›rodka","alignBottom":"Do doÅ‚u","alignNone":"Brak","invalidValue":"NieprawidÅ‚owa wartość.","invalidHeight":"Wysokość musi być liczbÄ….","invalidWidth":"Szerokość musi być liczbÄ….","invalidCssLength":"Wartość podana dla pola \"%1\" musi być liczbÄ… dodatniÄ… bez jednostki lub z poprawnÄ… jednostkÄ… dÅ‚ugoÅ›ci zgodnÄ… z CSS (px, %, in, cm, mm, em, ex, pt lub pc).","invalidHtmlLength":"Wartość podana dla pola \"%1\" musi być liczbÄ… dodatniÄ… bez jednostki lub z poprawnÄ… jednostkÄ… dÅ‚ugoÅ›ci zgodnÄ… z HTML (px lub %).","invalidInlineStyle":"Wartość podana dla stylu musi skÅ‚adać siÄ™ z jednej lub wiÄ™kszej liczby krotek w formacie \"nazwa : wartość\", rozdzielonych Å›rednikami.","cssLengthTooltip":"Wpisz liczbÄ™ dla wartoÅ›ci w pikselach lub liczbÄ™ wraz z jednostkÄ… dÅ‚ugoÅ›ci zgodnÄ… z CSS (px, %, in, cm, mm, em, ex, pt lub pc).","unavailable":"%1<span class=\"cke_accessibility\">, niedostÄ™pne</span>"},"about":{"copy":"Copyright &copy; $1. Wszelkie prawa zastrzeżone.","dlgTitle":"Informacje o programie CKEditor","help":"Pomoc znajdziesz w $1.","moreInfo":"Informacje na temat licencji można znaleźć na naszej stronie:","title":"Informacje o programie CKEditor","userGuide":"podrÄ™czniku użytkownika programu CKEditor"},"basicstyles":{"bold":"Pogrubienie","italic":"Kursywa","strike":"PrzekreÅ›lenie","subscript":"Indeks dolny","superscript":"Indeks gĂ³rny","underline":"PodkreÅ›lenie"},"blockquote":{"toolbar":"Cytat"},"clipboard":{"copy":"Kopiuj","copyError":"Ustawienia bezpieczeÅ„stwa Twojej przeglÄ…darki nie pozwalajÄ… na automatyczne kopiowanie tekstu. Użyj skrĂ³tu klawiszowego Ctrl/Cmd+C.","cut":"Wytnij","cutError":"Ustawienia bezpieczeÅ„stwa Twojej przeglÄ…darki nie pozwalajÄ… na automatyczne wycinanie tekstu. Użyj skrĂ³tu klawiszowego Ctrl/Cmd+X.","paste":"Wklej","pasteArea":"Obszar wklejania","pasteMsg":"Wklej tekst w poniższym polu, używajÄ…c skrĂ³tu klawiaturowego (<STRONG>Ctrl/Cmd+V</STRONG>), i kliknij <STRONG>OK</STRONG>.","securityMsg":"Zabezpieczenia przeglÄ…darki uniemożliwiajÄ… wklejenie danych bezpoÅ›rednio do edytora. ProszÄ™ ponownie wkleić dane w tym oknie.","title":"Wklej"},"contextmenu":{"options":"Opcje menu kontekstowego"},"button":{"selectedLabel":"%1 (Wybrany)"},"toolbar":{"toolbarCollapse":"ZwiÅ„ pasek narzÄ™dzi","toolbarExpand":"RozwiÅ„ pasek narzÄ™dzi","toolbarGroups":{"document":"Dokument","clipboard":"Schowek/Wstecz","editing":"Edycja","forms":"Formularze","basicstyles":"Style podstawowe","paragraph":"Akapit","links":"HiperÅ‚Ä…cza","insert":"Wstawianie","styles":"Style","colors":"Kolory","tools":"NarzÄ™dzia"},"toolbars":"Paski narzÄ™dzi edytora"},"elementspath":{"eleLabel":"Åcieżka elementĂ³w","eleTitle":"element %1"},"format":{"label":"Format","panelTitle":"Format","tag_address":"Adres","tag_div":"Normalny (DIV)","tag_h1":"NagÅ‚Ă³wek 1","tag_h2":"NagÅ‚Ă³wek 2","tag_h3":"NagÅ‚Ă³wek 3","tag_h4":"NagÅ‚Ă³wek 4","tag_h5":"NagÅ‚Ă³wek 5","tag_h6":"NagÅ‚Ă³wek 6","tag_p":"Normalny","tag_pre":"Tekst sformatowany"},"horizontalrule":{"toolbar":"Wstaw poziomÄ… liniÄ™"},"image":{"alertUrl":"Podaj adres obrazka.","alt":"Tekst zastÄ™pczy","border":"Obramowanie","btnUpload":"WyÅ›lij","button2Img":"Czy chcesz przekonwertować zaznaczony przycisk graficzny do zwykÅ‚ego obrazka?","hSpace":"OdstÄ™p poziomy","img2Button":"Czy chcesz przekonwertować zaznaczony obrazek do przycisku graficznego?","infoTab":"Informacje o obrazku","linkTab":"HiperÅ‚Ä…cze","lockRatio":"Zablokuj proporcje","menu":"WÅ‚aÅ›ciwoÅ›ci obrazka","resetSize":"PrzywrĂ³Ä‡ rozmiar","title":"WÅ‚aÅ›ciwoÅ›ci obrazka","titleButton":"WÅ‚aÅ›ciwoÅ›ci przycisku graficznego","upload":"WyÅ›lij","urlMissing":"Podaj adres URL obrazka.","vSpace":"OdstÄ™p pionowy","validateBorder":"Wartość obramowania musi być liczbÄ… caÅ‚kowitÄ….","validateHSpace":"Wartość odstÄ™pu poziomego musi być liczbÄ… caÅ‚kowitÄ….","validateVSpace":"Wartość odstÄ™pu pionowego musi być liczbÄ… caÅ‚kowitÄ…."},"indent":{"indent":"ZwiÄ™ksz wciÄ™cie","outdent":"Zmniejsz wciÄ™cie"},"fakeobjects":{"anchor":"Kotwica","flash":"Animacja Flash","hiddenfield":"Pole ukryte","iframe":"IFrame","unknown":"Nieznany obiekt"},"link":{"acccessKey":"Klawisz dostÄ™pu","advanced":"Zaawansowane","advisoryContentType":"Typ MIME obiektu docelowego","advisoryTitle":"Opis obiektu docelowego","anchor":{"toolbar":"Wstaw/edytuj kotwicÄ™","menu":"WÅ‚aÅ›ciwoÅ›ci kotwicy","title":"WÅ‚aÅ›ciwoÅ›ci kotwicy","name":"Nazwa kotwicy","errorName":"Wpisz nazwÄ™ kotwicy","remove":"UsuÅ„ kotwicÄ™"},"anchorId":"Wg identyfikatora","anchorName":"Wg nazwy","charset":"Kodowanie znakĂ³w obiektu docelowego","cssClasses":"Nazwa klasy CSS","emailAddress":"Adres e-mail","emailBody":"Treść","emailSubject":"Temat","id":"Id","info":"Informacje ","langCode":"Kod jÄ™zyka","langDir":"Kierunek tekstu","langDirLTR":"Od lewej do prawej (LTR)","langDirRTL":"Od prawej do lewej (RTL)","menu":"Edytuj odnoÅ›nik","name":"Nazwa","noAnchors":"(W dokumencie nie zdefiniowano żadnych kotwic)","noEmail":"Podaj adres e-mail","noUrl":"Podaj adres URL","other":"<inny>","popupDependent":"Okno zależne (Netscape)","popupFeatures":"WÅ‚aÅ›ciwoÅ›ci wyskakujÄ…cego okna","popupFullScreen":"PeÅ‚ny ekran (IE)","popupLeft":"Pozycja w poziomie","popupLocationBar":"Pasek adresu","popupMenuBar":"Pasek menu","popupResizable":"Skalowalny","popupScrollBars":"Paski przewijania","popupStatusBar":"Pasek statusu","popupToolbar":"Pasek narzÄ™dzi","popupTop":"Pozycja w pionie","rel":"Relacja","selectAnchor":"Wybierz kotwicÄ™","styles":"Styl","tabIndex":"Indeks kolejnoÅ›ci","target":"Obiekt docelowy","targetFrame":"<ramka>","targetFrameName":"Nazwa ramki docelowej","targetPopup":"<wyskakujÄ…ce okno>","targetPopupName":"Nazwa wyskakujÄ…cego okna","title":"OdnoÅ›nik","toAnchor":"OdnoÅ›nik wewnÄ…trz strony (kotwica)","toEmail":"Adres e-mail","toUrl":"Adres URL","toolbar":"Wstaw/edytuj odnoÅ›nik","type":"Typ odnoÅ›nika","unlink":"UsuÅ„ odnoÅ›nik","upload":"WyÅ›lij"},"list":{"bulletedlist":"Lista wypunktowana","numberedlist":"Lista numerowana"},"magicline":{"title":"Wstaw nowy akapit"},"maximize":{"maximize":"Maksymalizuj","minimize":"Minimalizuj"},"pastetext":{"button":"Wklej jako czysty tekst","title":"Wklej jako czysty tekst"},"pastefromword":{"confirmCleanup":"Tekst, ktĂ³ry chcesz wkleić, prawdopodobnie pochodzi z programu Microsoft Word. Czy chcesz go wyczyÅ›cić przed wklejeniem?","error":"Wyczyszczenie wklejonych danych nie byÅ‚o możliwe z powodu wystÄ…pienia bÅ‚Ä™du.","title":"Wklej z programu MS Word","toolbar":"Wklej z programu MS Word"},"removeformat":{"toolbar":"UsuÅ„ formatowanie"},"sourcearea":{"toolbar":"ŹrĂ³dÅ‚o dokumentu"},"specialchar":{"options":"Opcje znakĂ³w specjalnych","title":"Wybierz znak specjalny","toolbar":"Wstaw znak specjalny"},"scayt":{"btn_about":"Informacje o SCAYT","btn_dictionaries":"SÅ‚owniki","btn_disable":"WyÅ‚Ä…cz SCAYT","btn_enable":"WÅ‚Ä…cz SCAYT","btn_langs":"JÄ™zyki","btn_options":"Opcje","text_title":"Sprawdź pisowniÄ™ podczas pisania (SCAYT)"},"stylescombo":{"label":"Styl","panelTitle":"Style formatujÄ…ce","panelTitle1":"Style blokowe","panelTitle2":"Style liniowe","panelTitle3":"Style obiektowe"},"table":{"border":"Grubość obramowania","caption":"TytuÅ‚","cell":{"menu":"KomĂ³rka","insertBefore":"Wstaw komĂ³rkÄ™ z lewej","insertAfter":"Wstaw komĂ³rkÄ™ z prawej","deleteCell":"UsuÅ„ komĂ³rki","merge":"PoÅ‚Ä…cz komĂ³rki","mergeRight":"PoÅ‚Ä…cz z komĂ³rkÄ… z prawej","mergeDown":"PoÅ‚Ä…cz z komĂ³rkÄ… poniżej","splitHorizontal":"Podziel komĂ³rkÄ™ poziomo","splitVertical":"Podziel komĂ³rkÄ™ pionowo","title":"WÅ‚aÅ›ciwoÅ›ci komĂ³rki","cellType":"Typ komĂ³rki","rowSpan":"Scalenie wierszy","colSpan":"Scalenie komĂ³rek","wordWrap":"Zawijanie sÅ‚Ă³w","hAlign":"WyrĂ³wnanie poziome","vAlign":"WyrĂ³wnanie pionowe","alignBaseline":"Linia bazowa","bgColor":"Kolor tÅ‚a","borderColor":"Kolor obramowania","data":"Dane","header":"NagÅ‚Ă³wek","yes":"Tak","no":"Nie","invalidWidth":"Szerokość komĂ³rki musi być liczbÄ….","invalidHeight":"Wysokość komĂ³rki musi być liczbÄ….","invalidRowSpan":"Scalenie wierszy musi być liczbÄ… caÅ‚kowitÄ….","invalidColSpan":"Scalenie komĂ³rek musi być liczbÄ… caÅ‚kowitÄ….","chooseColor":"Wybierz"},"cellPad":"DopeÅ‚nienie komĂ³rek","cellSpace":"OdstÄ™p pomiÄ™dzy komĂ³rkami","column":{"menu":"Kolumna","insertBefore":"Wstaw kolumnÄ™ z lewej","insertAfter":"Wstaw kolumnÄ™ z prawej","deleteColumn":"UsuÅ„ kolumny"},"columns":"Liczba kolumn","deleteTable":"UsuÅ„ tabelÄ™","headers":"NagÅ‚Ă³wki","headersBoth":"Oba","headersColumn":"Pierwsza kolumna","headersNone":"Brak","headersRow":"Pierwszy wiersz","invalidBorder":"Wartość obramowania musi być liczbÄ….","invalidCellPadding":"DopeÅ‚nienie komĂ³rek musi być liczbÄ… dodatniÄ….","invalidCellSpacing":"OdstÄ™p pomiÄ™dzy komĂ³rkami musi być liczbÄ… dodatniÄ….","invalidCols":"Liczba kolumn musi być wiÄ™ksza niż 0.","invalidHeight":"Wysokość tabeli musi być liczbÄ….","invalidRows":"Liczba wierszy musi być wiÄ™ksza niż 0.","invalidWidth":"Szerokość tabeli musi być liczbÄ….","menu":"WÅ‚aÅ›ciwoÅ›ci tabeli","row":{"menu":"Wiersz","insertBefore":"Wstaw wiersz powyżej","insertAfter":"Wstaw wiersz poniżej","deleteRow":"UsuÅ„ wiersze"},"rows":"Liczba wierszy","summary":"Podsumowanie","title":"WÅ‚aÅ›ciwoÅ›ci tabeli","toolbar":"Tabela","widthPc":"%","widthPx":"piksele","widthUnit":"jednostka szerokoÅ›ci"},"undo":{"redo":"PonĂ³w","undo":"Cofnij"},"wsc":{"btnIgnore":"Ignoruj","btnIgnoreAll":"Ignoruj wszystkie","btnReplace":"ZmieÅ„","btnReplaceAll":"ZmieÅ„ wszystkie","btnUndo":"Cofnij","changeTo":"ZmieÅ„ na","errorLoading":"BÅ‚Ä…d wczytywania hosta aplikacji usÅ‚ugi: %s.","ieSpellDownload":"SÅ‚ownik nie jest zainstalowany. Czy chcesz go pobrać?","manyChanges":"Sprawdzanie zakoÅ„czone: zmieniono %l sÅ‚Ă³w","noChanges":"Sprawdzanie zakoÅ„czone: nie zmieniono żadnego sÅ‚owa","noMispell":"Sprawdzanie zakoÅ„czone: nie znaleziono bÅ‚Ä™dĂ³w","noSuggestions":"- Brak sugestii -","notAvailable":"Przepraszamy, ale usÅ‚uga jest obecnie niedostÄ™pna.","notInDic":"SÅ‚owa nie ma w sÅ‚owniku","oneChange":"Sprawdzanie zakoÅ„czone: zmieniono jedno sÅ‚owo","progress":"Trwa sprawdzanie...","title":"Sprawdź pisowniÄ™","toolbar":"Sprawdź pisowniÄ™"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/pt-br.js b/js/ckeditor/lang/pt-br.js
new file mode 100644
index 0000000..0683523
--- /dev/null
+++ b/js/ckeditor/lang/pt-br.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['pt-br']={"editor":"Editor de Rich Text","editorPanel":"Painel do editor de Rich Text","common":{"editorHelp":"Pressione ALT+0 para ajuda","browseServer":"Localizar no Servidor","url":"URL","protocol":"Protocolo","upload":"Enviar ao Servidor","uploadSubmit":"Enviar para o Servidor","image":"Imagem","flash":"Flash","form":"FormulĂ¡rio","checkbox":"Caixa de SeleĂ§Ă£o","radio":"BotĂ£o de OpĂ§Ă£o","textField":"Caixa de Texto","textarea":"Ărea de Texto","hiddenField":"Campo Oculto","button":"BotĂ£o","select":"Caixa de Listagem","imageButton":"BotĂ£o de Imagem","notSet":"<nĂ£o ajustado>","id":"Id","name":"Nome","langDir":"DireĂ§Ă£o do idioma","langDirLtr":"Esquerda para Direita (LTR)","langDirRtl":"Direita para Esquerda (RTL)","langCode":"Idioma","longDescr":"DescriĂ§Ă£o da URL","cssClass":"Classe de CSS","advisoryTitle":"TĂ­tulo","cssStyle":"Estilos","ok":"OK","cancel":"Cancelar","close":"Fechar","preview":"Visualizar","resize":"Arraste para redimensionar","generalTab":"Geral","advancedTab":"Avançado","validateNumberFailed":"Este valor nĂ£o Ă© um nĂºmero.","confirmNewPage":"Todas as mudanças nĂ£o salvas serĂ£o perdidas. Tem certeza de que quer abrir uma nova pĂ¡gina?","confirmCancel":"Algumas opções foram alteradas. Tem certeza de que quer fechar a caixa de diĂ¡logo?","options":"Opções","target":"Destino","targetNew":"Nova Janela (_blank)","targetTop":"Janela de Cima (_top)","targetSelf":"Mesma Janela (_self)","targetParent":"Janela Pai (_parent)","langDirLTR":"Esquerda para Direita (LTR)","langDirRTL":"Direita para Esquerda (RTL)","styles":"Estilo","cssClasses":"Classes","width":"Largura","height":"Altura","align":"Alinhamento","alignLeft":"Esquerda","alignRight":"Direita","alignCenter":"Centralizado","alignJustify":"Justificar","alignTop":"Superior","alignMiddle":"Centralizado","alignBottom":"Inferior","alignNone":"Nenhum","invalidValue":"Valor invĂ¡lido.","invalidHeight":"A altura tem que ser um nĂºmero","invalidWidth":"A largura tem que ser um nĂºmero.","invalidCssLength":"O valor do campo \"%1\" deve ser um nĂºmero positivo opcionalmente seguido por uma vĂ¡lida unidade de medida de CSS (px, %, in, cm, mm, em, ex, pt ou pc).","invalidHtmlLength":"O valor do campo \"%1\" deve ser um nĂºmero positivo opcionalmente seguido por uma vĂ¡lida unidade de medida de HTML (px ou %).","invalidInlineStyle":"O valor vĂ¡lido para estilo deve conter uma ou mais tuplas no formato \"nome : valor\", separados por ponto e vĂ­rgula.","cssLengthTooltip":"Insira um nĂºmero para valor em pixels ou um nĂºmero seguido de uma vĂ¡lida unidade de medida de CSS (px, %, in, cm, mm, em, ex, pt ou pc).","unavailable":"%1<span class=\"cke_accessibility\">, indisponĂ­vel</span>"},"about":{"copy":"Copyright &copy; $1. Todos os direitos reservados.","dlgTitle":"Sobre o CKEditor","help":"Verifique o $1 para obter ajuda.","moreInfo":"Para informações sobre a licença por favor visite o nosso site:","title":"Sobre o CKEditor","userGuide":"Guia do UsuĂ¡rio do CKEditor"},"basicstyles":{"bold":"Negrito","italic":"ItĂ¡lico","strike":"Tachado","subscript":"Subscrito","superscript":"Sobrescrito","underline":"Sublinhado"},"blockquote":{"toolbar":"CitaĂ§Ă£o"},"clipboard":{"copy":"Copiar","copyError":"As configurações de segurança do seu navegador nĂ£o permitem que o editor execute operações de copiar automaticamente. Por favor, utilize o teclado para copiar (Ctrl/Cmd+C).","cut":"Recortar","cutError":"As configurações de segurança do seu navegador nĂ£o permitem que o editor execute operações de recortar automaticamente. Por favor, utilize o teclado para recortar (Ctrl/Cmd+X).","paste":"Colar","pasteArea":"Ărea para Colar","pasteMsg":"Transfira o link usado na caixa usando o teclado com (<STRONG>Ctrl/Cmd+V</STRONG>) e <STRONG>OK</STRONG>.","securityMsg":"As configurações de segurança do seu navegador nĂ£o permitem que o editor acesse os dados da Ă¡rea de transferĂªncia diretamente. Por favor cole o conteĂºdo manualmente nesta janela.","title":"Colar"},"contextmenu":{"options":"Opções Menu de Contexto"},"button":{"selectedLabel":"%1 (Selecionado)"},"toolbar":{"toolbarCollapse":"Diminuir Barra de Ferramentas","toolbarExpand":"Aumentar Barra de Ferramentas","toolbarGroups":{"document":"Documento","clipboard":"Clipboard/Desfazer","editing":"EdiĂ§Ă£o","forms":"FormulĂ¡rios","basicstyles":"Estilos BĂ¡sicos","paragraph":"Paragrafo","links":"Links","insert":"Inserir","styles":"Estilos","colors":"Cores","tools":"Ferramentas"},"toolbars":"Barra de Ferramentas do Editor"},"elementspath":{"eleLabel":"Caminho dos Elementos","eleTitle":"Elemento %1"},"format":{"label":"FormataĂ§Ă£o","panelTitle":"FormataĂ§Ă£o","tag_address":"Endereço","tag_div":"Normal (DIV)","tag_h1":"TĂ­tulo 1","tag_h2":"TĂ­tulo 2","tag_h3":"TĂ­tulo 3","tag_h4":"TĂ­tulo 4","tag_h5":"TĂ­tulo 5","tag_h6":"TĂ­tulo 6","tag_p":"Normal","tag_pre":"Formatado"},"horizontalrule":{"toolbar":"Inserir Linha Horizontal"},"image":{"alertUrl":"Por favor, digite a URL da imagem.","alt":"Texto Alternativo","border":"Borda","btnUpload":"Enviar para o Servidor","button2Img":"Deseja transformar o botĂ£o de imagem em uma imagem comum?","hSpace":"HSpace","img2Button":"Deseja transformar a imagem em um botĂ£o de imagem?","infoTab":"Informações da Imagem","linkTab":"Link","lockRatio":"Travar Proporções","menu":"Formatar Imagem","resetSize":"Redefinir para o Tamanho Original","title":"Formatar Imagem","titleButton":"Formatar BotĂ£o de Imagem","upload":"Enviar","urlMissing":"URL da imagem estĂ¡ faltando.","vSpace":"VSpace","validateBorder":"A borda deve ser um nĂºmero inteiro.","validateHSpace":"O HSpace deve ser um nĂºmero inteiro.","validateVSpace":"O VSpace deve ser um nĂºmero inteiro."},"indent":{"indent":"Aumentar Recuo","outdent":"Diminuir Recuo"},"fakeobjects":{"anchor":"Ă‚ncora","flash":"AnimaĂ§Ă£o em Flash","hiddenfield":"Campo Oculto","iframe":"IFrame","unknown":"Objeto desconhecido"},"link":{"acccessKey":"Chave de Acesso","advanced":"Avançado","advisoryContentType":"Tipo de ConteĂºdo","advisoryTitle":"TĂ­tulo","anchor":{"toolbar":"Inserir/Editar Ă‚ncora","menu":"Formatar Ă‚ncora","title":"Formatar Ă‚ncora","name":"Nome da Ă‚ncora","errorName":"Por favor, digite o nome da Ă¢ncora","remove":"Remover Ă‚ncora"},"anchorId":"Id da Ă¢ncora","anchorName":"Nome da Ă¢ncora","charset":"Charset do Link","cssClasses":"Classe de CSS","emailAddress":"Endereço E-Mail","emailBody":"Corpo da Mensagem","emailSubject":"Assunto da Mensagem","id":"Id","info":"Informações","langCode":"DireĂ§Ă£o do idioma","langDir":"DireĂ§Ă£o do idioma","langDirLTR":"Esquerda para Direita (LTR)","langDirRTL":"Direita para Esquerda (RTL)","menu":"Editar Link","name":"Nome","noAnchors":"(NĂ£o hĂ¡ Ă¢ncoras no documento)","noEmail":"Por favor, digite o endereço de e-mail","noUrl":"Por favor, digite o endereço do Link","other":"<outro>","popupDependent":"Dependente (Netscape)","popupFeatures":"Propriedades da Janela Pop-up","popupFullScreen":"Modo Tela Cheia (IE)","popupLeft":"Esquerda","popupLocationBar":"Barra de Endereços","popupMenuBar":"Barra de Menus","popupResizable":"RedimensionĂ¡vel","popupScrollBars":"Barras de Rolagem","popupStatusBar":"Barra de Status","popupToolbar":"Barra de Ferramentas","popupTop":"Topo","rel":"Tipo de RelaĂ§Ă£o","selectAnchor":"Selecione uma Ă¢ncora","styles":"Estilos","tabIndex":"Ăndice de TabulaĂ§Ă£o","target":"Destino","targetFrame":"<frame>","targetFrameName":"Nome do Frame de Destino","targetPopup":"<janela popup>","targetPopupName":"Nome da Janela Pop-up","title":"Editar Link","toAnchor":"Ă‚ncora nesta pĂ¡gina","toEmail":"E-Mail","toUrl":"URL","toolbar":"Inserir/Editar Link","type":"Tipo de hiperlink","unlink":"Remover Link","upload":"Enviar ao Servidor"},"list":{"bulletedlist":"Lista sem nĂºmeros","numberedlist":"Lista numerada"},"magicline":{"title":"Insera um parĂ¡grafo aqui"},"maximize":{"maximize":"Maximizar","minimize":"Minimize"},"pastetext":{"button":"Colar como Texto sem FormataĂ§Ă£o","title":"Colar como Texto sem FormataĂ§Ă£o"},"pastefromword":{"confirmCleanup":"O texto que vocĂª deseja colar parece ter sido copiado do Word. VocĂª gostaria de remover a formataĂ§Ă£o antes de colar?","error":"NĂ£o foi possĂ­vel limpar os dados colados devido a um erro interno","title":"Colar do Word","toolbar":"Colar do Word"},"removeformat":{"toolbar":"Remover FormataĂ§Ă£o"},"sourcearea":{"toolbar":"CĂ³digo-Fonte"},"specialchar":{"options":"Opções de Caractere Especial","title":"Selecione um Caractere Especial","toolbar":"Inserir Caractere Especial"},"scayt":{"btn_about":"Sobre a correĂ§Ă£o ortogrĂ¡fica durante a digitaĂ§Ă£o","btn_dictionaries":"DicionĂ¡rios","btn_disable":"Desabilitar correĂ§Ă£o ortogrĂ¡fica durante a digitaĂ§Ă£o","btn_enable":"Habilitar correĂ§Ă£o ortogrĂ¡fica durante a digitaĂ§Ă£o","btn_langs":"Idiomas","btn_options":"Opções","text_title":"CorreĂ§Ă£o ortogrĂ¡fica durante a digitaĂ§Ă£o"},"stylescombo":{"label":"Estilo","panelTitle":"Estilos de FormataĂ§Ă£o","panelTitle1":"Estilos de bloco","panelTitle2":"Estilos de texto corrido","panelTitle3":"Estilos de objeto"},"table":{"border":"Borda","caption":"Legenda","cell":{"menu":"CĂ©lula","insertBefore":"Inserir cĂ©lula a esquerda","insertAfter":"Inserir cĂ©lula a direita","deleteCell":"Remover CĂ©lulas","merge":"Mesclar CĂ©lulas","mergeRight":"Mesclar com cĂ©lula a direita","mergeDown":"Mesclar com cĂ©lula abaixo","splitHorizontal":"Dividir cĂ©lula horizontalmente","splitVertical":"Dividir cĂ©lula verticalmente","title":"Propriedades da cĂ©lula","cellType":"Tipo de cĂ©lula","rowSpan":"Linhas cobertas","colSpan":"Colunas cobertas","wordWrap":"Quebra de palavra","hAlign":"Alinhamento horizontal","vAlign":"Alinhamento vertical","alignBaseline":"Patamar de alinhamento","bgColor":"Cor de fundo","borderColor":"Cor das bordas","data":"Dados","header":"Cabeçalho","yes":"Sim","no":"NĂ£o","invalidWidth":"A largura da cĂ©lula tem que ser um nĂºmero.","invalidHeight":"A altura da cĂ©lula tem que ser um nĂºmero.","invalidRowSpan":"Linhas cobertas tem que ser um nĂºmero inteiro.","invalidColSpan":"Colunas cobertas tem que ser um nĂºmero inteiro.","chooseColor":"Escolher"},"cellPad":"Margem interna","cellSpace":"Espaçamento","column":{"menu":"Coluna","insertBefore":"Inserir coluna a esquerda","insertAfter":"Inserir coluna a direita","deleteColumn":"Remover Colunas"},"columns":"Colunas","deleteTable":"Apagar Tabela","headers":"Cabeçalho","headersBoth":"Ambos","headersColumn":"Primeira coluna","headersNone":"Nenhum","headersRow":"Primeira linha","invalidBorder":"O tamanho da borda tem que ser um nĂºmero.","invalidCellPadding":"A margem interna das cĂ©lulas tem que ser um nĂºmero.","invalidCellSpacing":"O espaçamento das cĂ©lulas tem que ser um nĂºmero.","invalidCols":"O nĂºmero de colunas tem que ser um nĂºmero maior que 0.","invalidHeight":"A altura da tabela tem que ser um nĂºmero.","invalidRows":"O nĂºmero de linhas tem que ser um nĂºmero maior que 0.","invalidWidth":"A largura da tabela tem que ser um nĂºmero.","menu":"Formatar Tabela","row":{"menu":"Linha","insertBefore":"Inserir linha acima","insertAfter":"Inserir linha abaixo","deleteRow":"Remover Linhas"},"rows":"Linhas","summary":"Resumo","title":"Formatar Tabela","toolbar":"Tabela","widthPc":"%","widthPx":"pixels","widthUnit":"unidade largura"},"undo":{"redo":"Refazer","undo":"Desfazer"},"wsc":{"btnIgnore":"Ignorar uma vez","btnIgnoreAll":"Ignorar Todas","btnReplace":"Alterar","btnReplaceAll":"Alterar Todas","btnUndo":"Desfazer","changeTo":"Alterar para","errorLoading":"Erro carregando servidor de aplicaĂ§Ă£o: %s.","ieSpellDownload":"A verificaĂ§Ă£o ortogrĂ¡fica nĂ£o foi instalada. VocĂª gostaria de realizar o download agora?","manyChanges":"VerificaĂ§Ă£o ortogrĂ¡fica encerrada: %1 palavras foram alteradas","noChanges":"VerificaĂ§Ă£o ortogrĂ¡fica encerrada: NĂ£o houve alterações","noMispell":"VerificaĂ§Ă£o encerrada: NĂ£o foram encontrados erros de ortografia","noSuggestions":"-sem sugestões de ortografia-","notAvailable":"Desculpe, o serviço nĂ£o estĂ¡ disponĂ­vel no momento.","notInDic":"NĂ£o encontrada","oneChange":"VerificaĂ§Ă£o ortogrĂ¡fica encerrada: Uma palavra foi alterada","progress":"VerificaĂ§Ă£o ortogrĂ¡fica em andamento...","title":"Corretor OrtogrĂ¡fico","toolbar":"Verificar Ortografia"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/pt.js b/js/ckeditor/lang/pt.js
new file mode 100644
index 0000000..8169151
--- /dev/null
+++ b/js/ckeditor/lang/pt.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['pt']={"editor":"Editor de texto enriquecido","editorPanel":"Painel do editor de texto enriquecido","common":{"editorHelp":"Pressione ALT+0 para ajuda","browseServer":"Navegar no servidor","url":"URL","protocol":"Protocolo","upload":"Enviar","uploadSubmit":"Enviar para o servidor","image":"Imagem","flash":"Flash","form":"FormulĂ¡rio","checkbox":"Caixa de SeleĂ§Ă£o","radio":"BotĂ£o","textField":"Campo do Texto","textarea":"Ărea do Texto","hiddenField":"Campo oculto","button":"BotĂ£o","select":"Campo da SeleĂ§Ă£o","imageButton":"BotĂ£o da Imagem","notSet":"<NĂ£o definido>","id":"Id.","name":"Nome","langDir":"DireĂ§Ă£o do Idioma","langDirLtr":"Esquerda para a Direita (EPD)","langDirRtl":"Direita para a Esquerda (DPE)","langCode":"CĂ³digo do Idioma","longDescr":"DescriĂ§Ă£o Completa do URL","cssClass":"Classes de Estilo das Folhas","advisoryTitle":"TĂ­tulo Consultivo","cssStyle":"Estilo","ok":"CONFIRMAR","cancel":"Cancelar","close":"Fechar","preview":"PrĂ©-visualizaĂ§Ă£o","resize":"Redimensionar","generalTab":"Geral","advancedTab":"Avançado","validateNumberFailed":"Este valor nĂ£o Ă© um numero.","confirmNewPage":"IrĂ£o ser perdidas quaisquer alterações nĂ£o guardadas. Tem a certeza que deseja carregar a nova pĂ¡gina?","confirmCancel":"Foram alteradas algumas das opções. Tem a certeza que deseja fechar a janela?","options":"Opções","target":"Destino","targetNew":"Nova Janela (_blank)","targetTop":"Janela Superior (_top)","targetSelf":"Mesma Janela (_self)","targetParent":"Janela Parente (_parent)","langDirLTR":"Esquerda para a Direita (EPD)","langDirRTL":"Direita para a Esquerda (DPE)","styles":"Estilo","cssClasses":"Classes de folhas de estilo","width":"Largura","height":"Altura","align":"Alinhamento","alignLeft":"Esquerda","alignRight":"Direita","alignCenter":"Centrado","alignJustify":"Justificado","alignTop":"Topo","alignMiddle":"Centro","alignBottom":"Base","alignNone":"Nenhum","invalidValue":"Valor invĂ¡lido.","invalidHeight":"A altura deve ser um nĂºmero.","invalidWidth":"A largura deve ser um nĂºmero. ","invalidCssLength":"O valor especificado para o campo \"1%\" deve ser um nĂºmero positivo, com ou sem uma unidade de medida CSS vĂ¡lida (px, %, in, cm, mm, em, ex, pt, ou pc).","invalidHtmlLength":"O valor especificado para o campo \"1%\" deve ser um nĂºmero positivo, com ou sem uma unidade de medida HTML vĂ¡lida (px ou %).","invalidInlineStyle":"O valor especificado para o estilo em linha deve constituir um ou mais conjuntos de valores com o formato de \"nome : valor\", separados por ponto e vĂ­rgula.","cssLengthTooltip":"Insira um nĂºmero para um valor em pontos ou um nĂºmero com uma unidade CSS vĂ¡lida (px, %, in, cm, mm, em, ex, pt, ou pc).","unavailable":"%1<span class=\"cke_accessibility\">, indisponĂ­vel</span>"},"about":{"copy":"Direitos de Autor &copy; $1. Todos os direitos reservados.","dlgTitle":"Sobre o CKEditor","help":"Doar $1 para ajudar.","moreInfo":"Para informaĂ§Ă£o sobre licenciamento visite o nosso sĂ­tio web:","title":"Sobre o CKEditor","userGuide":"CKEditor - Guia do Utilizador"},"basicstyles":{"bold":"Negrito","italic":"ItĂ¡lico","strike":"Rasurado","subscript":"Superior Ă  linha","superscript":"Inferior Ă  Linha","underline":"Sublinhado"},"blockquote":{"toolbar":"Bloco de citaĂ§Ă£o"},"clipboard":{"copy":"Copiar","copyError":"A configuraĂ§Ă£o de segurança do navegador nĂ£o permite a execuĂ§Ă£o automĂ¡tica de operações de copiar. Por favor use o teclado (Ctrl/Cmd+C).","cut":"Cortar","cutError":"A configuraĂ§Ă£o de segurança do navegador nĂ£o permite a execuĂ§Ă£o automĂ¡tica de operações de cortar. Por favor use o teclado (Ctrl/Cmd+X).","paste":"Colar","pasteArea":"Colar Ă¡rea","pasteMsg":"Por favor, cole dentro da seguinte caixa usando o teclado (<STRONG>Ctrl/Cmd+V</STRONG>) e prima <STRONG>OK</STRONG>.","securityMsg":"Devido Ă¡s definições de segurança do teu browser, o editor nĂ£o pode aceder ao clipboard diretamente. É necessĂ¡rio que voltes a colar as informações nesta janela.","title":"Colar"},"contextmenu":{"options":"Menu de opções de contexto"},"button":{"selectedLabel":"%1 (Selecionado)"},"toolbar":{"toolbarCollapse":"Ocultar barra de ferramentas","toolbarExpand":"Expandir barra de ferramentas","toolbarGroups":{"document":"Documento","clipboard":"Ărea de transferĂªncia/Anular","editing":"EdiĂ§Ă£o","forms":"FormulĂ¡rios","basicstyles":"Estilos BĂ¡sicos","paragraph":"ParĂ¡grafo","links":"Hiperligações","insert":"Inserir","styles":"Estilos","colors":"Cores","tools":"Ferramentas"},"toolbars":"Editor de Barras de Ferramentas"},"elementspath":{"eleLabel":"Caminho dos elementos","eleTitle":"Elemento %1"},"format":{"label":"Formatar","panelTitle":"Formatar ParĂ¡grafo","tag_address":"Endereço","tag_div":"Normal (DIV)","tag_h1":"TĂ­tulo 1","tag_h2":"TĂ­tulo 2","tag_h3":"TĂ­tulo 3","tag_h4":"TĂ­tulo 4","tag_h5":"TĂ­tulo 5","tag_h6":"TĂ­tulo 6","tag_p":"Normal","tag_pre":"Formatado"},"horizontalrule":{"toolbar":"Inserir Linha Horizontal"},"image":{"alertUrl":"Por favor introduza o URL da imagem","alt":"Texto Alternativo","border":"Limite","btnUpload":"Enviar para o servidor","button2Img":"Deseja transformar o botĂ£o com imagem selecionado em uma imagem?","hSpace":"Esp.Horiz","img2Button":"Deseja transformar a imagem selecionada em um botĂ£o com imagem?","infoTab":"InformaĂ§Ă£o da Imagem","linkTab":"HiperligaĂ§Ă£o","lockRatio":"Proporcional","menu":"Propriedades da Imagem","resetSize":"Tamanho Original","title":"Propriedades da Imagem","titleButton":"Propriedades do BotĂ£o de imagens","upload":"Carregar","urlMissing":"O URL da fonte da imagem estĂ¡ em falta.","vSpace":"Esp.Vert","validateBorder":"A borda tem de ser um numero.","validateHSpace":"HSpace tem de ser um numero.","validateVSpace":"VSpace tem de ser um numero."},"indent":{"indent":"Aumentar Avanço","outdent":"Diminuir Avanço"},"fakeobjects":{"anchor":" Inserir/Editar Ă‚ncora","flash":"AnimaĂ§Ă£o Flash","hiddenfield":"Campo oculto","iframe":"IFrame","unknown":"Objeto Desconhecido"},"link":{"acccessKey":"Chave de Acesso","advanced":"Avançado","advisoryContentType":"Tipo de ConteĂºdo","advisoryTitle":"TĂ­tulo","anchor":{"toolbar":" Inserir/Editar Ă‚ncora","menu":"Propriedades da Ă‚ncora","title":"Propriedades da Ă‚ncora","name":"Nome da Ă‚ncora","errorName":"Por favor, introduza o nome da Ă¢ncora","remove":"Remove Anchor"},"anchorId":"Por ID de elemento","anchorName":"Por Nome de ReferĂªncia","charset":"Fonte de caracteres vinculado","cssClasses":"Classes de Estilo de Folhas Classes","emailAddress":"Endereço de E-Mail","emailBody":"Corpo da Mensagem","emailSubject":"TĂ­tulo de Mensagem","id":"ID","info":"InformaĂ§Ă£o de HiperligaĂ§Ă£o","langCode":"OrientaĂ§Ă£o de idioma","langDir":"OrientaĂ§Ă£o de idioma","langDirLTR":"Esquerda Ă  Direita (LTR)","langDirRTL":"Direita a Esquerda (RTL)","menu":"Editar HiperligaĂ§Ă£o","name":"Nome","noAnchors":"(NĂ£o hĂ¡ referĂªncias disponĂ­veis no documento)","noEmail":"Por favor introduza o endereço de e-mail","noUrl":"Por favor introduza a hiperligaĂ§Ă£o URL","other":"<outro>","popupDependent":"Dependente (Netscape)","popupFeatures":"CaracterĂ­sticas de Janela de Popup","popupFullScreen":"Janela Completa (IE)","popupLeft":"PosiĂ§Ă£o Esquerda","popupLocationBar":"Barra de localizaĂ§Ă£o","popupMenuBar":"Barra de Menu","popupResizable":"RedimensionĂ¡vel","popupScrollBars":"Barras de deslocamento","popupStatusBar":"Barra de Estado","popupToolbar":"Barra de ferramentas","popupTop":"PosiĂ§Ă£o Direita","rel":"RelaĂ§Ă£o","selectAnchor":"Seleccionar una referĂªncia","styles":"Estilo","tabIndex":"Ăndice de tabulaĂ§Ă£o","target":"Alvo","targetFrame":"<frame>","targetFrameName":"Nome do Frame Destino","targetPopup":"<janela de popup>","targetPopupName":"Nome da Janela de Popup","title":"HiperligaĂ§Ă£o","toAnchor":"ReferĂªncia a esta pĂ¡gina","toEmail":"Email","toUrl":"URL","toolbar":"Inserir/Editar HiperligaĂ§Ă£o","type":"Tipo de HiperligaĂ§Ă£o","unlink":"Eliminar HiperligaĂ§Ă£o","upload":"Carregar"},"list":{"bulletedlist":"Marcas","numberedlist":"NumeraĂ§Ă£o"},"magicline":{"title":"Insira aqui o parĂ¡grafo"},"maximize":{"maximize":"Maximizar","minimize":"Minimizar"},"pastetext":{"button":"Colar como Texto Simples","title":"Colar como Texto Simples"},"pastefromword":{"confirmCleanup":"O texto que pretende colar parece ter sido copiado do Word. Deseja limpĂ¡-lo antes de colar?","error":"NĂ£o foi possivel limpar a informaĂ§Ă£o colada decido a um erro interno.","title":"Colar do Word","toolbar":"Colar do Word"},"removeformat":{"toolbar":"Eliminar Formato"},"sourcearea":{"toolbar":"Fonte"},"specialchar":{"options":"Opções de caracteres especiais","title":"Selecione um caracter especial","toolbar":"Inserir carĂ¡cter especial"},"scayt":{"btn_about":"About SCAYT","btn_dictionaries":"Dictionaries","btn_disable":"Disable SCAYT","btn_enable":"Enable SCAYT","btn_langs":"Languages","btn_options":"Options","text_title":"Spell Check As You Type"},"stylescombo":{"label":"Estilos","panelTitle":"Estilos de FormataĂ§Ă£o","panelTitle1":"Estilos de bloco","panelTitle2":"Estilos de Linha","panelTitle3":"Estilos de Objeto"},"table":{"border":"Tamanho do contorno","caption":"Legenda","cell":{"menu":"CĂ©lula","insertBefore":"Inserir cĂ©lula antes","insertAfter":"Inserir cĂ©lula depois","deleteCell":"Apagar CĂ©lulas","merge":"Unir CĂ©lulas","mergeRight":"Unir Ă  Direita","mergeDown":"Fundir abaixo","splitHorizontal":"Dividir cĂ©lula horizontalmente","splitVertical":"Dividir cĂ©lula verticalmente","title":"Propriedades da cĂ©lula","cellType":"Tipo de cĂ©lula","rowSpan":"Filas na CĂ©lula","colSpan":"Colunas na CĂ©lula","wordWrap":"Moldar texto","hAlign":"Alinhamento Horizontal","vAlign":"Alinhamento Vertical","alignBaseline":"Base","bgColor":"Cor de Fundo","borderColor":"Cor da Margem","data":"Dados","header":"Cabeçalho","yes":"Sim","no":"NĂ£o","invalidWidth":"A largura da cĂ©lula deve ser um nĂºmero.","invalidHeight":"A altura da cĂ©lula deve ser um nĂºmero.","invalidRowSpan":"As filas da cĂ©lula deve ter um nĂºmero inteiro.","invalidColSpan":"As colunas da cĂ©lula deve ter um nĂºmero inteiro.","chooseColor":"Escolher"},"cellPad":"Espaço interior","cellSpace":"Espaçamento de cĂ©lula","column":{"menu":"Coluna","insertBefore":"Inserir Coluna Antes","insertAfter":"Inserir coluna depois","deleteColumn":"Apagar colunas"},"columns":"Colunas","deleteTable":"Apagar tabela","headers":"Cabeçalhos","headersBoth":"Ambos","headersColumn":"Primeira coluna","headersNone":"Nenhum","headersRow":"Primeira linha","invalidBorder":"O tamanho da margem tem de ser um nĂºmero.","invalidCellPadding":"A criaĂ§Ă£o do espaço na cĂ©lula deve ser um nĂºmero positivo.","invalidCellSpacing":"O espaçamento da cĂ©lula deve ser um nĂºmero positivo.","invalidCols":"O nĂºmero de colunas tem de ser um nĂºmero maior que 0.","invalidHeight":"A altura da tabela tem de ser um nĂºmero.","invalidRows":"O nĂºmero de linhas tem de ser maior que 0.","invalidWidth":"A largura da tabela tem de ser um nĂºmero.","menu":"Propriedades da Tabela","row":{"menu":"Linha","insertBefore":"Inserir linha antes","insertAfter":"Inserir linha depois","deleteRow":"Apagar linhas"},"rows":"Linhas","summary":"SumĂ¡rio","title":"Propriedades da Tabela","toolbar":"Tabela","widthPc":"percentagem","widthPx":"pontos","widthUnit":"unidade da largura"},"undo":{"redo":"Refazer","undo":"Anular"},"wsc":{"btnIgnore":"Ignorar","btnIgnoreAll":"Ignorar Tudo","btnReplace":"Substituir","btnReplaceAll":"Substituir Tudo","btnUndo":"Anular","changeTo":"Mudar para","errorLoading":"Error loading application service host: %s.","ieSpellDownload":" VerificaĂ§Ă£o ortogrĂ¡fica nĂ£o instalada. Quer descarregar agora?","manyChanges":"VerificaĂ§Ă£o ortogrĂ¡fica completa: %1 palavras alteradas","noChanges":"VerificaĂ§Ă£o ortogrĂ¡fica completa: nĂ£o houve alteraĂ§Ă£o de palavras","noMispell":"VerificaĂ§Ă£o ortogrĂ¡fica completa: nĂ£o foram encontrados erros","noSuggestions":"- Sem sugestões -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"NĂ£o estĂ¡ num directĂ³rio","oneChange":"VerificaĂ§Ă£o ortogrĂ¡fica completa: uma palavra alterada","progress":"VerificaĂ§Ă£o ortogrĂ¡fica em progresso…","title":"Spell Checker","toolbar":"VerificaĂ§Ă£o OrtogrĂ¡fica"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/ro.js b/js/ckeditor/lang/ro.js
new file mode 100644
index 0000000..4ec041b
--- /dev/null
+++ b/js/ckeditor/lang/ro.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['ro']={"editor":"Rich Text Editor","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Apasă ALT 0 pentru ajutor","browseServer":"RăsfoieÅŸte server","url":"URL","protocol":"Protocol","upload":"Ăncarcă","uploadSubmit":"Trimite la server","image":"Imagine","flash":"Flash","form":"Formular (Form)","checkbox":"Bifă (Checkbox)","radio":"Buton radio (RadioButton)","textField":"CĂ¢mp text (TextField)","textarea":"Suprafaţă text (Textarea)","hiddenField":"CĂ¢mp ascuns (HiddenField)","button":"Buton","select":"CĂ¢mp selecÅ£ie (SelectionField)","imageButton":"Buton imagine (ImageButton)","notSet":"<nesetat>","id":"Id","name":"Nume","langDir":"DirecÅ£ia cuvintelor","langDirLtr":"stĂ¢nga-dreapta (LTR)","langDirRtl":"dreapta-stĂ¢nga (RTL)","langCode":"Codul limbii","longDescr":"Descrierea lungă URL","cssClass":"Clasele cu stilul paginii (CSS)","advisoryTitle":"Titlul consultativ","cssStyle":"Stil","ok":"OK","cancel":"Anulare","close":"Ănchide","preview":"Previzualizare","resize":"Trage pentru a redimensiona","generalTab":"General","advancedTab":"Avansat","validateNumberFailed":"Această valoare nu este un număr.","confirmNewPage":"Orice modificări nesalvate ale acestui conÈ›inut, vor fi pierdute. Sigur doriÈ›i Ă®ncărcarea unei noi pagini?","confirmCancel":"CĂ¢teva opÈ›iuni au fost schimbate. Sigur doriÈ›i să Ă®nchideÈ›i dialogul?","options":"OpÈ›iuni","target":"Èintă","targetNew":"Fereastră nouă (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Ăn aceeaÈ™i fereastră (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"StĂ¢nga spre Dreapta (LTR)","langDirRTL":"Dreapta spre StĂ¢nga (RTL)","styles":"Stil","cssClasses":"Stylesheet Classes","width":"Lăţime","height":"ĂnălÅ£ime","align":"Aliniere","alignLeft":"MăreÈ™te Bara","alignRight":"Dreapta","alignCenter":"Centru","alignJustify":"Aliniere Ă®n bloc (Block Justify)","alignTop":"Sus","alignMiddle":"Mijloc","alignBottom":"Jos","alignNone":"None","invalidValue":"Varloare invalida","invalidHeight":"ĂnălÈ›imea trebuie să fie un număr.","invalidWidth":"Lățimea trebuie să fie un număr.","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\">, nu este disponibil</span>"},"about":{"copy":"Copyright &copy; $1. Toate drepturile rezervate.","dlgTitle":"Despre CKEeditor","help":"CiteÈ™te $1 pentru ajutor.","moreInfo":"Pentru informaÈ›ii despre licență, vă rugăm vizitaÈ›i web site-ul nostru:","title":"Despre CKEditor","userGuide":"CKEditor Ghid Utilizator"},"basicstyles":{"bold":"ĂngroÅŸat (bold)","italic":"Ănclinat (italic)","strike":"Tăiat (strike through)","subscript":"Indice (subscript)","superscript":"Putere (superscript)","underline":"Subliniat (underline)"},"blockquote":{"toolbar":"Citat"},"clipboard":{"copy":"Copiază","copyError":"Setările de securitate ale navigatorului (browser) pe care Ă®l folosiÅ£i nu permit editorului să execute automat operaÅ£iunea de copiere. Vă rugăm folosiÅ£i tastatura (Ctrl/Cmd+C).","cut":"Taie","cutError":"Setările de securitate ale navigatorului (browser) pe care Ă®l folosiÅ£i nu permit editorului să execute automat operaÅ£iunea de tăiere. Vă rugăm folosiÅ£i tastatura (Ctrl/Cmd+X).","paste":"Adaugă","pasteArea":"SuprafaÈ›a de adăugare","pasteMsg":"Vă rugăm adăugaÅ£i Ă®n căsuÅ£a următoare folosind tastatura (<strong>Ctrl/Cmd+V</strong>) ÅŸi apăsaÅ£i OK","securityMsg":"Din cauza setărilor de securitate ale programului dvs. cu care navigaÅ£i pe internet (browser), editorul nu poate accesa direct datele din clipboard. Va trebui să adăugaÅ£i din nou datele Ă®n această fereastră.","title":"Adaugă"},"contextmenu":{"options":"OpÈ›iuni Meniu Contextual"},"button":{"selectedLabel":"%1 (Selectat)"},"toolbar":{"toolbarCollapse":"MicÈ™orează Bara","toolbarExpand":"MăreÈ™te Bara","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":"Editează bara de unelte"},"elementspath":{"eleLabel":"Calea elementelor","eleTitle":"%1 element"},"format":{"label":"Formatare","panelTitle":"Formatare","tag_address":"Adresă","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":"Formatat"},"horizontalrule":{"toolbar":"Inserează linie orizontală"},"image":{"alertUrl":"Vă rugăm să scrieÅ£i URL-ul imaginii","alt":"Text alternativ","border":"Margine","btnUpload":"Trimite la 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":"InformaÅ£ii despre imagine","linkTab":"Link (Legătură web)","lockRatio":"Păstrează proporÅ£iile","menu":"Proprietăţile imaginii","resetSize":"Resetează mărimea","title":"Proprietăţile imaginii","titleButton":"Proprietăţi buton imagine (Image Button)","upload":"Ăncarcă","urlMissing":"Sursa URL a imaginii lipseÈ™te.","vSpace":"VSpace","validateBorder":"Bordura trebuie să fie un număr Ă®ntreg.","validateHSpace":"Hspace trebuie să fie un număr Ă®ntreg.","validateVSpace":"Vspace trebuie să fie un număr Ă®ntreg."},"indent":{"indent":"CreÅŸte indentarea","outdent":"Scade indentarea"},"fakeobjects":{"anchor":"Inserează/Editează ancoră","flash":"Flash Animation","hiddenfield":"CĂ¢mp ascuns (HiddenField)","iframe":"IFrame","unknown":"Unknown Object"},"link":{"acccessKey":"Tasta de acces","advanced":"Avansat","advisoryContentType":"Tipul consultativ al titlului","advisoryTitle":"Titlul consultativ","anchor":{"toolbar":"Inserează/Editează ancoră","menu":"Proprietăţi ancoră","title":"Proprietăţi ancoră","name":"Numele ancorei","errorName":"Vă rugăm scrieÅ£i numele ancorei","remove":"Elimină ancora"},"anchorId":"după Id-ul elementului","anchorName":"după numele ancorei","charset":"Setul de caractere al resursei legate","cssClasses":"Clasele cu stilul paginii (CSS)","emailAddress":"Adresă de e-mail","emailBody":"OpÈ›iuni Meniu Contextual","emailSubject":"Subiectul mesajului","id":"Id","info":"InformaÅ£ii despre link (Legătură web)","langCode":"DirecÅ£ia cuvintelor","langDir":"DirecÅ£ia cuvintelor","langDirLTR":"stĂ¢nga-dreapta (LTR)","langDirRTL":"dreapta-stĂ¢nga (RTL)","menu":"Editează Link","name":"Nume","noAnchors":"(Nicio ancoră disponibilă Ă®n document)","noEmail":"Vă rugăm să scrieÅ£i adresa de e-mail","noUrl":"Vă rugăm să scrieÅ£i URL-ul","other":"<alt>","popupDependent":"Dependent (Netscape)","popupFeatures":"Proprietăţile ferestrei popup","popupFullScreen":"Tot ecranul (Full Screen)(IE)","popupLeft":"PoziÅ£ia la stĂ¢nga","popupLocationBar":"Bara de locaÅ£ie","popupMenuBar":"Bara de meniu","popupResizable":"Redimensionabil","popupScrollBars":"Bare de derulare","popupStatusBar":"Bara de status","popupToolbar":"Bara de opÅ£iuni","popupTop":"PoziÅ£ia la dreapta","rel":"RelaÈ›ie","selectAnchor":"SelectaÅ£i o ancoră","styles":"Stil","tabIndex":"Indexul tabului","target":"Å¢intă (Target)","targetFrame":"<frame>","targetFrameName":"Numele frameului Å£intă","targetPopup":"<fereastra popup>","targetPopupName":"Numele ferestrei popup","title":"Link (Legătură web)","toAnchor":"Ancoră Ă®n această pagină","toEmail":"E-Mail","toUrl":"URL","toolbar":"Inserează/Editează link (legătură web)","type":"Tipul link-ului (al legăturii web)","unlink":"Ănlătură link (legătură web)","upload":"Ăncarcă"},"list":{"bulletedlist":"Inserează / Elimină Listă cu puncte","numberedlist":"Inserează / Elimină Listă numerotată"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"MăreÈ™te","minimize":"MicÈ™orează"},"pastetext":{"button":"Adaugă ca text simplu (Plain Text)","title":"Adaugă ca text simplu (Plain Text)"},"pastefromword":{"confirmCleanup":"Textul pe care doriÈ›i să-l lipiÈ›i este din Word. DoriÈ›i curățarea textului Ă®nante de a-l adăuga?","error":"Nu a fost posibilă curățarea datelor adăugate datorită unei erori interne","title":"Adaugă din Word","toolbar":"Adaugă din Word"},"removeformat":{"toolbar":"Ănlătură formatarea"},"sourcearea":{"toolbar":"Sursa"},"specialchar":{"options":"OpÈ›iuni caractere speciale","title":"Selectează caracter special","toolbar":"Inserează caracter special"},"scayt":{"btn_about":"About SCAYT","btn_dictionaries":"Dictionaries","btn_disable":"Disable SCAYT","btn_enable":"Enable SCAYT","btn_langs":"Languages","btn_options":"Options","text_title":"Spell Check As You Type"},"stylescombo":{"label":"Stil","panelTitle":"Formatarea stilurilor","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"Mărimea marginii","caption":"Titlu (Caption)","cell":{"menu":"Celulă","insertBefore":"Inserează celulă Ă®nainte","insertAfter":"Inserează celulă după","deleteCell":"Återge celule","merge":"UneÅŸte celule","mergeRight":"UneÅŸte la dreapta","mergeDown":"UneÅŸte jos","splitHorizontal":"Ămparte celula pe orizontală","splitVertical":"Ămparte celula pe verticală","title":"Proprietăți celulă","cellType":"Tipul celulei","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Aliniament orizontal","vAlign":"Aliniament vertical","alignBaseline":"Baseline","bgColor":"Culoare fundal","borderColor":"Culoare bordură","data":"Data","header":"Antet","yes":"Da","no":"Nu","invalidWidth":"Lățimea celulei trebuie să fie un număr.","invalidHeight":"ĂnălÈ›imea celulei trebuie să fie un număr.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Alege"},"cellPad":"SpaÅ£iu Ă®n cadrul celulei","cellSpace":"SpaÅ£iu Ă®ntre celule","column":{"menu":"Coloană","insertBefore":"Inserează coloană Ă®nainte","insertAfter":"Inserează coloană după","deleteColumn":"Återge celule"},"columns":"Coloane","deleteTable":"Återge tabel","headers":"Antente","headersBoth":"Ambele","headersColumn":"Prima coloană","headersNone":"Nimic","headersRow":"Primul rĂ¢nd","invalidBorder":"Dimensiunea bordurii trebuie să aibe un număr.","invalidCellPadding":"SpaÈ›ierea celulei trebuie sa fie un număr pozitiv","invalidCellSpacing":"SpaÈ›ierea celului trebuie să fie un număr pozitiv.","invalidCols":"Numărul coloanelor trebuie să fie mai mare decĂ¢t 0.","invalidHeight":"Inaltimea celulei trebuie sa fie un numar.","invalidRows":"Numărul rĂ¢ndurilor trebuie să fie mai mare decĂ¢t 0.","invalidWidth":"Lățimea tabelului trebuie să fie un număr.","menu":"Proprietăţile tabelului","row":{"menu":"RĂ¢nd","insertBefore":"Inserează rĂ¢nd Ă®nainte","insertAfter":"Inserează rĂ¢nd după","deleteRow":"Återge rĂ¢nduri"},"rows":"RĂ¢nduri","summary":"Rezumat","title":"Proprietăţile tabelului","toolbar":"Tabel","widthPc":"procente","widthPx":"pixeli","widthUnit":"unitate lățime"},"undo":{"redo":"Starea ulterioară (redo)","undo":"Starea anterioară (undo)"},"wsc":{"btnIgnore":"Ignoră","btnIgnoreAll":"Ignoră toate","btnReplace":"ĂnlocuieÅŸte","btnReplaceAll":"ĂnlocuieÅŸte tot","btnUndo":"Starea anterioară (undo)","changeTo":"Schimbă Ă®n","errorLoading":"Eroare Ă®n lansarea aplicaÈ›iei service host %s.","ieSpellDownload":"Unealta pentru verificat textul (Spell checker) neinstalată. DoriÅ£i să o descărcaÅ£i acum?","manyChanges":"Verificarea textului terminată: 1% cuvinte modificate","noChanges":"Verificarea textului terminată: Niciun cuvĂ¢nt modificat","noMispell":"Verificarea textului terminată: Nicio greÅŸeală găsită","noSuggestions":"- Fără sugestii -","notAvailable":"ScuzaÈ›i, dar serviciul nu este disponibil momentan.","notInDic":"Nu e Ă®n dicÅ£ionar","oneChange":"Verificarea textului terminată: Un cuvĂ¢nt modificat","progress":"Verificarea textului Ă®n desfăşurare...","title":"Spell Checker","toolbar":"Verifică scrierea textului"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/ru.js b/js/ckeditor/lang/ru.js
new file mode 100644
index 0000000..80a19bc
--- /dev/null
+++ b/js/ckeditor/lang/ru.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['ru']={"editor":"Đ’Đ¸Đ·ÑƒĐ°Đ»ÑŒĐ½Ñ‹Đ¹ Ñ‚ĐµĐºÑÑ‚Đ¾Đ²Ñ‹Đ¹ Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€","editorPanel":"Đ’Đ¸Đ·ÑƒĐ°Đ»ÑŒĐ½Ñ‹Đ¹ Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€ Ñ‚ĐµĐºÑÑ‚Đ°","common":{"editorHelp":"ĐĐ°Đ¶Đ¼Đ¸Ñ‚Đµ ALT-0 Đ´Đ»Ñ Đ¾Ñ‚ĐºÑ€Ñ‹Ñ‚Đ¸Ñ ÑĐ¿Ñ€Đ°Đ²ĐºĐ¸","browseServer":"Đ’Ñ‹Đ±Đ¾Ñ€ Đ½Đ° ÑĐµÑ€Đ²ĐµÑ€Đµ","url":"Đ¡ÑÑ‹Đ»ĐºĐ°","protocol":"ĐŸÑ€Đ¾Ñ‚Đ¾ĐºĐ¾Đ»","upload":"Đ—Đ°Đ³Ñ€ÑƒĐ·ĐºĐ° Ñ„Đ°Đ¹Đ»Đ°","uploadSubmit":"Đ—Đ°Đ³Ñ€ÑƒĐ·Đ¸Ñ‚ÑŒ Đ½Đ° ÑĐµÑ€Đ²ĐµÑ€","image":"Đ˜Đ·Đ¾Đ±Ñ€Đ°Đ¶ĐµĐ½Đ¸Đµ","flash":"Flash","form":"Đ¤Đ¾Ñ€Đ¼Đ°","checkbox":"Đ§ĐµĐºĐ±Đ¾ĐºÑ","radio":"Đ Đ°Đ´Đ¸Đ¾ĐºĐ½Đ¾Đ¿ĐºĐ°","textField":"Đ¢ĐµĐºÑÑ‚Đ¾Đ²Đ¾Đµ Đ¿Đ¾Đ»Đµ","textarea":"ĐœĐ½Đ¾Đ³Đ¾ÑÑ‚Ñ€Đ¾Ñ‡Đ½Đ¾Đµ Ñ‚ĐµĐºÑÑ‚Đ¾Đ²Đ¾Đµ Đ¿Đ¾Đ»Đµ","hiddenField":"Đ¡ĐºÑ€Ñ‹Ñ‚Đ¾Đµ Đ¿Đ¾Đ»Đµ","button":"ĐĐ½Đ¾Đ¿ĐºĐ°","select":"Đ’Ñ‹Đ¿Đ°Đ´Đ°ÑÑ‰Đ¸Đ¹ ÑĐ¿Đ¸ÑĐ¾Đº","imageButton":"ĐĐ½Đ¾Đ¿ĐºĐ°-Đ¸Đ·Đ¾Đ±Ñ€Đ°Đ¶ĐµĐ½Đ¸Đµ","notSet":"<Đ½Đµ ÑƒĐºĐ°Đ·Đ°Đ½Đ¾>","id":"Đ˜Đ´ĐµĐ½Ñ‚Đ¸Ñ„Đ¸ĐºĐ°Ñ‚Đ¾Ñ€","name":"Đ˜Đ¼Ñ","langDir":"ĐĐ°Đ¿Ñ€Đ°Đ²Đ»ĐµĐ½Đ¸Đµ Ñ‚ĐµĐºÑÑ‚Đ°","langDirLtr":"Đ¡Đ»ĐµĐ²Đ° Đ½Đ°Đ¿Ñ€Đ°Đ²Đ¾ (LTR)","langDirRtl":"Đ¡Đ¿Ñ€Đ°Đ²Đ° Đ½Đ°Đ»ĐµĐ²Đ¾ (RTL)","langCode":"ĐĐ¾Đ´ ÑĐ·Ñ‹ĐºĐ°","longDescr":"Đ”Đ»Đ¸Đ½Đ½Đ¾Đµ Đ¾Đ¿Đ¸ÑĐ°Đ½Đ¸Đµ ÑÑÑ‹Đ»ĐºĐ¸","cssClass":"ĐлаÑÑ CSS","advisoryTitle":"Đ—Đ°Đ³Đ¾Đ»Đ¾Đ²Đ¾Đº","cssStyle":"Đ¡Ñ‚Đ¸Đ»ÑŒ","ok":"ĐĐ","cancel":"ĐÑ‚Đ¼ĐµĐ½Đ°","close":"Đ—Đ°ĐºÑ€Ñ‹Ñ‚ÑŒ","preview":"ĐŸÑ€ĐµĐ´Đ¿Ñ€Đ¾ÑĐ¼Đ¾Ñ‚Ñ€","resize":"ĐŸĐµÑ€ĐµÑ‚Đ°Ñ‰Đ¸Ñ‚Đµ Đ´Đ»Ñ Đ¸Đ·Đ¼ĐµĐ½ĐµĐ½Đ¸Ñ Ñ€Đ°Đ·Đ¼ĐµÑ€Đ°","generalTab":"ĐÑĐ½Đ¾Đ²Đ½Đ¾Đµ","advancedTab":"Đ”Đ¾Đ¿Đ¾Đ»Đ½Đ¸Ñ‚ĐµĐ»ÑŒĐ½Đ¾","validateNumberFailed":"Đ­Ñ‚Đ¾ Đ·Đ½Đ°Ñ‡ĐµĐ½Đ¸Đµ Đ½Đµ ÑĐ²Đ»ÑĐµÑ‚ÑÑ Ñ‡Đ¸ÑĐ»Đ¾Đ¼.","confirmNewPage":"ĐеÑĐ¾Ñ…Ñ€Đ°Đ½Ñ‘Đ½Đ½Ñ‹Đµ Đ¸Đ·Đ¼ĐµĐ½ĐµĐ½Đ¸Ñ Đ±ÑƒĐ´ÑƒÑ‚ Đ¿Đ¾Ñ‚ĐµÑ€ÑĐ½Ñ‹! Đ’Ñ‹ Đ´ĐµĐ¹ÑÑ‚Đ²Đ¸Ñ‚ĐµĐ»ÑŒĐ½Đ¾ Đ¶ĐµĐ»Đ°ĐµÑ‚Đµ Đ¿ĐµÑ€ĐµĐ¹Ñ‚Đ¸ Đ½Đ° Đ´Ñ€ÑƒĐ³ÑƒÑ ÑÑ‚Ñ€Đ°Đ½Đ¸Ñ†Ñƒ?","confirmCancel":"ĐĐµĐºĐ¾Ñ‚Đ¾Ñ€Ñ‹Đµ Đ¿Đ°Ñ€Đ°Đ¼ĐµÑ‚Ñ€Ñ‹ Đ±Ñ‹Đ»Đ¸ Đ¸Đ·Đ¼ĐµĐ½ĐµĐ½Ñ‹. Đ’Ñ‹ ÑƒĐ²ĐµÑ€ĐµĐ½Ñ‹, Ñ‡Ñ‚Đ¾ Đ¶ĐµĐ»Đ°ĐµÑ‚Đµ Đ·Đ°ĐºÑ€Ñ‹Ñ‚ÑŒ без ÑĐ¾Ñ…Ñ€Đ°Đ½ĐµĐ½Đ¸Ñ?","options":"ĐŸĐ°Ñ€Đ°Đ¼ĐµÑ‚Ñ€Ñ‹","target":"Đ¦ĐµĐ»ÑŒ","targetNew":"ĐĐ¾Đ²Đ¾Đµ Đ¾ĐºĐ½Đ¾ (_blank)","targetTop":"Đ“Đ»Đ°Đ²Đ½Đ¾Đµ Đ¾ĐºĐ½Đ¾ (_top)","targetSelf":"Đ¢ĐµĐºÑƒÑ‰ĐµĐµ Đ¾ĐºĐ½Đ¾ (_self)","targetParent":"Đ Đ¾Đ´Đ¸Ñ‚ĐµĐ»ÑŒÑĐºĐ¾Đµ Đ¾ĐºĐ½Đ¾ (_parent)","langDirLTR":"Đ¡Đ»ĐµĐ²Đ° Đ½Đ°Đ¿Ñ€Đ°Đ²Đ¾ (LTR)","langDirRTL":"Đ¡Đ¿Ñ€Đ°Đ²Đ° Đ½Đ°Đ»ĐµĐ²Đ¾ (RTL)","styles":"Đ¡Ñ‚Đ¸Đ»ÑŒ","cssClasses":"CSS ĐºĐ»Đ°ÑÑÑ‹","width":"Đ¨Đ¸Ñ€Đ¸Đ½Đ°","height":"Đ’Ñ‹ÑĐ¾Ñ‚Đ°","align":"Đ’Ñ‹Ñ€Đ°Đ²Đ½Đ¸Đ²Đ°Đ½Đ¸Đµ","alignLeft":"ĐŸĐ¾ Đ»ĐµĐ²Đ¾Đ¼Ñƒ ĐºÑ€Đ°Ñ","alignRight":"ĐŸĐ¾ Đ¿Ñ€Đ°Đ²Đ¾Đ¼Ñƒ ĐºÑ€Đ°Ñ","alignCenter":"ĐŸĐ¾ Ñ†ĐµĐ½Ñ‚Ñ€Ñƒ","alignJustify":"ĐŸĐ¾ ÑˆĐ¸Ñ€Đ¸Đ½Đµ","alignTop":"ĐŸĐ¾Đ²ĐµÑ€Ñ…Ñƒ","alignMiddle":"ĐŸĐ¾ÑĐµÑ€ĐµĐ´Đ¸Đ½Đµ","alignBottom":"ĐŸĐ¾Đ½Đ¸Đ·Ñƒ","alignNone":"ĐĐµÑ‚","invalidValue":"ĐĐµĐ´Đ¾Đ¿ÑƒÑÑ‚Đ¸Đ¼Đ¾Đµ Đ·Đ½Đ°Ñ‡ĐµĐ½Đ¸Đµ.","invalidHeight":"Đ’Ñ‹ÑĐ¾Ñ‚Đ° Đ·Đ°Đ´Đ°ĐµÑ‚ÑÑ Ñ‡Đ¸ÑĐ»Đ¾Đ¼.","invalidWidth":"Đ¨Đ¸Ñ€Đ¸Đ½Đ° Đ·Đ°Đ´Đ°ĐµÑ‚ÑÑ Ñ‡Đ¸ÑĐ»Đ¾Đ¼.","invalidCssLength":"Đ—Đ½Đ°Ñ‡ĐµĐ½Đ¸Đµ, ÑƒĐºĐ°Đ·Đ°Đ½Đ½Đ¾Đµ Đ² Đ¿Đ¾Đ»Đµ \"%1\", Đ´Đ¾Đ»Đ¶Đ½Đ¾ Đ±Ñ‹Ñ‚ÑŒ Đ¿Đ¾Đ»Đ¾Đ¶Đ¸Ñ‚ĐµĐ»ÑŒĐ½Ñ‹Đ¼ Ñ†ĐµĐ»Ñ‹Đ¼ Ñ‡Đ¸ÑĐ»Đ¾Đ¼. Đ”Đ¾Đ¿ÑƒÑĐºĐ°ĐµÑ‚ÑÑ ÑƒĐºĐ°Đ·Đ°Đ½Đ¸Đµ ĐµĐ´Đ¸Đ½Đ¸Ñ† Đ¼ĐµÑ€Ñ‹ CSS (px, %, in, cm, mm, em, ex, pt или pc).","invalidHtmlLength":"Đ—Đ½Đ°Ñ‡ĐµĐ½Đ¸Đµ, ÑƒĐºĐ°Đ·Đ°Đ½Đ½Đ¾Đµ Đ² Đ¿Đ¾Đ»Đµ \"%1\", Đ´Đ¾Đ»Đ¶Đ½Đ¾ Đ±Ñ‹Ñ‚ÑŒ Đ¿Đ¾Đ»Đ¾Đ¶Đ¸Ñ‚ĐµĐ»ÑŒĐ½Ñ‹Đ¼ Ñ†ĐµĐ»Ñ‹Đ¼ Ñ‡Đ¸ÑĐ»Đ¾Đ¼. Đ”Đ¾Đ¿ÑƒÑĐºĐ°ĐµÑ‚ÑÑ ÑƒĐºĐ°Đ·Đ°Đ½Đ¸Đµ ĐµĐ´Đ¸Đ½Đ¸Ñ† Đ¼ĐµÑ€Ñ‹ HTML (px или %).","invalidInlineStyle":"Đ—Đ½Đ°Ñ‡ĐµĐ½Đ¸Đµ, ÑƒĐºĐ°Đ·Đ°Đ½Đ½Đ¾Đµ Đ´Đ»Ñ ÑÑ‚Đ¸Đ»Ñ ÑĐ»ĐµĐ¼ĐµĐ½Ñ‚Đ°, Đ´Đ¾Đ»Đ¶Đ½Đ¾ ÑĐ¾ÑÑ‚Đ¾ÑÑ‚ÑŒ из Đ¾Đ´Đ½Đ¾Đ¹ или Đ½ĐµÑĐºĐ¾Đ»ÑŒĐºĐ¸Ñ… Đ¿Đ°Ñ€ Đ´Đ°Đ½Đ½Ñ‹Ñ… Đ² Ñ„Đ¾Ñ€Đ¼Đ°Ñ‚Đµ \"Đ¿Đ°Ñ€Đ°Đ¼ĐµÑ‚Ñ€ : Đ·Đ½Đ°Ñ‡ĐµĐ½Đ¸Đµ\", Ñ€Đ°Đ·Đ´ĐµĐ»Ñ‘Đ½Đ½Ñ‹Ñ… Ñ‚Đ¾Ñ‡ĐºĐ¾Đ¹ Ñ Đ·Đ°Đ¿ÑÑ‚Đ¾Đ¹.","cssLengthTooltip":"Đ’Đ²ĐµĐ´Đ¸Ñ‚Đµ Đ·Đ½Đ°Ñ‡ĐµĐ½Đ¸Đµ Đ² Đ¿Đ¸ĐºÑелÑÑ…, Đ»Đ¸Đ±Đ¾ Ñ‡Đ¸ÑĐ»Đ¾ Ñ ĐºĐ¾Ñ€Ñ€ĐµĐºÑ‚Đ½Đ¾Đ¹ ĐµĐ´Đ¸Đ½Đ¸Ñ†ĐµĐ¹ Đ¼ĐµÑ€Ñ‹ CSS (px, %, in, cm, mm, em, ex, pt или pc).","unavailable":"%1<span class=\"cke_accessibility\">, Đ½ĐµĐ´Đ¾ÑÑ‚ÑƒĐ¿Đ½Đ¾</span>"},"about":{"copy":"Copyright &copy; $1. Đ’Ñе Đ¿Ñ€Đ°Đ²Đ° Đ·Đ°Ñ‰Đ¸Ñ‰ĐµĐ½Ñ‹.","dlgTitle":"Đ CKEditor","help":"$1 ÑĐ¾Đ´ĐµÑ€Đ¶Đ¸Ñ‚ Đ¿Đ¾Đ´Ñ€Đ¾Đ±Đ½ÑƒÑ ÑĐ¿Ñ€Đ°Đ²ĐºÑƒ Đ¿Đ¾ иÑĐ¿Đ¾Đ»ÑŒĐ·Đ¾Đ²Đ°Đ½Đ¸Ñ.","moreInfo":"Đ”Đ»Ñ Đ¿Đ¾Đ»ÑƒÑ‡ĐµĐ½Đ¸Ñ Đ¸Đ½Ñ„Đ¾Ñ€Đ¼Đ°Ñ†Đ¸Đ¸ Đ¾ Đ»Đ¸Ñ†ĐµĐ½Đ·Đ¸Đ¸, Đ¿Đ¾Đ¶Đ°Đ»ÑƒĐ¹ÑÑ‚Đ°, Đ¿ĐµÑ€ĐµĐ¹Đ´Đ¸Ñ‚Đµ Đ½Đ° Đ½Đ°Ñˆ ÑĐ°Đ¹Ñ‚:","title":"Đ CKEditor","userGuide":"Đ ÑƒĐºĐ¾Đ²Đ¾Đ´ÑÑ‚Đ²Đ¾ Đ¿Đ¾Đ»ÑŒĐ·Đ¾Đ²Đ°Ñ‚ĐµĐ»Ñ CKEditor"},"basicstyles":{"bold":"ĐŸĐ¾Đ»ÑƒĐ¶Đ¸Ñ€Đ½Ñ‹Đ¹","italic":"ĐурÑĐ¸Đ²","strike":"Đ—Đ°Ñ‡ĐµÑ€ĐºĐ½ÑƒÑ‚Ñ‹Đ¹","subscript":"ĐŸĐ¾Đ´ÑÑ‚Ñ€Đ¾Ñ‡Đ½Ñ‹Đ¹ Đ¸Đ½Đ´ĐµĐºÑ","superscript":"ĐĐ°Đ´ÑÑ‚Ñ€Đ¾Ñ‡Đ½Ñ‹Đ¹ Đ¸Đ½Đ´ĐµĐºÑ","underline":"ĐŸĐ¾Đ´Ñ‡ĐµÑ€ĐºĐ½ÑƒÑ‚Ñ‹Đ¹"},"blockquote":{"toolbar":"Đ¦Đ¸Ñ‚Đ°Ñ‚Đ°"},"clipboard":{"copy":"ĐĐ¾Đ¿Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ","copyError":"ĐĐ°ÑÑ‚Ñ€Đ¾Đ¹ĐºĐ¸ Đ±ĐµĐ·Đ¾Đ¿Đ°ÑĐ½Đ¾ÑÑ‚Đ¸ Đ²Đ°ÑˆĐµĐ³Đ¾ Đ±Ñ€Đ°ÑƒĐ·ĐµÑ€Đ° Đ½Đµ Ñ€Đ°Đ·Ñ€ĐµÑˆĐ°ÑÑ‚ Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€Ñƒ Đ²Ñ‹Đ¿Đ¾Đ»Đ½ÑÑ‚ÑŒ Đ¾Đ¿ĐµÑ€Đ°Ñ†Đ¸Đ¸ Đ¿Đ¾ ĐºĐ¾Đ¿Đ¸Ñ€Đ¾Đ²Đ°Đ½Đ¸Ñ Ñ‚ĐµĐºÑÑ‚Đ°. ĐŸĐ¾Đ¶Đ°Đ»ÑƒĐ¹ÑÑ‚Đ°, иÑĐ¿Đ¾Đ»ÑŒĐ·ÑƒĐ¹Ñ‚Đµ Đ´Đ»Ñ ÑÑ‚Đ¾Đ³Đ¾ ĐºĐ»Đ°Đ²Đ¸Đ°Ñ‚ÑƒÑ€Ñƒ (Ctrl/Cmd+C).","cut":"Đ’Ñ‹Ñ€ĐµĐ·Đ°Ñ‚ÑŒ","cutError":"ĐĐ°ÑÑ‚Ñ€Đ¾Đ¹ĐºĐ¸ Đ±ĐµĐ·Đ¾Đ¿Đ°ÑĐ½Đ¾ÑÑ‚Đ¸ Đ²Đ°ÑˆĐµĐ³Đ¾ Đ±Ñ€Đ°ÑƒĐ·ĐµÑ€Đ° Đ½Đµ Ñ€Đ°Đ·Ñ€ĐµÑˆĐ°ÑÑ‚ Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€Ñƒ Đ²Ñ‹Đ¿Đ¾Đ»Đ½ÑÑ‚ÑŒ Đ¾Đ¿ĐµÑ€Đ°Ñ†Đ¸Đ¸ Đ¿Đ¾ Đ²Ñ‹Ñ€ĐµĐ·ĐºĐµ Ñ‚ĐµĐºÑÑ‚Đ°. ĐŸĐ¾Đ¶Đ°Đ»ÑƒĐ¹ÑÑ‚Đ°, иÑĐ¿Đ¾Đ»ÑŒĐ·ÑƒĐ¹Ñ‚Đµ Đ´Đ»Ñ ÑÑ‚Đ¾Đ³Đ¾ ĐºĐ»Đ°Đ²Đ¸Đ°Ñ‚ÑƒÑ€Ñƒ (Ctrl/Cmd+X).","paste":"Đ’ÑÑ‚Đ°Đ²Đ¸Ñ‚ÑŒ","pasteArea":"Đ—Đ¾Đ½Đ° Đ´Đ»Ñ Đ²ÑÑ‚Đ°Đ²ĐºĐ¸","pasteMsg":"ĐŸĐ¾Đ¶Đ°Đ»ÑƒĐ¹ÑÑ‚Đ°, Đ²ÑÑ‚Đ°Đ²ÑŒÑ‚Đµ Ñ‚ĐµĐºÑÑ‚ Đ² Đ·Đ¾Đ½Ñƒ Đ½Đ¸Đ¶Đµ, иÑĐ¿Đ¾Đ»ÑŒĐ·ÑƒÑ ĐºĐ»Đ°Đ²Đ¸Đ°Ñ‚ÑƒÑ€Ñƒ (<strong>Ctrl/Cmd+V</strong>) и Đ½Đ°Đ¶Đ¼Đ¸Ñ‚Đµ ĐºĐ½Đ¾Đ¿ĐºÑƒ \"OK\".","securityMsg":"ĐĐ°ÑÑ‚Ñ€Đ¾Đ¹ĐºĐ¸ Đ±ĐµĐ·Đ¾Đ¿Đ°ÑĐ½Đ¾ÑÑ‚Đ¸ Đ²Đ°ÑˆĐµĐ³Đ¾ Đ±Ñ€Đ°ÑƒĐ·ĐµÑ€Đ° Đ½Đµ Ñ€Đ°Đ·Ñ€ĐµÑˆĐ°ÑÑ‚ Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€Ñƒ Đ½Đ°Đ¿Ñ€ÑĐ¼ÑƒÑ Đ¾Đ±Ñ€Đ°Ñ‰Đ°Ñ‚ÑŒÑÑ Đº Đ±ÑƒÑ„ĐµÑ€Ñƒ Đ¾Đ±Đ¼ĐµĐ½Đ°. Đ’Ñ‹ Đ´Đ¾Đ»Đ¶Đ½Ñ‹ Đ²ÑÑ‚Đ°Đ²Đ¸Ñ‚ÑŒ Ñ‚ĐµĐºÑÑ‚ ÑĐ½Đ¾Đ²Đ° Đ² ÑÑ‚Đ¾ Đ¾ĐºĐ½Đ¾.","title":"Đ’ÑÑ‚Đ°Đ²Đ¸Ñ‚ÑŒ"},"contextmenu":{"options":"ĐŸĐ°Ñ€Đ°Đ¼ĐµÑ‚Ñ€Ñ‹ ĐºĐ¾Đ½Ñ‚ĐµĐºÑÑ‚Đ½Đ¾Đ³Đ¾ Đ¼ĐµĐ½Ñ"},"button":{"selectedLabel":"%1 (Đ’Ñ‹Đ±Ñ€Đ°Đ½Đ¾)"},"toolbar":{"toolbarCollapse":"Đ¡Đ²ĐµÑ€Đ½ÑƒÑ‚ÑŒ Đ¿Đ°Đ½ĐµĐ»ÑŒ Đ¸Đ½ÑÑ‚Ñ€ÑƒĐ¼ĐµĐ½Ñ‚Đ¾Đ²","toolbarExpand":"Đ Đ°Đ·Đ²ĐµÑ€Đ½ÑƒÑ‚ÑŒ Đ¿Đ°Đ½ĐµĐ»ÑŒ Đ¸Đ½ÑÑ‚Ñ€ÑƒĐ¼ĐµĐ½Ñ‚Đ¾Đ²","toolbarGroups":{"document":"Đ”Đ¾ĐºÑƒĐ¼ĐµĐ½Ñ‚","clipboard":"Đ‘ÑƒÑ„ĐµÑ€ Đ¾Đ±Đ¼ĐµĐ½Đ° / ĐÑ‚Đ¼ĐµĐ½Đ° Đ´ĐµĐ¹ÑÑ‚Đ²Đ¸Đ¹","editing":"ĐĐ¾Ñ€Ñ€ĐµĐºÑ‚Đ¸Ñ€Đ¾Đ²ĐºĐ°","forms":"Đ¤Đ¾Ñ€Đ¼Ñ‹","basicstyles":"ĐŸÑ€Đ¾ÑÑ‚Ñ‹Đµ ÑÑ‚Đ¸Đ»Đ¸","paragraph":"ĐĐ±Đ·Đ°Ñ†","links":"Đ¡ÑÑ‹Đ»ĐºĐ¸","insert":"Đ’ÑÑ‚Đ°Đ²ĐºĐ°","styles":"Đ¡Ñ‚Đ¸Đ»Đ¸","colors":"Đ¦Đ²ĐµÑ‚Đ°","tools":"Đ˜Đ½ÑÑ‚Ñ€ÑƒĐ¼ĐµĐ½Ñ‚Ñ‹"},"toolbars":"ĐŸĐ°Đ½ĐµĐ»Đ¸ Đ¸Đ½ÑÑ‚Ñ€ÑƒĐ¼ĐµĐ½Ñ‚Đ¾Đ² Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€Đ°"},"elementspath":{"eleLabel":"ĐŸÑƒÑ‚ÑŒ ÑĐ»ĐµĐ¼ĐµĐ½Ñ‚Đ¾Đ²","eleTitle":"Đ­Đ»ĐµĐ¼ĐµĐ½Ñ‚ %1"},"format":{"label":"Đ¤Đ¾Ñ€Đ¼Đ°Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Đ½Đ¸Đµ","panelTitle":"Đ¤Đ¾Ñ€Đ¼Đ°Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Đ½Đ¸Đµ","tag_address":"ĐĐ´Ñ€ĐµÑ","tag_div":"ĐĐ±Ñ‹Ñ‡Đ½Đ¾Đµ (div)","tag_h1":"Đ—Đ°Đ³Đ¾Đ»Đ¾Đ²Đ¾Đº 1","tag_h2":"Đ—Đ°Đ³Đ¾Đ»Đ¾Đ²Đ¾Đº 2","tag_h3":"Đ—Đ°Đ³Đ¾Đ»Đ¾Đ²Đ¾Đº 3","tag_h4":"Đ—Đ°Đ³Đ¾Đ»Đ¾Đ²Đ¾Đº 4","tag_h5":"Đ—Đ°Đ³Đ¾Đ»Đ¾Đ²Đ¾Đº 5","tag_h6":"Đ—Đ°Đ³Đ¾Đ»Đ¾Đ²Đ¾Đº 6","tag_p":"ĐĐ±Ñ‹Ñ‡Đ½Đ¾Đµ","tag_pre":"ĐœĐ¾Đ½Đ¾ÑˆĐ¸Ñ€Đ¸Đ½Đ½Đ¾Đµ"},"horizontalrule":{"toolbar":"Đ’ÑÑ‚Đ°Đ²Đ¸Ñ‚ÑŒ Đ³Đ¾Ñ€Đ¸Đ·Đ¾Đ½Ñ‚Đ°Đ»ÑŒĐ½ÑƒÑ Đ»Đ¸Đ½Đ¸Ñ"},"image":{"alertUrl":"ĐŸĐ¾Đ¶Đ°Đ»ÑƒĐ¹ÑÑ‚Đ°, Đ²Đ²ĐµĐ´Đ¸Ñ‚Đµ ÑÑÑ‹Đ»ĐºÑƒ Đ½Đ° Đ¸Đ·Đ¾Đ±Ñ€Đ°Đ¶ĐµĐ½Đ¸Đµ","alt":"ĐĐ»ÑŒÑ‚ĐµÑ€Đ½Đ°Ñ‚Đ¸Đ²Đ½Ñ‹Đ¹ Ñ‚ĐµĐºÑÑ‚","border":"Đ“Ñ€Đ°Đ½Đ¸Ñ†Đ°","btnUpload":"Đ—Đ°Đ³Ñ€ÑƒĐ·Đ¸Ñ‚ÑŒ Đ½Đ° ÑĐµÑ€Đ²ĐµÑ€","button2Img":"Đ’Ñ‹ Đ¶ĐµĐ»Đ°ĐµÑ‚Đµ Đ¿Ñ€ĐµĐ¾Đ±Ñ€Đ°Đ·Đ¾Đ²Đ°Ñ‚ÑŒ ÑÑ‚Đ¾ Đ¸Đ·Đ¾Đ±Ñ€Đ°Đ¶ĐµĐ½Đ¸Đµ-ĐºĐ½Đ¾Đ¿ĐºÑƒ Đ² Đ¾Đ±Ñ‹Ñ‡Đ½Đ¾Đµ Đ¸Đ·Đ¾Đ±Ñ€Đ°Đ¶ĐµĐ½Đ¸Đµ?","hSpace":"Đ“Đ¾Ñ€Đ¸Đ·. Đ¾Ñ‚ÑÑ‚ÑƒĐ¿","img2Button":"Đ’Ñ‹ Đ¶ĐµĐ»Đ°ĐµÑ‚Đµ Đ¿Ñ€ĐµĐ¾Đ±Ñ€Đ°Đ·Đ¾Đ²Đ°Ñ‚ÑŒ ÑÑ‚Đ¾ Đ¾Đ±Ñ‹Ñ‡Đ½Đ¾Đµ Đ¸Đ·Đ¾Đ±Ñ€Đ°Đ¶ĐµĐ½Đ¸Đµ Đ² Đ¸Đ·Đ¾Đ±Ñ€Đ°Đ¶ĐµĐ½Đ¸Đµ-ĐºĐ½Đ¾Đ¿ĐºÑƒ?","infoTab":"Đ”Đ°Đ½Đ½Ñ‹Đµ Đ¾Đ± Đ¸Đ·Đ¾Đ±Ñ€Đ°Đ¶ĐµĐ½Đ¸Đ¸","linkTab":"Đ¡ÑÑ‹Đ»ĐºĐ°","lockRatio":"Đ¡Đ¾Ñ…Ñ€Đ°Đ½ÑÑ‚ÑŒ Đ¿Ñ€Đ¾Đ¿Đ¾Ñ€Ñ†Đ¸Đ¸","menu":"Đ¡Đ²Đ¾Đ¹ÑÑ‚Đ²Đ° Đ¸Đ·Đ¾Đ±Ñ€Đ°Đ¶ĐµĐ½Đ¸Ñ","resetSize":"Đ’ĐµÑ€Đ½ÑƒÑ‚ÑŒ Đ¾Đ±Ñ‹Ñ‡Đ½Ñ‹Đµ Ñ€Đ°Đ·Đ¼ĐµÑ€Ñ‹","title":"Đ¡Đ²Đ¾Đ¹ÑÑ‚Đ²Đ° Đ¸Đ·Đ¾Đ±Ñ€Đ°Đ¶ĐµĐ½Đ¸Ñ","titleButton":"Đ¡Đ²Đ¾Đ¹ÑÑ‚Đ²Đ° Đ¸Đ·Đ¾Đ±Ñ€Đ°Đ¶ĐµĐ½Đ¸Ñ-ĐºĐ½Đ¾Đ¿ĐºĐ¸","upload":"Đ—Đ°Đ³Ñ€ÑƒĐ·Đ¸Ñ‚ÑŒ","urlMissing":"Đе ÑƒĐºĐ°Đ·Đ°Đ½Đ° ÑÑÑ‹Đ»ĐºĐ° Đ½Đ° Đ¸Đ·Đ¾Đ±Ñ€Đ°Đ¶ĐµĐ½Đ¸Đµ.","vSpace":"Đ’ĐµÑ€Ñ‚Đ¸Đº. Đ¾Ñ‚ÑÑ‚ÑƒĐ¿","validateBorder":"Đ Đ°Đ·Đ¼ĐµÑ€ Đ³Ñ€Đ°Đ½Đ¸Ñ† Đ´Đ¾Đ»Đ¶ĐµĐ½ Đ±Ñ‹Ñ‚ÑŒ Đ·Đ°Đ´Đ°Đ½ Ñ‡Đ¸ÑĐ»Đ¾Đ¼.","validateHSpace":"Đ“Đ¾Ñ€Đ¸Đ·Đ¾Đ½Ñ‚Đ°Đ»ÑŒĐ½Ñ‹Đ¹ Đ¾Ñ‚ÑÑ‚ÑƒĐ¿ Đ´Đ¾Đ»Đ¶ĐµĐ½ Đ±Ñ‹Ñ‚ÑŒ Đ·Đ°Đ´Đ°Đ½ Ñ‡Đ¸ÑĐ»Đ¾Đ¼.","validateVSpace":"Đ’ĐµÑ€Ñ‚Đ¸ĐºĐ°Đ»ÑŒĐ½Ñ‹Đ¹ Đ¾Ñ‚ÑÑ‚ÑƒĐ¿ Đ´Đ¾Đ»Đ¶ĐµĐ½ Đ±Ñ‹Ñ‚ÑŒ Đ·Đ°Đ´Đ°Đ½ Ñ‡Đ¸ÑĐ»Đ¾Đ¼."},"indent":{"indent":"Đ£Đ²ĐµĐ»Đ¸Ñ‡Đ¸Ñ‚ÑŒ Đ¾Ñ‚ÑÑ‚ÑƒĐ¿","outdent":"Đ£Đ¼ĐµĐ½ÑŒÑˆĐ¸Ñ‚ÑŒ Đ¾Ñ‚ÑÑ‚ÑƒĐ¿"},"fakeobjects":{"anchor":"Đ¯ĐºĐ¾Ñ€ÑŒ","flash":"Flash Đ°Đ½Đ¸Đ¼Đ°Ñ†Đ¸Ñ","hiddenfield":"Đ¡ĐºÑ€Ñ‹Ñ‚Đ¾Đµ Đ¿Đ¾Đ»Đµ","iframe":"iFrame","unknown":"ĐĐµĐ¸Đ·Đ²ĐµÑÑ‚Đ½Ñ‹Đ¹ Đ¾Đ±ÑĐµĐºÑ‚"},"link":{"acccessKey":"ĐĐ»Đ°Đ²Đ¸ÑˆĐ° Đ´Đ¾ÑÑ‚ÑƒĐ¿Đ°","advanced":"Đ”Đ¾Đ¿Đ¾Đ»Đ½Đ¸Ñ‚ĐµĐ»ÑŒĐ½Đ¾","advisoryContentType":"Đ¢Đ¸Đ¿ ÑĐ¾Đ´ĐµÑ€Đ¶Đ¸Đ¼Đ¾Đ³Đ¾","advisoryTitle":"Đ—Đ°Đ³Đ¾Đ»Đ¾Đ²Đ¾Đº","anchor":{"toolbar":"Đ’ÑÑ‚Đ°Đ²Đ¸Ñ‚ÑŒ / Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ ÑĐºĐ¾Ñ€ÑŒ","menu":"Đ˜Đ·Đ¼ĐµĐ½Đ¸Ñ‚ÑŒ ÑĐºĐ¾Ñ€ÑŒ","title":"Đ¡Đ²Đ¾Đ¹ÑÑ‚Đ²Đ° ÑĐºĐ¾Ñ€Ñ","name":"Đ˜Đ¼Ñ ÑĐºĐ¾Ñ€Ñ","errorName":"ĐŸĐ¾Đ¶Đ°Đ»ÑƒĐ¹ÑÑ‚Đ°, Đ²Đ²ĐµĐ´Đ¸Ñ‚Đµ Đ¸Đ¼Ñ ÑĐºĐ¾Ñ€Ñ","remove":"Đ£Đ´Đ°Đ»Đ¸Ñ‚ÑŒ ÑĐºĐ¾Ñ€ÑŒ"},"anchorId":"ĐŸĐ¾ Đ¸Đ´ĐµĐ½Ñ‚Đ¸Ñ„Đ¸ĐºĐ°Ñ‚Đ¾Ñ€Ñƒ","anchorName":"ĐŸĐ¾ Đ¸Đ¼ĐµĐ½Đ¸","charset":"ĐĐ¾Đ´Đ¸Ñ€Đ¾Đ²ĐºĐ° Ñ€ĐµÑурÑĐ°","cssClasses":"ĐлаÑÑÑ‹ CSS","emailAddress":"Email Đ°Đ´Ñ€ĐµÑ","emailBody":"Đ¢ĐµĐºÑÑ‚ ÑĐ¾Đ¾Đ±Ñ‰ĐµĐ½Đ¸Ñ","emailSubject":"Đ¢ĐµĐ¼Đ° ÑĐ¾Đ¾Đ±Ñ‰ĐµĐ½Đ¸Ñ","id":"Đ˜Đ´ĐµĐ½Ñ‚Đ¸Ñ„Đ¸ĐºĐ°Ñ‚Đ¾Ñ€","info":"Đ˜Đ½Ñ„Đ¾Ñ€Đ¼Đ°Ñ†Đ¸Ñ Đ¾ ÑÑÑ‹Đ»ĐºĐµ","langCode":"ĐĐ¾Đ´ ÑĐ·Ñ‹ĐºĐ°","langDir":"ĐĐ°Đ¿Ñ€Đ°Đ²Đ»ĐµĐ½Đ¸Đµ Ñ‚ĐµĐºÑÑ‚Đ°","langDirLTR":"Đ¡Đ»ĐµĐ²Đ° Đ½Đ°Đ¿Ñ€Đ°Đ²Đ¾ (LTR)","langDirRTL":"Đ¡Đ¿Ñ€Đ°Đ²Đ° Đ½Đ°Đ»ĐµĐ²Đ¾ (RTL)","menu":"Đ ĐµĐ´Đ°ĐºÑ‚Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ ÑÑÑ‹Đ»ĐºÑƒ","name":"Đ˜Đ¼Ñ","noAnchors":"(Đ’ Đ´Đ¾ĐºÑƒĐ¼ĐµĐ½Ñ‚Đµ Đ½ĐµÑ‚ Đ½Đ¸ Đ¾Đ´Đ½Đ¾Đ³Đ¾ ÑĐºĐ¾Ñ€Ñ)","noEmail":"ĐŸĐ¾Đ¶Đ°Đ»ÑƒĐ¹ÑÑ‚Đ°, Đ²Đ²ĐµĐ´Đ¸Ñ‚Đµ email Đ°Đ´Ñ€ĐµÑ","noUrl":"ĐŸĐ¾Đ¶Đ°Đ»ÑƒĐ¹ÑÑ‚Đ°, Đ²Đ²ĐµĐ´Đ¸Ñ‚Đµ ÑÑÑ‹Đ»ĐºÑƒ","other":"<Đ´Ñ€ÑƒĐ³Đ¾Đ¹>","popupDependent":"Đ—Đ°Đ²Đ¸ÑĐ¸Đ¼Đ¾Đµ (Netscape)","popupFeatures":"ĐŸĐ°Ñ€Đ°Đ¼ĐµÑ‚Ñ€Ñ‹ Đ²ÑĐ¿Đ»Ñ‹Đ²Đ°ÑÑ‰ĐµĐ³Đ¾ Đ¾ĐºĐ½Đ°","popupFullScreen":"ĐŸĐ¾Đ»Đ½Đ¾ÑĐºÑ€Đ°Đ½Đ½Đ¾Đµ (IE)","popupLeft":"ĐÑ‚ÑÑ‚ÑƒĐ¿ ÑĐ»ĐµĐ²Đ°","popupLocationBar":"ĐŸĐ°Đ½ĐµĐ»ÑŒ Đ°Đ´Ñ€ĐµÑĐ°","popupMenuBar":"ĐŸĐ°Đ½ĐµĐ»ÑŒ Đ¼ĐµĐ½Ñ","popupResizable":"Đ˜Đ·Đ¼ĐµĐ½ÑĐµĐ¼Ñ‹Đ¹ Ñ€Đ°Đ·Đ¼ĐµÑ€","popupScrollBars":"ĐŸĐ¾Đ»Đ¾ÑÑ‹ Đ¿Ñ€Đ¾ĐºÑ€ÑƒÑ‚ĐºĐ¸","popupStatusBar":"Đ¡Ñ‚Ñ€Đ¾ĐºĐ° ÑĐ¾ÑÑ‚Đ¾ÑĐ½Đ¸Ñ","popupToolbar":"ĐŸĐ°Đ½ĐµĐ»ÑŒ Đ¸Đ½ÑÑ‚Ñ€ÑƒĐ¼ĐµĐ½Ñ‚Đ¾Đ²","popupTop":"ĐÑ‚ÑÑ‚ÑƒĐ¿ ÑĐ²ĐµÑ€Ñ…Ñƒ","rel":"ĐÑ‚Đ½Đ¾ÑˆĐµĐ½Đ¸Đµ","selectAnchor":"Đ’Ñ‹Đ±ĐµÑ€Đ¸Ñ‚Đµ ÑĐºĐ¾Ñ€ÑŒ","styles":"Đ¡Ñ‚Đ¸Đ»ÑŒ","tabIndex":"ĐŸĐ¾ÑĐ»ĐµĐ´Đ¾Đ²Đ°Ñ‚ĐµĐ»ÑŒĐ½Đ¾ÑÑ‚ÑŒ Đ¿ĐµÑ€ĐµÑ…Đ¾Đ´Đ°","target":"Đ¦ĐµĐ»ÑŒ","targetFrame":"<Ñ„Ñ€ĐµĐ¹Đ¼>","targetFrameName":"Đ˜Đ¼Ñ Ñ†ĐµĐ»ĐµĐ²Đ¾Đ³Đ¾ Ñ„Ñ€ĐµĐ¹Đ¼Đ°","targetPopup":"<Đ²ÑĐ¿Đ»Ñ‹Đ²Đ°ÑÑ‰ĐµĐµ Đ¾ĐºĐ½Đ¾>","targetPopupName":"Đ˜Đ¼Ñ Đ²ÑĐ¿Đ»Ñ‹Đ²Đ°ÑÑ‰ĐµĐ³Đ¾ Đ¾ĐºĐ½Đ°","title":"Đ¡ÑÑ‹Đ»ĐºĐ°","toAnchor":"Đ¡ÑÑ‹Đ»ĐºĐ° Đ½Đ° ÑĐºĐ¾Ñ€ÑŒ Đ² Ñ‚ĐµĐºÑÑ‚Đµ","toEmail":"Email","toUrl":"Đ¡ÑÑ‹Đ»ĐºĐ°","toolbar":"Đ’ÑÑ‚Đ°Đ²Đ¸Ñ‚ÑŒ/Đ ĐµĐ´Đ°ĐºÑ‚Đ¸Ñ€Đ¾Đ²Đ°Ñ‚ÑŒ ÑÑÑ‹Đ»ĐºÑƒ","type":"Đ¢Đ¸Đ¿ ÑÑÑ‹Đ»ĐºĐ¸","unlink":"Đ£Đ±Ñ€Đ°Ñ‚ÑŒ ÑÑÑ‹Đ»ĐºÑƒ","upload":"Đ—Đ°Đ³Ñ€ÑƒĐ·ĐºĐ°"},"list":{"bulletedlist":"Đ’ÑÑ‚Đ°Đ²Đ¸Ñ‚ÑŒ / ÑƒĐ´Đ°Đ»Đ¸Ñ‚ÑŒ Đ¼Đ°Ñ€ĐºĐ¸Ñ€Đ¾Đ²Đ°Đ½Đ½Ñ‹Đ¹ ÑĐ¿Đ¸ÑĐ¾Đº","numberedlist":"Đ’ÑÑ‚Đ°Đ²Đ¸Ñ‚ÑŒ / ÑƒĐ´Đ°Đ»Đ¸Ñ‚ÑŒ Đ½ÑƒĐ¼ĐµÑ€Đ¾Đ²Đ°Đ½Đ½Ñ‹Đ¹ ÑĐ¿Đ¸ÑĐ¾Đº"},"magicline":{"title":"Đ’ÑÑ‚Đ°Đ²Đ¸Ñ‚ÑŒ здеÑÑŒ Đ¿Đ°Ñ€Đ°Đ³Ñ€Đ°Ñ„"},"maximize":{"maximize":"Đ Đ°Đ·Đ²ĐµÑ€Đ½ÑƒÑ‚ÑŒ","minimize":"Đ¡Đ²ĐµÑ€Đ½ÑƒÑ‚ÑŒ"},"pastetext":{"button":"Đ’ÑÑ‚Đ°Đ²Đ¸Ñ‚ÑŒ Ñ‚Đ¾Đ»ÑŒĐºĐ¾ Ñ‚ĐµĐºÑÑ‚","title":"Đ’ÑÑ‚Đ°Đ²Đ¸Ñ‚ÑŒ Ñ‚Đ¾Đ»ÑŒĐºĐ¾ Ñ‚ĐµĐºÑÑ‚"},"pastefromword":{"confirmCleanup":"Đ¢ĐµĐºÑÑ‚, ĐºĐ¾Ñ‚Đ¾Ñ€Ñ‹Đ¹ Đ²Ñ‹ Đ¶ĐµĐ»Đ°ĐµÑ‚Đµ Đ²ÑÑ‚Đ°Đ²Đ¸Ñ‚ÑŒ, Đ¿Đ¾ Đ²ÑĐµĐ¹ Đ²Đ¸Đ´Đ¸Đ¼Đ¾ÑÑ‚Đ¸, Đ±Ñ‹Đ» ÑĐºĐ¾Đ¿Đ¸Ñ€Đ¾Đ²Đ°Đ½ из Word. Đ¡Đ»ĐµĐ´ÑƒĐµÑ‚ ли Đ¾Ñ‡Đ¸ÑÑ‚Đ¸Ñ‚ÑŒ ĐµĐ³Đ¾ Đ¿ĐµÑ€ĐµĐ´ Đ²ÑÑ‚Đ°Đ²ĐºĐ¾Đ¹?","error":"ĐĐµĐ²Đ¾Đ·Đ¼Đ¾Đ¶Đ½Đ¾ Đ¾Ñ‡Đ¸ÑÑ‚Đ¸Ñ‚ÑŒ Đ²ÑÑ‚Đ°Đ²Đ»ĐµĐ½Đ½Ñ‹Đµ Đ´Đ°Đ½Đ½Ñ‹Đµ из-Đ·Đ° Đ²Đ½ÑƒÑ‚Ñ€ĐµĐ½Đ½ĐµĐ¹ Đ¾ÑˆĐ¸Đ±ĐºĐ¸","title":"Đ’ÑÑ‚Đ°Đ²Đ¸Ñ‚ÑŒ из Word","toolbar":"Đ’ÑÑ‚Đ°Đ²Đ¸Ñ‚ÑŒ из Word"},"removeformat":{"toolbar":"Đ£Đ±Ñ€Đ°Ñ‚ÑŒ Ñ„Đ¾Ñ€Đ¼Đ°Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Đ½Đ¸Đµ"},"sourcearea":{"toolbar":"Đ˜ÑÑ‚Đ¾Ñ‡Đ½Đ¸Đº"},"specialchar":{"options":"Đ’Ñ‹Đ±Đ¾Ñ€ ÑĐ¿ĐµÑ†Đ¸Đ°Đ»ÑŒĐ½Đ¾Đ³Đ¾ ÑĐ¸Đ¼Đ²Đ¾Đ»Đ°","title":"Đ’Ñ‹Đ±ĐµÑ€Đ¸Ñ‚Đµ ÑĐ¿ĐµÑ†Đ¸Đ°Đ»ÑŒĐ½Ñ‹Đ¹ ÑĐ¸Đ¼Đ²Đ¾Đ»","toolbar":"Đ’ÑÑ‚Đ°Đ²Đ¸Ñ‚ÑŒ ÑĐ¿ĐµÑ†Đ¸Đ°Đ»ÑŒĐ½Ñ‹Đ¹ ÑĐ¸Đ¼Đ²Đ¾Đ»"},"scayt":{"btn_about":"Đ SCAYT","btn_dictionaries":"Đ¡Đ»Đ¾Đ²Đ°Ñ€Đ¸","btn_disable":"ĐÑ‚ĐºĐ»ÑÑ‡Đ¸Ñ‚ÑŒ SCAYT","btn_enable":"Đ’ĐºĐ»ÑÑ‡Đ¸Ñ‚ÑŒ SCAYT","btn_langs":"Đ¯Đ·Ñ‹ĐºĐ¸","btn_options":"ĐĐ°ÑÑ‚Ñ€Đ¾Đ¹ĐºĐ¸","text_title":"ĐŸÑ€Đ¾Đ²ĐµÑ€ĐºĐ° Đ¾Ñ€Ñ„Đ¾Đ³Ñ€Đ°Ñ„Đ¸Đ¸ Đ¿Đ¾ Đ¼ĐµÑ€Đµ Đ²Đ²Đ¾Đ´Đ° (SCAYT)"},"stylescombo":{"label":"Đ¡Ñ‚Đ¸Đ»Đ¸","panelTitle":"Đ¡Ñ‚Đ¸Đ»Đ¸ Ñ„Đ¾Ñ€Đ¼Đ°Ñ‚Đ¸Ñ€Đ¾Đ²Đ°Đ½Đ¸Ñ","panelTitle1":"Đ¡Ñ‚Đ¸Đ»Đ¸ Đ±Đ»Đ¾ĐºĐ°","panelTitle2":"Đ¡Ñ‚Đ¸Đ»Đ¸ ÑĐ»ĐµĐ¼ĐµĐ½Ñ‚Đ°","panelTitle3":"Đ¡Ñ‚Đ¸Đ»Đ¸ Đ¾Đ±ÑĐµĐºÑ‚Đ°"},"table":{"border":"Đ Đ°Đ·Đ¼ĐµÑ€ Đ³Ñ€Đ°Đ½Đ¸Ñ†","caption":"Đ—Đ°Đ³Đ¾Đ»Đ¾Đ²Đ¾Đº","cell":{"menu":"Đ¯Ñ‡ĐµĐ¹ĐºĐ°","insertBefore":"Đ’ÑÑ‚Đ°Đ²Đ¸Ñ‚ÑŒ ÑÑ‡ĐµĐ¹ĐºÑƒ ÑĐ»ĐµĐ²Đ°","insertAfter":"Đ’ÑÑ‚Đ°Đ²Đ¸Ñ‚ÑŒ ÑÑ‡ĐµĐ¹ĐºÑƒ ÑĐ¿Ñ€Đ°Đ²Đ°","deleteCell":"Đ£Đ´Đ°Đ»Đ¸Ñ‚ÑŒ ÑÑ‡ĐµĐ¹ĐºĐ¸","merge":"ĐбÑĐµĐ´Đ¸Đ½Đ¸Ñ‚ÑŒ ÑÑ‡ĐµĐ¹ĐºĐ¸","mergeRight":"ĐбÑĐµĐ´Đ¸Đ½Đ¸Ñ‚ÑŒ Ñ Đ¿Ñ€Đ°Đ²Đ¾Đ¹","mergeDown":"ĐбÑĐµĐ´Đ¸Đ½Đ¸Ñ‚ÑŒ Ñ Đ½Đ¸Đ¶Đ½ĐµĐ¹","splitHorizontal":"Đ Đ°Đ·Đ´ĐµĐ»Đ¸Ñ‚ÑŒ ÑÑ‡ĐµĐ¹ĐºÑƒ Đ¿Đ¾ Đ³Đ¾Ñ€Đ¸Đ·Đ¾Đ½Ñ‚Đ°Đ»Đ¸","splitVertical":"Đ Đ°Đ·Đ´ĐµĐ»Đ¸Ñ‚ÑŒ ÑÑ‡ĐµĐ¹ĐºÑƒ Đ¿Đ¾ Đ²ĐµÑ€Ñ‚Đ¸ĐºĐ°Đ»Đ¸","title":"Đ¡Đ²Đ¾Đ¹ÑÑ‚Đ²Đ° ÑÑ‡ĐµĐ¹ĐºĐ¸","cellType":"Đ¢Đ¸Đ¿ ÑÑ‡ĐµĐ¹ĐºĐ¸","rowSpan":"ĐбÑĐµĐ´Đ¸Đ½ÑĐµÑ‚ ÑÑ‚Ñ€Đ¾Đº","colSpan":"ĐбÑĐµĐ´Đ¸Đ½ÑĐµÑ‚ ĐºĐ¾Đ»Đ¾Đ½Đ¾Đº","wordWrap":"ĐŸĐµÑ€ĐµĐ½Đ¾Ñ Đ¿Đ¾ ÑĐ»Đ¾Đ²Đ°Đ¼","hAlign":"Đ“Đ¾Ñ€Đ¸Đ·Đ¾Đ½Ñ‚Đ°Đ»ÑŒĐ½Đ¾Đµ Đ²Ñ‹Ñ€Đ°Đ²Đ½Đ¸Đ²Đ°Đ½Đ¸Đµ","vAlign":"Đ’ĐµÑ€Ñ‚Đ¸ĐºĐ°Đ»ÑŒĐ½Đ¾Đµ Đ²Ñ‹Ñ€Đ°Đ²Đ½Đ¸Đ²Đ°Đ½Đ¸Đµ","alignBaseline":"ĐŸĐ¾ Đ±Đ°Đ·Đ¾Đ²Đ¾Đ¹ Đ»Đ¸Đ½Đ¸Đ¸","bgColor":"Đ¦Đ²ĐµÑ‚ Ñ„Đ¾Đ½Đ°","borderColor":"Đ¦Đ²ĐµÑ‚ Đ³Ñ€Đ°Đ½Đ¸Ñ†","data":"Đ”Đ°Đ½Đ½Ñ‹Đµ","header":"Đ—Đ°Đ³Đ¾Đ»Đ¾Đ²Đ¾Đº","yes":"Да","no":"ĐĐµÑ‚","invalidWidth":"Đ¨Đ¸Ñ€Đ¸Đ½Đ° ÑÑ‡ĐµĐ¹ĐºĐ¸ Đ´Đ¾Đ»Đ¶Đ½Đ° Đ±Ñ‹Ñ‚ÑŒ Ñ‡Đ¸ÑĐ»Đ¾Đ¼.","invalidHeight":"Đ’Ñ‹ÑĐ¾Ñ‚Đ° ÑÑ‡ĐµĐ¹ĐºĐ¸ Đ´Đ¾Đ»Đ¶Đ½Đ° Đ±Ñ‹Ñ‚ÑŒ Ñ‡Đ¸ÑĐ»Đ¾Đ¼.","invalidRowSpan":"ĐĐ¾Đ»Đ¸Ñ‡ĐµÑÑ‚Đ²Đ¾ Đ¾Đ±ÑĐµĐ´Đ¸Đ½ÑĐµĐ¼Ñ‹Ñ… ÑÑ‚Ñ€Đ¾Đº Đ´Đ¾Đ»Đ¶Đ½Đ¾ Đ±Ñ‹Ñ‚ÑŒ Đ·Đ°Đ´Đ°Đ½Đ¾ Ñ‡Đ¸ÑĐ»Đ¾Đ¼.","invalidColSpan":"ĐĐ¾Đ»Đ¸Ñ‡ĐµÑÑ‚Đ²Đ¾ Đ¾Đ±ÑĐµĐ´Đ¸Đ½ÑĐµĐ¼Ñ‹Ñ… ĐºĐ¾Đ»Đ¾Đ½Đ¾Đº Đ´Đ¾Đ»Đ¶Đ½Đ¾ Đ±Ñ‹Ñ‚ÑŒ Đ·Đ°Đ´Đ°Đ½Đ¾ Ñ‡Đ¸ÑĐ»Đ¾Đ¼.","chooseColor":"Đ’Ñ‹Đ±ĐµÑ€Đ¸Ñ‚Đµ"},"cellPad":"Đ’Đ½ÑƒÑ‚Ñ€ĐµĐ½Đ½Đ¸Đ¹ Đ¾Ñ‚ÑÑ‚ÑƒĐ¿ ÑÑ‡ĐµĐµĐº","cellSpace":"Đ’Đ½ĐµÑˆĐ½Đ¸Đ¹ Đ¾Ñ‚ÑÑ‚ÑƒĐ¿ ÑÑ‡ĐµĐµĐº","column":{"menu":"ĐĐ¾Đ»Đ¾Đ½ĐºĐ°","insertBefore":"Đ’ÑÑ‚Đ°Đ²Đ¸Ñ‚ÑŒ ĐºĐ¾Đ»Đ¾Đ½ĐºÑƒ ÑĐ»ĐµĐ²Đ°","insertAfter":"Đ’ÑÑ‚Đ°Đ²Đ¸Ñ‚ÑŒ ĐºĐ¾Đ»Đ¾Đ½ĐºÑƒ ÑĐ¿Ñ€Đ°Đ²Đ°","deleteColumn":"Đ£Đ´Đ°Đ»Đ¸Ñ‚ÑŒ ĐºĐ¾Đ»Đ¾Đ½ĐºĐ¸"},"columns":"ĐĐ¾Đ»Đ¾Đ½ĐºĐ¸","deleteTable":"Đ£Đ´Đ°Đ»Đ¸Ñ‚ÑŒ Ñ‚Đ°Đ±Đ»Đ¸Ñ†Ñƒ","headers":"Đ—Đ°Đ³Đ¾Đ»Đ¾Đ²ĐºĐ¸","headersBoth":"Đ¡Đ²ĐµÑ€Ñ…Ñƒ и ÑĐ»ĐµĐ²Đ°","headersColumn":"Đ›ĐµĐ²Đ°Ñ ĐºĐ¾Đ»Đ¾Đ½ĐºĐ°","headersNone":"Без Đ·Đ°Đ³Đ¾Đ»Đ¾Đ²ĐºĐ¾Đ²","headersRow":"Đ’ĐµÑ€Ñ…Đ½ÑÑ ÑÑ‚Ñ€Đ¾ĐºĐ°","invalidBorder":"Đ Đ°Đ·Đ¼ĐµÑ€ Đ³Ñ€Đ°Đ½Đ¸Ñ† Đ´Đ¾Đ»Đ¶ĐµĐ½ Đ±Ñ‹Ñ‚ÑŒ Ñ‡Đ¸ÑĐ»Đ¾Đ¼.","invalidCellPadding":"Đ’Đ½ÑƒÑ‚Ñ€ĐµĐ½Đ½Đ¸Đ¹ Đ¾Ñ‚ÑÑ‚ÑƒĐ¿ ÑÑ‡ĐµĐµĐº (cellpadding) Đ´Đ¾Đ»Đ¶ĐµĐ½ Đ±Ñ‹Ñ‚ÑŒ Ñ‡Đ¸ÑĐ»Đ¾Đ¼.","invalidCellSpacing":"Đ’Đ½ĐµÑˆĐ½Đ¸Đ¹ Đ¾Ñ‚ÑÑ‚ÑƒĐ¿ ÑÑ‡ĐµĐµĐº (cellspacing) Đ´Đ¾Đ»Đ¶ĐµĐ½ Đ±Ñ‹Ñ‚ÑŒ Ñ‡Đ¸ÑĐ»Đ¾Đ¼.","invalidCols":"ĐĐ¾Đ»Đ¸Ñ‡ĐµÑÑ‚Đ²Đ¾ ÑÑ‚Đ¾Đ»Đ±Ñ†Đ¾Đ² Đ´Đ¾Đ»Đ¶Đ½Đ¾ Đ±Ñ‹Ñ‚ÑŒ Đ±Đ¾Đ»ÑŒÑˆĐµ 0.","invalidHeight":"Đ’Ñ‹ÑĐ¾Ñ‚Đ° Ñ‚Đ°Đ±Đ»Đ¸Ñ†Ñ‹ Đ´Đ¾Đ»Đ¶Đ½Đ° Đ±Ñ‹Ñ‚ÑŒ Ñ‡Đ¸ÑĐ»Đ¾Đ¼.","invalidRows":"ĐĐ¾Đ»Đ¸Ñ‡ĐµÑÑ‚Đ²Đ¾ ÑÑ‚Ñ€Đ¾Đº Đ´Đ¾Đ»Đ¶Đ½Đ¾ Đ±Ñ‹Ñ‚ÑŒ Đ±Đ¾Đ»ÑŒÑˆĐµ 0.","invalidWidth":"Đ¨Đ¸Ñ€Đ¸Đ½Đ° Ñ‚Đ°Đ±Đ»Đ¸Ñ†Ñ‹ Đ´Đ¾Đ»Đ¶Đ½Đ° Đ±Ñ‹Ñ‚ÑŒ Ñ‡Đ¸ÑĐ»Đ¾Đ¼.","menu":"Đ¡Đ²Đ¾Đ¹ÑÑ‚Đ²Đ° Ñ‚Đ°Đ±Đ»Đ¸Ñ†Ñ‹","row":{"menu":"Đ¡Ñ‚Ñ€Đ¾ĐºĐ°","insertBefore":"Đ’ÑÑ‚Đ°Đ²Đ¸Ñ‚ÑŒ ÑÑ‚Ñ€Đ¾ĐºÑƒ ÑĐ²ĐµÑ€Ñ…Ñƒ","insertAfter":"Đ’ÑÑ‚Đ°Đ²Đ¸Ñ‚ÑŒ ÑÑ‚Ñ€Đ¾ĐºÑƒ ÑĐ½Đ¸Đ·Ñƒ","deleteRow":"Đ£Đ´Đ°Đ»Đ¸Ñ‚ÑŒ ÑÑ‚Ñ€Đ¾ĐºĐ¸"},"rows":"Đ¡Ñ‚Ñ€Đ¾ĐºĐ¸","summary":"Đ˜Ñ‚Đ¾Đ³Đ¸","title":"Đ¡Đ²Đ¾Đ¹ÑÑ‚Đ²Đ° Ñ‚Đ°Đ±Đ»Đ¸Ñ†Ñ‹","toolbar":"Đ¢Đ°Đ±Đ»Đ¸Ñ†Đ°","widthPc":"Đ¿Ñ€Đ¾Ñ†ĐµĐ½Ñ‚Đ¾Đ²","widthPx":"Đ¿Đ¸ĐºÑĐµĐ»ĐµĐ¹","widthUnit":"ĐµĐ´Đ¸Đ½Đ¸Ñ†Đ° Đ¸Đ·Đ¼ĐµÑ€ĐµĐ½Đ¸Ñ"},"undo":{"redo":"ĐŸĐ¾Đ²Ñ‚Đ¾Ñ€Đ¸Ñ‚ÑŒ","undo":"ĐÑ‚Đ¼ĐµĐ½Đ¸Ñ‚ÑŒ"},"wsc":{"btnIgnore":"ĐŸÑ€Đ¾Đ¿ÑƒÑÑ‚Đ¸Ñ‚ÑŒ","btnIgnoreAll":"ĐŸÑ€Đ¾Đ¿ÑƒÑÑ‚Đ¸Ñ‚ÑŒ Đ²ÑÑ‘","btnReplace":"Đ—Đ°Đ¼ĐµĐ½Đ¸Ñ‚ÑŒ","btnReplaceAll":"Đ—Đ°Đ¼ĐµĐ½Đ¸Ñ‚ÑŒ Đ²ÑÑ‘","btnUndo":"ĐÑ‚Đ¼ĐµĐ½Đ¸Ñ‚ÑŒ","changeTo":"Đ˜Đ·Đ¼ĐµĐ½Đ¸Ñ‚ÑŒ Đ½Đ°","errorLoading":"ĐŸÑ€Đ¾Đ¸Đ·Đ¾ÑˆĐ»Đ° Đ¾ÑˆĐ¸Đ±ĐºĐ° Đ¿Ñ€Đ¸ Đ¿Đ¾Đ´ĐºĐ»ÑÑ‡ĐµĐ½Đ¸Đ¸ Đº ÑĐµÑ€Đ²ĐµÑ€Ñƒ Đ¿Ñ€Đ¾Đ²ĐµÑ€ĐºĐ¸ Đ¾Ñ€Ñ„Đ¾Đ³Ñ€Đ°Ñ„Đ¸Đ¸: %s.","ieSpellDownload":"ĐœĐ¾Đ´ÑƒĐ»ÑŒ Đ¿Ñ€Đ¾Đ²ĐµÑ€ĐºĐ¸ Đ¾Ñ€Ñ„Đ¾Đ³Ñ€Đ°Ñ„Đ¸Đ¸ Đ½Đµ уÑÑ‚Đ°Đ½Đ¾Đ²Đ»ĐµĐ½. Đ¥Đ¾Ñ‚Đ¸Ñ‚Đµ ÑĐºĐ°Ñ‡Đ°Ñ‚ÑŒ ĐµĐ³Đ¾?","manyChanges":"ĐŸÑ€Đ¾Đ²ĐµÑ€ĐºĐ° Đ¾Ñ€Ñ„Đ¾Đ³Ñ€Đ°Ñ„Đ¸Đ¸ Đ·Đ°Đ²ĐµÑ€ÑˆĐµĐ½Đ°. Đ˜Đ·Đ¼ĐµĐ½ĐµĐ½Đ¾ ÑĐ»Đ¾Đ²: %1","noChanges":"ĐŸÑ€Đ¾Đ²ĐµÑ€ĐºĐ° Đ¾Ñ€Ñ„Đ¾Đ³Ñ€Đ°Ñ„Đ¸Đ¸ Đ·Đ°Đ²ĐµÑ€ÑˆĐµĐ½Đ°. Đе Đ¸Đ·Đ¼ĐµĐ½ĐµĐ½Đ¾ Đ½Đ¸ Đ¾Đ´Đ½Đ¾Đ³Đ¾ ÑĐ»Đ¾Đ²Đ°","noMispell":"ĐŸÑ€Đ¾Đ²ĐµÑ€ĐºĐ° Đ¾Ñ€Ñ„Đ¾Đ³Ñ€Đ°Ñ„Đ¸Đ¸ Đ·Đ°Đ²ĐµÑ€ÑˆĐµĐ½Đ°. ĐÑˆĐ¸Đ±Đ¾Đº Đ½Đµ Đ½Đ°Đ¹Đ´ĐµĐ½Đ¾","noSuggestions":"- Đ’Đ°Ñ€Đ¸Đ°Đ½Ñ‚Ñ‹ Đ¾Ñ‚ÑутÑÑ‚Đ²ÑƒÑÑ‚ -","notAvailable":"Đ˜Đ·Đ²Đ¸Đ½Đ¸Ñ‚Đµ, Đ½Đ¾ Đ² Đ´Đ°Đ½Đ½Ñ‹Đ¹ Đ¼Đ¾Đ¼ĐµĐ½Ñ‚ ÑĐµÑ€Đ²Đ¸Ñ Đ½ĐµĐ´Đ¾ÑÑ‚ÑƒĐ¿ĐµĐ½.","notInDic":"ĐÑ‚ÑутÑÑ‚Đ²ÑƒĐµÑ‚ Đ² ÑĐ»Đ¾Đ²Đ°Ñ€Đµ","oneChange":"ĐŸÑ€Đ¾Đ²ĐµÑ€ĐºĐ° Đ¾Ñ€Ñ„Đ¾Đ³Ñ€Đ°Ñ„Đ¸Đ¸ Đ·Đ°Đ²ĐµÑ€ÑˆĐµĐ½Đ°. Đ˜Đ·Đ¼ĐµĐ½ĐµĐ½Đ¾ Đ¾Đ´Đ½Đ¾ ÑĐ»Đ¾Đ²Đ¾","progress":"ĐÑ€Ñ„Đ¾Đ³Ñ€Đ°Ñ„Đ¸Ñ Đ¿Ñ€Đ¾Đ²ĐµÑ€ÑĐµÑ‚ÑÑ...","title":"ĐŸÑ€Đ¾Đ²ĐµÑ€ĐºĐ° Đ¾Ñ€Ñ„Đ¾Đ³Ñ€Đ°Ñ„Đ¸Đ¸","toolbar":"ĐŸÑ€Đ¾Đ²ĐµÑ€Đ¸Ñ‚ÑŒ Đ¾Ñ€Ñ„Đ¾Đ³Ñ€Đ°Ñ„Đ¸Ñ"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/si.js b/js/ckeditor/lang/si.js
new file mode 100644
index 0000000..3412490
--- /dev/null
+++ b/js/ckeditor/lang/si.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['si']={"editor":"පොහොසත෠වචන සංසà·à¶à¶»à¶«","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"උදව෠ලබ෠ගà·à¶±à·“මට ALT බොතà·à¶­à¶¸ ඔබනà·à¶±","browseServer":"සෙවුම෠සà·à·€à·à¶¯à·à¶ºà¶à¶º","url":"URL","protocol":"මුලà·à¶´à¶­à·â€à¶»à¶º","upload":"උඩුගතà¶à·’රීම","uploadSubmit":"à·ƒà·à·€à·à¶¯à·à¶ºà¶à¶º වෙත යොමුà¶à·’රිම","image":"රුපය","flash":"දීපà·à¶­à·’ය","form":"පà·à¶»à¶¸à¶º","checkbox":"ලà¶à·”ණුà¶à·’රීම෠à¶à·œà¶§à·”à·€","radio":"තà·à¶»à·“ම෠","textField":"ලියන පà·â€à¶»à¶¯à·à·à¶º","textarea":"අà¶à·”රු ","hiddenField":"à·ƒà·à¶Ÿà·€à·”ණු පà·â€à¶»à¶¯à·à·à¶º","button":"බොතà·à¶­à¶¸","select":"තà·à¶»à¶±à·à¶± ","imageButton":"රුප ","notSet":"<යොද෠>","id":"අංà¶à¶º","name":"නම","langDir":"භà·à·‚෠දිà·à·à·€","langDirLtr":"වමà·à·ƒà·’ට දà¶à·”ණුට","langDirRtl":"දà¶à·”ණ෠සිට වමට","langCode":"භà·à·‚à· à¶à·à¶­à¶º","longDescr":"සමà·à¶´à·”රà·à¶± පà·à·„à·à¶¯à·’ලි à¶à·’රීම","cssClass":"විලà·à· පතà·â€à¶» පනà·à¶­à·’ය","advisoryTitle":"උපදෙස෠","cssStyle":"විලà·à·ƒà¶º","ok":"නිරදි","cancel":"අවලංගු à¶à·’රීම","close":"à·€à·à·ƒà·“ම","preview":"නà·à·€à¶­ ","resize":"විà·à·à¶½à¶­à·à·€à¶º නà·à·€à¶­ වෙනස෠à¶à·’රීම","generalTab":"පොදු à¶à¶»à·”ණු.","advancedTab":"දීය","validateNumberFailed":"මෙම වටිනà·à¶à¶¸ අංà¶à¶ºà¶à· නොවà·","confirmNewPage":"ආරà¶à·à·‚෠නොà¶à·… සියලුම දතà·à¶­à¶ºà¶±à· මà·à¶à·’යනුලà·à¶¶à·. ඔබට නව පිටුවà¶à· ලබ෠ගà·à¶±à·“මට අවà·à·â€à¶ºà¶¯?","confirmCancel":"ඇතම෠විà¶à¶½à·à¶´à¶ºà¶±à· වෙනස෠à¶à¶» ඇත. ඔබට මින෠නිà¶à·à¶¸à·“මට අවà·à·â€à¶ºà¶¯?","options":" විà¶à¶½à·à¶´","target":"අරමුණ","targetNew":"නව à¶à·€à·à·…ුව","targetTop":"à·€à·à¶¯à¶œà¶­à· à¶à·€à·à·…ුව","targetSelf":"එම à¶à·€à·à·…ුව(_තම\\\\)","targetParent":"මව෠à¶à·€à·à·…ුව(_)","langDirLTR":"වමà·à·ƒà·’ට දà¶à·”ණුට","langDirRTL":"දà¶à·”ණ෠සිට වමට","styles":"විලà·à·ƒà¶º","cssClasses":"විලà·à·ƒà¶´à¶­à·â€à¶» පනà·à¶­à·’ය","width":"පළල","height":"උස","align":"ගà·à¶½à¶´à·”ම","alignLeft":"වම","alignRight":"දà¶à·”ණ","alignCenter":"මධà·â€à¶º","alignJustify":"Justify","alignTop":"ඉ","alignMiddle":"මà·à¶¯","alignBottom":"පහල","alignNone":"None","invalidValue":"à·€à·à¶»à¶¯à·“ වටිනà·à¶à¶¸à¶à·’","invalidHeight":"උස අංà¶à¶ºà¶à· විය යුතුය","invalidWidth":"පළල අංà¶à¶ºà¶à· විය යුතුය","invalidCssLength":"වටිනà·à¶à¶¸à¶à· නිරූපණය à¶à·’රීම \"%1\" පà·â€à¶»à¶¯à·à·à¶º ධන සංà¶à·â€à¶ºà·à¶­à·à¶¸à¶ වටිනà·à¶à¶¸à¶à· හ෠නිවරදි නොවන CSS මිනුම෠එà¶à¶(px, %, in, cm, mm, em, ex, pt, pc)","invalidHtmlLength":"වටිනà·à¶à¶¸à¶à· නිරූපණය à¶à·’රීම \"%1\" පà·â€à¶»à¶¯à·à·à¶º ධන සංà¶à·â€à¶ºà·à¶­à·à¶¸à¶ වටිනà·à¶à¶¸à¶à· හ෠නිවරදි නොවන HTML මිනුම෠එà¶à¶ (px à·„à· %).","invalidInlineStyle":"වටිනà·à¶à¶¸à¶à· නිරූපණය à¶à·’රීම පà·à·…à·’ විලà·à·ƒà¶ºà¶ºà¶§ ආà¶à·˜à¶­à·’ය අනතරà·à¶œ විය යුතය \"නම : වටිනà·à¶à¶¸\", තිත෠à¶à·œà¶¸à·à·€à¶à·’න෠වෙන෠වෙන ලද.","cssLengthTooltip":"සංà¶à·â€à¶ºà· ඇතුලත෠à¶à·’රීමà·à¶¯à·“ වටිනà·à¶à¶¸ තිත෠පà·â€à¶»à¶¸à·à¶«à¶º නිවරදි CSS ඒà¶à¶(තිතà·, %, අඟලà·,සෙමි, mm, em, ex, pt, pc)","unavailable":"%1<span පනà·à¶­à·’ය=\"ළඟ෠වියහà·à¶à·’ ද බලනà·à¶±\">, නොමà·à¶­à·’නමà·</span>"},"about":{"copy":"පිටපත෠අයිතිය සහ පිටපත෠à¶à·’රීම;$1 .සියලුම හිමිà¶à¶¸à· ඇවිරිණි.","dlgTitle":"CKEditor ගà·à¶± විසà·à¶­à¶»","help":"උදව෠සඳහ෠$1 ","moreInfo":"බලපතà·â€à¶» තොරතුරු සදහ෠à¶à¶»à·”ණà·à¶à¶» අපග෠විදà·â€à¶ºà·”ත෠ලිපිනයට පිවිසෙනà·à¶±:","title":"CKEditor ගà·à¶± විසà·à¶­à¶»","userGuide":"CKEditor භà·à·€à·’ත෠à¶à·’රීම පිළිබඳ "},"basicstyles":{"bold":"තද අà¶à·”රින෠ලියනලද","italic":"බà·à¶°à·“අà¶à·”රින෠ලියන ලද","strike":"Strikethrough","subscript":"Subscript","superscript":"Superscript","underline":"යටින෠ඉරි අදින ලද"},"blockquote":{"toolbar":"උදà·à¶°à·˜à¶­ à¶à·œà¶§à·ƒ"},"clipboard":{"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":"à¶à¶´à·à¶œà¶±à·à¶±","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":"අලවනà·à¶±","pasteArea":"අලවන පà·â€à¶»à¶¯à·à·","pasteMsg":"Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK","securityMsg":"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.","title":"අලවනà·à¶±"},"contextmenu":{"options":"අනතරà·à¶œ ලà·à¶›à¶« විà¶à¶½à·à¶´"},"button":{"selectedLabel":"%1 (Selected)"},"toolbar":{"toolbarCollapse":"මෙවලම෠තීරුව à·„à·à¶à·”ලුම.","toolbarExpand":"මෙවලම෠තීරුව දීගහà·à¶»à·”ම","toolbarGroups":{"document":"ලිපිය","clipboard":"ඇමිණුම වෙනස෠à¶à·’රීම","editing":"සංසà·à¶à¶»à¶«à¶º","forms":"පà·à¶»à¶¸à¶º","basicstyles":"මුලිචවිලà·à·ƒà¶º","paragraph":"චà·à¶¯à¶º","links":"සබà·à¶³à·’ය","insert":"ඇතුලත෠à¶à·’රීම","styles":"විලà·à·ƒà¶º","colors":"වරà·à¶«à¶º","tools":"මෙවලමà·"},"toolbars":"සංසà·à¶à¶»à¶« මෙවලම෠තීරුව"},"elementspath":{"eleLabel":"මුලදà·â€à¶»à·€à·â€à¶º මà·à¶»à·à¶œà¶º","eleTitle":"%1 මුල"},"format":{"label":"ආà¶à·˜à¶­à·’ය","panelTitle":"චà·à¶¯à¶ºà· ","tag_address":"ලිපිනය","tag_div":"à·ƒà·à¶¸à·à¶±à·â€à¶º(DIV)","tag_h1":"à·à·“රà·à·‚ය 1","tag_h2":"à·à·“රà·à·‚ය 2","tag_h3":"à·à·“රà·à·‚ය 3","tag_h4":"à·à·“රà·à·‚ය 4","tag_h5":"à·à·“රà·à·‚ය 5","tag_h6":"à·à·“රà·à·‚ය 6","tag_p":"à·ƒà·à¶¸à·à¶±à·â€à¶º","tag_pre":"ආà¶à·˜à¶­à·’යනà·"},"horizontalrule":{"toolbar":"තිරස෠රà·à¶›à·à·€à¶à· ඇතුලත෠à¶à¶»à¶±à·à¶±"},"image":{"alertUrl":"à¶à¶»à·”ණà·à¶à¶» රුපය෠URL ලියනà·à¶±","alt":"විà¶à¶½à·à¶´ ","border":"සීමà·à·€à·€à¶½ ","btnUpload":"à·ƒà·à·€à·à¶¯à·à¶ºà¶à¶º වෙත යොමුà¶à·’රිම","button2Img":"ඔබට තà·à¶»à¶± ලද රුපය පරිවරà·à¶­à¶±à¶º à¶à·’රීමට අවà·à·â€à¶ºà¶¯?","hSpace":"HSpace","img2Button":"ඔබට තà·à¶»à¶± ලද රුපය පරිවරà·à¶­à¶±à¶º à¶à·’රීමට අවà·à·â€à¶ºà¶¯?","infoTab":"රුපය෠තොරතුරු","linkTab":"සබà·à¶³à·’ය","lockRatio":"නවතන අනුපà·à¶­à¶º ","menu":"රුපය෠ගුණ","resetSize":"නà·à·€à¶­à¶­à· විà·à·à¶½à¶­à·à·€à¶º වෙනස෠à¶à·’රීම","title":"රුපය෠","titleButton":"රුප බොතà·à¶­à¶¸à· ගුණ","upload":"උඩුගතà¶à·’රීම","urlMissing":"රුප මුලà·à·à·â€à¶» URL නà·à¶­.","vSpace":"VSpace","validateBorder":"මà·à¶‰à¶¸à· සමà·à¶´à·”රà·à¶« සංà¶à·â€à¶ºà·à·€à¶à· විය යුතුය.","validateHSpace":"HSpace සමà·à¶´à·”රà·à¶« සංà¶à·â€à¶ºà·à·€à¶à· විය යුතුය","validateVSpace":"VSpace සමà·à¶´à·”රà·à¶« සංà¶à·â€à¶ºà·à·€à¶à· විය යුතුය."},"indent":{"indent":"අතර පරතරය à·€à·à¶©à·’à¶à¶»à¶±à·à¶±","outdent":"අතර පරතරය අඩුà¶à¶»à¶±à·à¶±"},"fakeobjects":{"anchor":"ආධà·à¶»à¶º","flash":"Flash Animation","hiddenfield":"à·ƒà·à¶Ÿà·€à·”ණු පà·â€à¶»à¶¯à·à·à¶º","iframe":"IFrame","unknown":"Unknown Object"},"link":{"acccessKey":"පà·â€à¶»à·€à·à· යතුර","advanced":"දීය","advisoryContentType":"උපදà·à·à·à¶­à·à¶¸à¶ අනà·à¶­à¶»à·à¶œà¶­ ආà¶à·à¶»à¶º","advisoryTitle":"උපදà·à·à·à¶­à·à¶¸à¶ නà·à¶¸à¶º","anchor":{"toolbar":"ආධà·à¶»à¶º","menu":"ආධà·à¶»à¶º වෙනස෠à¶à·’රීම","title":"ආධà·à¶»à¶ ","name":"ආධà·à¶»à¶à¶ºà· නà·à¶¸à¶º","errorName":"à¶à¶»à·”ණà·à¶à¶» ආධà·à¶»à¶à¶ºà· නà·à¶¸à¶º ඇතුල෠à¶à¶»à¶±à·à¶±","remove":"ආධà·à¶»à¶à¶º ඉවත෠à¶à·’රීම"},"anchorId":"By Element Id","anchorName":"By Anchor Name","charset":"Linked Resource Charset","cssClasses":"විලà·à·ƒà¶´à¶­à·â€à¶» පනà·à¶­à·’ය","emailAddress":"E-Mail Address","emailBody":"Message Body","emailSubject":"Message Subject","id":"අංà¶à¶º","info":"Link Info","langCode":"භà·à·‚à· à¶à·à¶­à¶º","langDir":"භà·à·‚෠දිà·à·à·€","langDirLTR":"වමà·à·ƒà·’ට දà¶à·”ණුට","langDirRTL":"දà¶à·”ණ෠සිට වමට","menu":"Edit Link","name":"නම","noAnchors":"(No anchors available in the document)","noEmail":"Please type the e-mail address","noUrl":"Please type the link URL","other":"<other>","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":"විලà·à·ƒà¶º","tabIndex":"Tab Index","target":"අරමුණ","targetFrame":"<frame>","targetFrameName":"Target Frame Name","targetPopup":"<popup window>","targetPopupName":"Popup Window Name","title":"සබà·à¶³à·’ය","toAnchor":"Link to anchor in the text","toEmail":"E-mail","toUrl":"URL","toolbar":"සබà·à¶³à·’ය","type":"Link Type","unlink":"Unlink","upload":"උඩුගතà¶à·’රීම"},"list":{"bulletedlist":"ඇතුලත෠/ ඉවත෠à¶à·’රීම ලඉසà·à¶­à·”à·€","numberedlist":"ඇතුලත෠/ ඉවත෠à¶à·’රීම අනà·à¶±à·à¶à·’ත ලඉසà·à¶­à·”à·€"},"magicline":{"title":"චà·à¶¯à¶º ඇතුලත෠à¶à¶»à¶±à·à¶±"},"maximize":{"maximize":"විà·à·à¶½ à¶à·’රීම","minimize":"à¶à·”ඩ෠à¶à·’රීම"},"pastetext":{"button":"à·ƒà·à¶¸à·à¶±à·â€à¶º අà¶à·à·‚ර ලෙස අලවනà·à¶±","title":"à·ƒà·à¶¸à·à¶±à·â€à¶º අà¶à·à·‚ර ලෙස අලවනà·à¶±"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"වචන වලින෠අලවනà·à¶±","toolbar":"වචන වලින෠අලවනà·à¶±"},"removeformat":{"toolbar":"à·ƒà·à¶à·ƒà·“ම වෙනස෠à¶à¶»à¶±à·à¶±"},"sourcearea":{"toolbar":"මුලà·à·à·â€à¶»à¶º"},"specialchar":{"options":"විà·à·à·‚ ගුණà·à¶‚ග වීà¶à¶½à·à¶´","title":"විà·à·à·‚ ගුණà·à¶‚ග ","toolbar":"විà·à·à·‚ ගුණà·à¶‚ග ඇතුලත෠"},"scayt":{"btn_about":"About SCAYT","btn_dictionaries":"Dictionaries","btn_disable":"Disable SCAYT","btn_enable":"Enable SCAYT","btn_langs":"Languages","btn_options":"Options","text_title":"Spell Check As You Type"},"stylescombo":{"label":"විලà·à·ƒà¶º","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"සීමà·à·€à·€à¶½ විà·à·à¶½à¶­à·à·€à¶º","caption":"Caption","cell":{"menu":"à¶à·œà¶§à·”à·€","insertBefore":"පෙර à¶à·œà¶§à·”à·€à¶à· ඇතුලà·à¶à·’රිම","insertAfter":"පසුව à¶à·œà¶§à·”à·€à¶à· ඇතුලත෠","deleteCell":"à¶à·œà¶§à·”à·€ මà·à¶à·“ම","merge":"à¶à·œà¶§à·” එà¶à¶§ යà·à¶à·’රිම","mergeRight":"දà¶à·”ණට ","mergeDown":"පහලට ","splitHorizontal":"තිරසà·à·€ à¶à·œà¶§à·” පà·à¶­à·’රීම","splitVertical":"සිරසà·à·€ à¶à·œà¶§à·” පà·à¶­à·’රීම","title":"à¶à·œà¶§à·” ","cellType":"à¶à·œà¶§à·” වරà·à¶œà¶º","rowSpan":"පà·à·…à·’ පළල","colSpan":"සිරස෠පළල","wordWrap":"වචන ගà·à¶½à¶´à·”ම","hAlign":"තිරසà·à·€ ","vAlign":"සිරසà·à·€ ","alignBaseline":"පà·à¶¯ රà·à¶›à·à·€","bgColor":"පසුබිම෠වරà·à¶«à¶º","borderColor":"මà·à¶ºà·’ම෠","data":"Data","header":"à·à·“රà·à·‚à¶","yes":"ඔවà·","no":"නà·à¶­","invalidWidth":"à¶à·œà¶§à·” පළල සංඛà·â€à¶ºà·à¶­à·à¶¸à¶ වටිනà·à¶à¶¸à¶à· විය යුතුය","invalidHeight":"à¶à·œà¶§à·” උස සංඛà·â€à¶ºà·à¶­à·à¶¸à¶ වටිනà·à¶à¶¸à¶à· විය යුතුය","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"තà·à¶»à¶±à·à¶±"},"cellPad":"Cell padding","cellSpace":"Cell spacing","column":{"menu":"Column","insertBefore":"Insert Column Before","insertAfter":"Insert Column After","deleteColumn":"Delete Columns"},"columns":"සිරස෠","deleteTable":"වගුව මà¶à¶±à·à¶±","headers":"à·à·“රà·à·‚à¶","headersBoth":"දෙà¶à¶¸","headersColumn":"පළමූ සිරස෠තීරුව","headersNone":"à¶à·’සිවà¶à·à¶¸ නොවà·","headersRow":"පළමූ පà·à·…ිය","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":"නà·à·€à¶­ à¶à·’රීම","undo":"වෙනස෠à¶à·’රීම"},"wsc":{"btnIgnore":"Ignore","btnIgnoreAll":"Ignore All","btnReplace":"Replace","btnReplaceAll":"Replace All","btnUndo":"Undo","changeTo":"Change to","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Spell checker not installed. Do you want to download it now?","manyChanges":"Spell check complete: %1 words changed","noChanges":"Spell check complete: No words changed","noMispell":"Spell check complete: No misspellings found","noSuggestions":"- No suggestions -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Not in dictionary","oneChange":"Spell check complete: One word changed","progress":"Spell check in progress...","title":"Spell Checker","toolbar":"Check Spelling"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/sk.js b/js/ckeditor/lang/sk.js
new file mode 100644
index 0000000..15fb908
--- /dev/null
+++ b/js/ckeditor/lang/sk.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['sk']={"editor":"Editor formĂ¡tovanĂ©ho textu","editorPanel":"Panel editora formĂ¡tovanĂ©ho textu","common":{"editorHelp":"StlaÄte ALT 0 pre nĂ¡povedu","browseServer":"PrechĂ¡dzaÅ¥ server","url":"URL","protocol":"Protokol","upload":"OdoslaÅ¥","uploadSubmit":"OdoslaÅ¥ na server","image":"ObrĂ¡zok","flash":"Flash","form":"FormulĂ¡r","checkbox":"ZaÅ¡krtĂ¡vacie polĂ­Äko","radio":"PrepĂ­naÄ","textField":"TextovĂ© pole","textarea":"TextovĂ¡ oblasÅ¥","hiddenField":"SkrytĂ© pole","button":"TlaÄidlo","select":"RozbaľovacĂ­ zoznam","imageButton":"ObrĂ¡zkovĂ© tlaÄidlo","notSet":"<nenastavenĂ©>","id":"Id","name":"Meno","langDir":"OrientĂ¡cia jazyka","langDirLtr":"Zľava doprava (LTR)","langDirRtl":"Sprava doľava (RTL)","langCode":"KĂ³d jazyka","longDescr":"DlhĂ½ popis URL","cssClass":"Trieda Å¡tĂ½lu","advisoryTitle":"PomocnĂ½ titulok","cssStyle":"Å tĂ½l","ok":"OK","cancel":"ZruÅ¡iÅ¥","close":"Zatvorit","preview":"NĂ¡hľad","resize":"ZmeniÅ¥ veľkosÅ¥","generalTab":"HlavnĂ©","advancedTab":"RozÅ¡Ă­renĂ©","validateNumberFailed":"Hodnota nieje ÄĂ­slo.","confirmNewPage":"Prajete si naÄĂ­tat novĂº strĂ¡nku? VÅ¡etky neuloženĂ© zmeny budĂº stratenĂ©. ","confirmCancel":"Niektore možnosti boli zmenenĂ©. Naozaj chcete zavrieÅ¥ okno?","options":"Možnosti","target":"Cieľ","targetNew":"NovĂ© okno (_blank)","targetTop":"NajvrchnejÅ¡ie okno (_top)","targetSelf":"To istĂ© okno (_self)","targetParent":"RodiÄovskĂ© okno (_parent)","langDirLTR":"Zľava doprava (LTR)","langDirRTL":"Sprava doľava (RTL)","styles":"Å tĂ½l","cssClasses":"Triedy Å¡tĂ½lu","width":"Å Ă­rka","height":"VĂ½Å¡ka","align":"Zarovnanie","alignLeft":"Vľavo","alignRight":"Vpravo","alignCenter":"Na stred","alignJustify":"ZarovnaÅ¥ do bloku","alignTop":"Nahor","alignMiddle":"Na stred","alignBottom":"Dole","alignNone":"Žiadne","invalidValue":"NeplatnĂ¡ hodnota.","invalidHeight":"VĂ½Å¡ka musĂ­ byÅ¥ ÄĂ­slo.","invalidWidth":"Å Ă­rka musĂ­ byÅ¥ ÄĂ­slo.","invalidCssLength":"Å pecifikovanĂ¡ hodnota pre pole \"%1\" musĂ­ byÅ¥ kladnĂ© ÄĂ­slo s alebo bez platnej CSS mernej jednotky (px, %, in, cm, mm, em, ex, pt alebo pc).","invalidHtmlLength":"Å pecifikovanĂ¡ hodnota pre pole \"%1\" musĂ­ byÅ¥ kladnĂ© ÄĂ­slo s alebo bez platnej HTML mernej jednotky (px alebo %).","invalidInlineStyle":"ZadanĂ¡ hodnota pre inline Å¡tĂ½l musĂ­ pozostĂ¡vaÅ¥ s jednĂ©ho, alebo viac dvojĂ­c formĂ¡tu \"nĂ¡zov: hodnota\", oddelenĂ½ch bodkoÄiarkou.","cssLengthTooltip":"Vložte ÄĂ­slo pre hodnotu v pixeloch alebo ÄĂ­slo so sprĂ¡vnou CSS jednotou (px, %, in, cm, mm, em, ex, pt alebo pc).","unavailable":"%1<span class=\"cke_accessibility\">, nedostupnĂ½</span>"},"about":{"copy":"Copyright &copy; $1. VÅ¡etky prĂ¡va vyhradenĂ©.","dlgTitle":"O CKEditor-e","help":"ZaÅ¡krtnite $1 pre pomoc.","moreInfo":"Pre informĂ¡cie o licenciĂ¡ch, prosĂ­me, navÅ¡tĂ­vte naÅ¡u web strĂ¡nku:","title":"O CKEditor-e","userGuide":"PouÅ¾Ă­vateľskĂ¡ prĂ­ruÄka KCEditor-a"},"basicstyles":{"bold":"TuÄnĂ©","italic":"KurzĂ­va","strike":"PreÄiarknutĂ©","subscript":"DolnĂ½ index","superscript":"HornĂ½ index","underline":"PodÄiarknutĂ©"},"blockquote":{"toolbar":"CitĂ¡cia"},"clipboard":{"copy":"KopĂ­rovaÅ¥","copyError":"BezpeÄnostnĂ© nastavenia VĂ¡Å¡ho prehliadaÄa nedovoľujĂº editoru automaticky spustiÅ¥ operĂ¡ciu kopĂ­rovania. ProsĂ­m, použite na to klĂ¡vesnicu (Ctrl/Cmd+C).","cut":"VystrihnĂºÅ¥","cutError":"BezpeÄnostnĂ© nastavenia VĂ¡Å¡ho prehliadaÄa nedovoľujĂº editoru automaticky spustiÅ¥ operĂ¡ciu vystrihnutia. ProsĂ­m, použite na to klĂ¡vesnicu (Ctrl/Cmd+X).","paste":"VložiÅ¥","pasteArea":"Miesto pre vloženie","pasteMsg":"ProsĂ­m, vložte nasledovnĂ½ rĂ¡mÄek použitĂ­m klĂ¡vesnice (<STRONG>Ctrl/Cmd+V</STRONG>) a stlaÄte OK.","securityMsg":"KvĂ´li vaÅ¡im bezpeÄnostnĂ½m nastaveniam prehliadaÄa editor nie je schopnĂ½ pristupovaÅ¥ k vaÅ¡ej schrĂ¡nke na kopĂ­rovanie priamo. Vložte to preto do tohto okna.","title":"VložiÅ¥"},"contextmenu":{"options":"Možnosti kontextovĂ©ho menu"},"button":{"selectedLabel":"%1 (VybranĂ©)"},"toolbar":{"toolbarCollapse":"ZbaliÅ¥ liÅ¡tu nĂ¡strojov","toolbarExpand":"RozbaliÅ¥ liÅ¡tu nĂ¡strojov","toolbarGroups":{"document":"Dokument","clipboard":"SchrĂ¡nka pre kopĂ­rovanie/SpĂ¤Å¥","editing":"Upravovanie","forms":"FormulĂ¡re","basicstyles":"ZĂ¡kladnĂ© Å¡tĂ½ly","paragraph":"Odstavec","links":"Odkazy","insert":"VložiÅ¥","styles":"Å tĂ½ly","colors":"Farby","tools":"NĂ¡stroje"},"toolbars":"LiÅ¡ty nĂ¡strojov editora"},"elementspath":{"eleLabel":"Cesta prvkov","eleTitle":"%1 prvok"},"format":{"label":"FormĂ¡t","panelTitle":"FormĂ¡t","tag_address":"Adresa","tag_div":"NormĂ¡lny (DIV)","tag_h1":"Nadpis 1","tag_h2":"Nadpis 2","tag_h3":"Nadpis 3","tag_h4":"Nadpis 4","tag_h5":"Nadpis 5","tag_h6":"Nadpis 6","tag_p":"NormĂ¡lny","tag_pre":"FormĂ¡tovanĂ½"},"horizontalrule":{"toolbar":"VložiÅ¥ vodorovnĂº Äiaru"},"image":{"alertUrl":"Zadajte prosĂ­m URL obrĂ¡zka","alt":"AlternatĂ­vny text","border":"RĂ¡m (border)","btnUpload":"OdoslaÅ¥ to na server","button2Img":"Chcete zmeniÅ¥ vybranĂ© obrĂ¡zkovĂ© tlaÄidlo na jednoduchĂ½ obrĂ¡zok?","hSpace":"H-medzera","img2Button":"Chcete zmeniÅ¥ vybranĂ½ obrĂ¡zok na obrĂ¡zkovĂ© tlaÄidlo?","infoTab":"InformĂ¡cie o obrĂ¡zku","linkTab":"Odkaz","lockRatio":"Pomer zĂ¡mky","menu":"Vlastnosti obrĂ¡zka","resetSize":"PĂ´vodnĂ¡ veľkosÅ¥","title":"Vlastnosti obrĂ¡zka","titleButton":"Vlastnosti obrĂ¡zkovĂ©ho tlaÄidla","upload":"NahraÅ¥","urlMissing":"ChĂ½ba URL zdroja obrĂ¡zka.","vSpace":"V-medzera","validateBorder":"RĂ¡m (border) musĂ­ byÅ¥ celĂ© ÄĂ­slo.","validateHSpace":"H-medzera musĂ­ byÅ¥ celĂ© ÄĂ­slo.","validateVSpace":"V-medzera musĂ­ byÅ¥ celĂ© ÄĂ­slo."},"indent":{"indent":"ZväÄÅ¡iÅ¥ odsadenie","outdent":"ZmenÅ¡iÅ¥ odsadenie"},"fakeobjects":{"anchor":"Kotva","flash":"Flash animĂ¡cia","hiddenfield":"SkrytĂ© pole","iframe":"IFrame","unknown":"NeznĂ¡my objekt"},"link":{"acccessKey":"PrĂ­stupovĂ½ kÄ¾ĂºÄ","advanced":"RozÅ¡Ă­renĂ©","advisoryContentType":"PomocnĂ½ typ obsahu","advisoryTitle":"PomocnĂ½ titulok","anchor":{"toolbar":"Kotva","menu":"UpraviÅ¥ kotvu","title":"Vlastnosti kotvy","name":"NĂ¡zov kotvy","errorName":"Zadajte prosĂ­m nĂ¡zov kotvy","remove":"OdstrĂ¡niÅ¥ kotvu"},"anchorId":"Podľa Id objektu","anchorName":"Podľa mena kotvy","charset":"PriradenĂ¡ znakovĂ¡ sada","cssClasses":"Triedy Å¡tĂ½lu","emailAddress":"E-MailovĂ¡ adresa","emailBody":"Telo sprĂ¡vy","emailSubject":"Predmet sprĂ¡vy","id":"Id","info":"InformĂ¡cie o odkaze","langCode":"OrientĂ¡cia jazyka","langDir":"OrientĂ¡cia jazyka","langDirLTR":"Zľava doprava (LTR)","langDirRTL":"Sprava doľava (RTL)","menu":"UpraviÅ¥ odkaz","name":"NĂ¡zov","noAnchors":"(V dokumente nie sĂº dostupnĂ© žiadne kotvy)","noEmail":"Zadajte prosĂ­m e-mailovĂº adresu","noUrl":"Zadajte prosĂ­m URL odkazu","other":"<inĂ½>","popupDependent":"ZĂ¡vislosÅ¥ (Netscape)","popupFeatures":"Vlastnosti vyskakovacieho okna","popupFullScreen":"CelĂ¡ obrazovka (IE)","popupLeft":"ĽavĂ½ okraj","popupLocationBar":"Panel umiestnenia (location bar)","popupMenuBar":"Panel ponuky (menu bar)","popupResizable":"MeniteľnĂ¡ veľkosÅ¥ (resizable)","popupScrollBars":"PosuvnĂ­ky (scroll bars)","popupStatusBar":"StavovĂ½ riadok (status bar)","popupToolbar":"Panel nĂ¡strojov (toolbar)","popupTop":"HornĂ½ okraj","rel":"VzÅ¥ah (rel)","selectAnchor":"VybraÅ¥ kotvu","styles":"Å tĂ½l","tabIndex":"Poradie prvku (tab index)","target":"Cieľ","targetFrame":"<rĂ¡mec>","targetFrameName":"NĂ¡zov rĂ¡mu cieľa","targetPopup":"<vyskakovacie okno>","targetPopupName":"NĂ¡zov vyskakovacieho okna","title":"Odkaz","toAnchor":"Odkaz na kotvu v texte","toEmail":"E-mail","toUrl":"URL","toolbar":"Odkaz","type":"Typ odkazu","unlink":"OdstrĂ¡niÅ¥ odkaz","upload":"NahraÅ¥"},"list":{"bulletedlist":"VložiÅ¥/OdstrĂ¡niÅ¥ zoznam s odrĂ¡Å¾kami","numberedlist":"VložiÅ¥/OdstrĂ¡niÅ¥ ÄĂ­slovanĂ½ zoznam"},"magicline":{"title":"Sem vložte paragraf"},"maximize":{"maximize":"MaximalizovaÅ¥","minimize":"MinimalizovaÅ¥"},"pastetext":{"button":"VložiÅ¥ ako ÄistĂ½ text","title":"VložiÅ¥ ako ÄistĂ½ text"},"pastefromword":{"confirmCleanup":"VkladanĂ½ text vyzerĂ¡ byÅ¥ skopĂ­rovanĂ½ z Wordu. Chcete ho automaticky vyÄistiÅ¥ pred vkladanĂ­m?","error":"Nebolo možnĂ© vyÄistiÅ¥ vloženĂ© dĂ¡ta kvĂ´li internej chybe","title":"VložiÅ¥ z Wordu","toolbar":"VložiÅ¥ z Wordu"},"removeformat":{"toolbar":"OdstrĂ¡niÅ¥ formĂ¡tovanie"},"sourcearea":{"toolbar":"Zdroj"},"specialchar":{"options":"Možnosti Å¡peciĂ¡lneho znaku","title":"VĂ½ber Å¡peciĂ¡lneho znaku","toolbar":"VložiÅ¥ Å¡peciĂ¡lny znak"},"scayt":{"btn_about":"O KPPP (Kontrola pravopisu poÄas pĂ­sania)","btn_dictionaries":"SlovnĂ­ky","btn_disable":"ZakĂ¡zaÅ¥ KPPP (Kontrola pravopisu poÄas pĂ­sania)","btn_enable":"PovoliÅ¥ KPPP (Kontrola pravopisu poÄas pĂ­sania)","btn_langs":"Jazyky","btn_options":"Možnosti","text_title":"Kontrola pravopisu poÄas pĂ­sania"},"stylescombo":{"label":"Å tĂ½ly","panelTitle":"FormĂ¡tovanie Å¡tĂ½lov","panelTitle1":"Å tĂ½ly bloku","panelTitle2":"VnĂºtroriadkovĂ© (inline) Å¡tĂ½ly","panelTitle3":"Å tĂ½ly objeku"},"table":{"border":"Å Ă­rka rĂ¡mu (border)","caption":"Popis","cell":{"menu":"Bunka","insertBefore":"VložiÅ¥ bunku pred","insertAfter":"VložiÅ¥ bunku za","deleteCell":"VymazaÅ¥ bunky","merge":"ZlĂºÄiÅ¥ bunky","mergeRight":"ZlĂºÄiÅ¥ doprava","mergeDown":"ZlĂºÄiÅ¥ dole","splitHorizontal":"RozdeliÅ¥ bunky horizontĂ¡lne","splitVertical":"RozdeliÅ¥ bunky vertikĂ¡lne","title":"Vlastnosti bunky","cellType":"Typ bunky","rowSpan":"Rozsah riadkov","colSpan":"Rozsah stĺpcov","wordWrap":"Zalomovanie riadkov","hAlign":"HorizontĂ¡lne zarovnanie","vAlign":"VertikĂ¡lne zarovnanie","alignBaseline":"ZĂ¡kladnĂ¡ Äiara (baseline)","bgColor":"Farba pozadia","borderColor":"Farba rĂ¡mu","data":"DĂ¡ta","header":"HlaviÄka","yes":"Ăno","no":"Nie","invalidWidth":"Å Ă­rka bunky musĂ­ byÅ¥ ÄĂ­slo.","invalidHeight":"VĂ½Å¡ka bunky musĂ­ byÅ¥ ÄĂ­slo.","invalidRowSpan":"Rozsah riadkov musĂ­ byÅ¥ celĂ© ÄĂ­slo.","invalidColSpan":"Rozsah stĺpcov musĂ­ byÅ¥ celĂ© ÄĂ­slo.","chooseColor":"VybraÅ¥"},"cellPad":"Odsadenie obsahu (cell padding)","cellSpace":"VzdialenosÅ¥ buniek (cell spacing)","column":{"menu":"Stĺpec","insertBefore":"VložiÅ¥ stĺpec pred","insertAfter":"VložiÅ¥ stĺpec po","deleteColumn":"ZmazaÅ¥ stĺpce"},"columns":"Stĺpce","deleteTable":"VymazaÅ¥ tabuľku","headers":"HlaviÄka","headersBoth":"Obe","headersColumn":"PrvĂ½ stĺpec","headersNone":"Žiadne","headersRow":"PrvĂ½ riadok","invalidBorder":"Å irka rĂ¡mu musĂ­ byÅ¥ ÄĂ­slo.","invalidCellPadding":"Odsadenie v bunkĂ¡ch (cell padding) musĂ­ byÅ¥ kladnĂ© ÄĂ­slo.","invalidCellSpacing":"Medzera mädzi bunkami (cell spacing) musĂ­ byÅ¥ kladnĂ© ÄĂ­slo.","invalidCols":"PoÄet stĺpcov musĂ­ byÅ¥ ÄĂ­slo väÄÅ¡ie ako 0.","invalidHeight":"VĂ½Å¡ka tabuľky musĂ­ byÅ¥ ÄĂ­slo.","invalidRows":"PoÄet riadkov musĂ­ byÅ¥ ÄĂ­slo väÄÅ¡ie ako 0.","invalidWidth":"Å irka tabuľky musĂ­ byÅ¥ ÄĂ­slo.","menu":"Vlastnosti tabuľky","row":{"menu":"Riadok","insertBefore":"VložiÅ¥ riadok pred","insertAfter":"VložiÅ¥ riadok po","deleteRow":"VymazaÅ¥ riadky"},"rows":"Riadky","summary":"Prehľad","title":"Vlastnosti tabuľky","toolbar":"Tabuľka","widthPc":"percent","widthPx":"pixelov","widthUnit":"jednotka Å¡Ă­rky"},"undo":{"redo":"Znovu","undo":"SpĂ¤Å¥"},"wsc":{"btnIgnore":"IgnorovaÅ¥","btnIgnoreAll":"IgnorovaÅ¥ vÅ¡etko","btnReplace":"PrepĂ­sat","btnReplaceAll":"PrepĂ­sat vÅ¡etko","btnUndo":"SpĂ¤Å¥","changeTo":"ZmeniÅ¥ na","errorLoading":"Chyba pri naÄĂ­tanĂ­ slovnĂ­ka z adresy: %s.","ieSpellDownload":"Kontrola pravopisu nie je naiÅ¡talovanĂ¡. Chcete ju teraz stiahnuÅ¥?","manyChanges":"Kontrola pravopisu dokonÄenĂ¡: Bolo zmenenĂ½ch %1 slov","noChanges":"Kontrola pravopisu dokonÄenĂ¡: Neboli zmenenĂ© žiadne slovĂ¡","noMispell":"Kontrola pravopisu dokonÄenĂ¡: Neboli nĂ¡jdenĂ© žiadne chyby pravopisu","noSuggestions":"- Žiadny nĂ¡vrh -","notAvailable":"PrepĂ¡Äte, ale služba je momentĂ¡lne nedostupnĂ¡.","notInDic":"Nie je v slovnĂ­ku","oneChange":"Kontrola pravopisu dokonÄenĂ¡: Bolo zmenenĂ© jedno slovo","progress":"Prebieha kontrola pravopisu...","title":"SkontrolovaÅ¥ pravopis","toolbar":"Kontrola pravopisu"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/sl.js b/js/ckeditor/lang/sl.js
new file mode 100644
index 0000000..1145b77
--- /dev/null
+++ b/js/ckeditor/lang/sl.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['sl']={"editor":"Bogat Urejevalnik Besedila","editorPanel":"Rich Text Editor ploÅ¡Äa","common":{"editorHelp":"Pritisnite ALT 0 za pomoÄ","browseServer":"Prebrskaj na strežniku","url":"URL","protocol":"Protokol","upload":"Naloži","uploadSubmit":"PoÅ¡lji na strežnik","image":"Slika","flash":"Flash","form":"Obrazec","checkbox":"Potrditveno polje","radio":"Izbirno polje","textField":"Vnosno polje","textarea":"Vnosno obmoÄje","hiddenField":"Skrito polje","button":"Gumb","select":"Spustno Polje","imageButton":"Slikovni Gumb","notSet":"<ni doloÄen>","id":"Id","name":"Ime","langDir":"Smer jezika","langDirLtr":"Od leve proti desni (LTR)","langDirRtl":"Od desne proti levi (RTL)","langCode":"Koda Jezika","longDescr":"Dolg opis URL-ja","cssClass":"Razred stilne predloge","advisoryTitle":"Predlagani naslov","cssStyle":"Slog","ok":"V redu","cancel":"PrekliÄi","close":"Zapri","preview":"Predogled","resize":"Potegni za spremembo velikosti","generalTab":"SploÅ¡no","advancedTab":"Napredno","validateNumberFailed":"Ta vrednost ni Å¡tevilo.","confirmNewPage":"Vse neshranjene spremembe te vsebine bodo izgubljene. Ali res želite naložiti novo stran?","confirmCancel":"Nekaj možnosti je bilo spremenjenih. Ali res želite zapreti okno?","options":"Možnosti","target":"Cilj","targetNew":"Novo Okno (_blank)","targetTop":"Vrhovno Okno (_top)","targetSelf":"Enako Okno (_self)","targetParent":"MatiÄno Okno (_parent)","langDirLTR":"Od leve proti desni (LTR)","langDirRTL":"Od desne proti levi (RTL)","styles":"Slog","cssClasses":"Razred stilne predloge","width":"Å irina","height":"ViÅ¡ina","align":"Poravnava","alignLeft":"Levo","alignRight":"Desno","alignCenter":"Sredinsko","alignJustify":"Obojestranska poravnava","alignTop":"Na vrh","alignMiddle":"V sredino","alignBottom":"Na dno","alignNone":"Brez poravnave","invalidValue":"Neveljavna vrednost.","invalidHeight":"ViÅ¡ina mora biti Å¡tevilo.","invalidWidth":"Å irina mora biti Å¡tevilo.","invalidCssLength":"Vrednost doloÄena za \"%1\" polje mora biti pozitivna Å¡tevilka z ali brez veljavne CSS enote za merjenje (px, %, in, cm, mm, em, ex, pt, ali pc).","invalidHtmlLength":"Vrednost doloÄena za \"%1\" polje mora biti pozitivna Å¡tevilka z ali brez veljavne HTML enote za merjenje (px ali %).","invalidInlineStyle":"Vrednost doloÄena za inline slog mora biti sestavljena iz ene ali veÄ tork (tuples) z obliko \"ime : vrednost\", loÄenih z podpiÄji.","cssLengthTooltip":"Vnesite Å¡tevilko za vrednost v slikovnih pikah (pixels) ali Å¡tevilko z veljavno CSS enoto (px, %, in, cm, mm, em, ex, pt, ali pc).","unavailable":"%1<span class=\"cke_accessibility\">, nedosegljiv</span>"},"about":{"copy":"Copyright &copy; $1. Vse pravice pridržane.","dlgTitle":"O programu CKEditor","help":"Preverite $1 za pomoÄ.","moreInfo":"Za informacijo o licenci prosim obiÅ¡Äite naÅ¡o spletno stran:","title":"O programu CKEditor","userGuide":"CKEditor Navodila za Uporabo"},"basicstyles":{"bold":"Krepko","italic":"LežeÄe","strike":"PreÄrtano","subscript":"Podpisano","superscript":"Nadpisano","underline":"PodÄrtano"},"blockquote":{"toolbar":"Citat"},"clipboard":{"copy":"Kopiraj","copyError":"Varnostne nastavitve brskalnika ne dopuÅ¡Äajo samodejnega kopiranja. Uporabite kombinacijo tipk na tipkovnici (Ctrl/Cmd+C).","cut":"Izreži","cutError":"Varnostne nastavitve brskalnika ne dopuÅ¡Äajo samodejnega izrezovanja. Uporabite kombinacijo tipk na tipkovnici (Ctrl/Cmd+X).","paste":"Prilepi","pasteArea":"Prilepi Prostor","pasteMsg":"Prosim prilepite v sleÄi okvir s pomoÄjo tipkovnice (<STRONG>Ctrl/Cmd+V</STRONG>) in pritisnite <STRONG>V redu</STRONG>.","securityMsg":"Zaradi varnostnih nastavitev vaÅ¡ega brskalnika urejevalnik ne more neposredno dostopati do odložiÅ¡Äa. Vsebino odložiÅ¡Äa ponovno prilepite v to okno.","title":"Prilepi"},"contextmenu":{"options":"Možnosti Kontekstnega Menija"},"button":{"selectedLabel":"%1 (Izbrano)"},"toolbar":{"toolbarCollapse":"SkrÄi Orodno Vrstico","toolbarExpand":"RazÅ¡iri Orodno Vrstico","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":"Urejevalnik orodne vrstice"},"elementspath":{"eleLabel":"Pot elementov","eleTitle":"%1 element"},"format":{"label":"Oblika","panelTitle":"Oblika","tag_address":"Napis","tag_div":"Navaden (DIV)","tag_h1":"Naslov 1","tag_h2":"Naslov 2","tag_h3":"Naslov 3","tag_h4":"Naslov 4","tag_h5":"Naslov 5","tag_h6":"Naslov 6","tag_p":"Navaden","tag_pre":"Oblikovan"},"horizontalrule":{"toolbar":"Vstavi vodoravno Ärto"},"image":{"alertUrl":"Vnesite URL slike","alt":"Nadomestno besedilo","border":"Obroba","btnUpload":"PoÅ¡lji na strežnik","button2Img":"ŽeliÅ¡ pretvoriti izbrani gumb s sliko v preprosto sliko?","hSpace":"Vodoravni razmik","img2Button":"ŽeliÅ¡ pretvoriti izbrano sliko v gumb s sliko?","infoTab":"Podatki o sliki","linkTab":"Povezava","lockRatio":"Zakleni razmerje","menu":"Lastnosti slike","resetSize":"Ponastavi velikost","title":"Lastnosti slike","titleButton":"Lastnosti gumba s sliko","upload":"PoÅ¡lji","urlMissing":"Manjka vir (URL) slike.","vSpace":"NavpiÄni razmik","validateBorder":"Meja mora biti celo Å¡tevilo.","validateHSpace":"HSpace mora biti celo Å¡tevilo.","validateVSpace":"VSpace mora biti celo Å¡tevilo."},"indent":{"indent":"PoveÄaj zamik","outdent":"ZmanjÅ¡aj zamik"},"fakeobjects":{"anchor":"Sidro","flash":"Flash animacija","hiddenfield":"Skrito polje","iframe":"IFrame","unknown":"Neznan objekt"},"link":{"acccessKey":"Dostopno Geslo","advanced":"Napredno","advisoryContentType":"Predlagani tip vsebine (content-type)","advisoryTitle":"Predlagani naslov","anchor":{"toolbar":"Vstavi/uredi zaznamek","menu":"Lastnosti zaznamka","title":"Lastnosti zaznamka","name":"Ime zaznamka","errorName":"Prosim vnesite ime zaznamka","remove":"Remove Anchor"},"anchorId":"Po ID-ju elementa","anchorName":"Po imenu zaznamka","charset":"Kodna tabela povezanega vira","cssClasses":"Razred stilne predloge","emailAddress":"Elektronski naslov","emailBody":"Vsebina sporoÄila","emailSubject":"Predmet sporoÄila","id":"Id","info":"Podatki o povezavi","langCode":"Smer jezika","langDir":"Smer jezika","langDirLTR":"Od leve proti desni (LTR)","langDirRTL":"Od desne proti levi (RTL)","menu":"Uredi povezavo","name":"Ime","noAnchors":"(V tem dokumentu ni zaznamkov)","noEmail":"Vnesite elektronski naslov","noUrl":"Vnesite URL povezave","other":"<drug>","popupDependent":"Podokno (Netscape)","popupFeatures":"ZnaÄilnosti pojavnega okna","popupFullScreen":"Celozaslonska slika (IE)","popupLeft":"Lega levo","popupLocationBar":"Naslovna vrstica","popupMenuBar":"Menijska vrstica","popupResizable":"Spremenljive velikosti","popupScrollBars":"Drsniki","popupStatusBar":"Vrstica stanja","popupToolbar":"Orodna vrstica","popupTop":"Lega na vrhu","rel":"Odnos","selectAnchor":"Izberi zaznamek","styles":"Slog","tabIndex":"Å tevilka tabulatorja","target":"Cilj","targetFrame":"<okvir>","targetFrameName":"Ime ciljnega okvirja","targetPopup":"<pojavno okno>","targetPopupName":"Ime pojavnega okna","title":"Povezava","toAnchor":"Zaznamek na tej strani","toEmail":"Elektronski naslov","toUrl":"URL","toolbar":"Vstavi/uredi povezavo","type":"Vrsta povezave","unlink":"Odstrani povezavo","upload":"Prenesi"},"list":{"bulletedlist":"OznaÄen seznam","numberedlist":"OÅ¡tevilÄen seznam"},"magicline":{"title":"Vstavite odstavek tukaj"},"maximize":{"maximize":"Maksimiraj","minimize":"Minimiraj"},"pastetext":{"button":"Prilepi kot golo besedilo","title":"Prilepi kot golo besedilo"},"pastefromword":{"confirmCleanup":"Besedilo, ki ga želite prilepiti je kopirano iz Word-a. Ali ga želite oÄistiti, preden ga prilepite?","error":"Ni bilo mogoÄe oÄistiti prilepljenih podatkov zaradi notranje napake","title":"Prilepi iz Worda","toolbar":"Prilepi iz Worda"},"removeformat":{"toolbar":"Odstrani oblikovanje"},"sourcearea":{"toolbar":"Izvorna koda"},"specialchar":{"options":"Možnosti Posebnega Znaka","title":"Izberi Posebni Znak","toolbar":"Vstavi posebni znak"},"scayt":{"btn_about":"O storitvi SCAYT","btn_dictionaries":"Slovarji","btn_disable":"OnemogoÄi SCAYT","btn_enable":"OmogoÄi SCAYT","btn_langs":"Jeziki","btn_options":"Možnosti","text_title":"ÄŒrkovanje med tipkanjem"},"stylescombo":{"label":"Slog","panelTitle":"Oblikovalni Stili","panelTitle1":"Slogi odstavkov","panelTitle2":"Slogi besedila","panelTitle3":"Slogi objektov"},"table":{"border":"Velikost obrobe","caption":"Naslov","cell":{"menu":"Celica","insertBefore":"Vstavi celico pred","insertAfter":"Vstavi celico za","deleteCell":"IzbriÅ¡i celice","merge":"Združi celice","mergeRight":"Združi desno","mergeDown":"Druži navzdol","splitHorizontal":"Razdeli celico vodoravno","splitVertical":"Razdeli celico navpiÄno","title":"Lastnosti celice","cellType":"Vrsta celice","rowSpan":"Razpon vrstic","colSpan":"Razpon stolpcev","wordWrap":"Prelom besedila","hAlign":"Vodoravna poravnava","vAlign":"NavpiÄna poravnava","alignBaseline":"Osnovnica","bgColor":"Barva ozadja","borderColor":"Barva obrobe","data":"Podatki","header":"Glava","yes":"Da","no":"Ne","invalidWidth":"Å irina celice mora biti Å¡tevilo.","invalidHeight":"ViÅ¡ina celice mora biti Å¡tevilo.","invalidRowSpan":"Razpon vrstic mora biti celo Å¡tevilo.","invalidColSpan":"Razpon stolpcev mora biti celo Å¡tevilo.","chooseColor":"Izberi"},"cellPad":"Polnilo med celicami","cellSpace":"Razmik med celicami","column":{"menu":"Stolpec","insertBefore":"Vstavi stolpec pred","insertAfter":"Vstavi stolpec za","deleteColumn":"IzbriÅ¡i stolpce"},"columns":"Stolpci","deleteTable":"IzbriÅ¡i tabelo","headers":"Glave","headersBoth":"Oboje","headersColumn":"Prvi stolpec","headersNone":"Brez","headersRow":"Prva vrstica","invalidBorder":"Å irina obrobe mora biti Å¡tevilo.","invalidCellPadding":"Zamik celic mora biti Å¡tevilo","invalidCellSpacing":"Razmik med celicami mora biti Å¡tevilo.","invalidCols":"Å tevilo stolpcev mora biti veÄje od 0.","invalidHeight":"ViÅ¡ina tabele mora biti Å¡tevilo.","invalidRows":"Å tevilo vrstic mora biti veÄje od 0.","invalidWidth":"Å irina tabele mora biti Å¡tevilo.","menu":"Lastnosti tabele","row":{"menu":"Vrstica","insertBefore":"Vstavi vrstico pred","insertAfter":"Vstavi vrstico za","deleteRow":"IzbriÅ¡i vrstice"},"rows":"Vrstice","summary":"Povzetek","title":"Lastnosti tabele","toolbar":"Tabela","widthPc":"procentov","widthPx":"pik","widthUnit":"enota Å¡irine"},"undo":{"redo":"Ponovi","undo":"Razveljavi"},"wsc":{"btnIgnore":"Prezri","btnIgnoreAll":"Prezri vse","btnReplace":"Zamenjaj","btnReplaceAll":"Zamenjaj vse","btnUndo":"Razveljavi","changeTo":"Spremeni v","errorLoading":"Napaka pri nalaganju storitve programa na naslovu %s.","ieSpellDownload":"ÄŒrkovalnik ni nameÅ¡Äen. Ali ga želite prenesti sedaj?","manyChanges":"ÄŒrkovanje je konÄano: Spremenjenih je bilo %1 besed","noChanges":"ÄŒrkovanje je konÄano: Nobena beseda ni bila spremenjena","noMispell":"ÄŒrkovanje je konÄano: Brez napak","noSuggestions":"- Ni predlogov -","notAvailable":"Oprostite, storitev trenutno ni dosegljiva.","notInDic":"Ni v slovarju","oneChange":"ÄŒrkovanje je konÄano: Spremenjena je bila ena beseda","progress":"Preverjanje Ärkovanja se izvaja...","title":"ÄŒrkovalnik","toolbar":"Preveri Ärkovanje"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/sq.js b/js/ckeditor/lang/sq.js
new file mode 100644
index 0000000..36c15bf
--- /dev/null
+++ b/js/ckeditor/lang/sq.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['sq']={"editor":"Redaktues i Pasur Teksti","editorPanel":"Paneli i redaktuesit të tekstit të plotë","common":{"editorHelp":"Shtyp ALT 0 për ndihmë","browseServer":"Shfleto në Server","url":"URL","protocol":"Protokolli","upload":"Ngarko","uploadSubmit":"Dërgo në server","image":"Imazh","flash":"Objekt flash","form":"Formular","checkbox":"Checkbox","radio":"Buton radio","textField":"Fushë tekst","textarea":"Hapësirë tekst","hiddenField":"Fushë e fshehur","button":"Buton","select":"Menu zgjedhjeje","imageButton":"Buton imazhi","notSet":"<e pazgjedhur>","id":"Id","name":"Emër","langDir":"Kod gjuhe","langDirLtr":"Nga e majta në të djathtë (LTR)","langDirRtl":"Nga e djathta në të majtë (RTL)","langCode":"Kod gjuhe","longDescr":"Përshkrim i hollësishëm","cssClass":"Klasa stili CSS","advisoryTitle":"Titull","cssStyle":"Stil","ok":"OK","cancel":"Anulo","close":"Mbyll","preview":"Parashiko","resize":"Ripërmaso","generalTab":"Të përgjithshme","advancedTab":"Të përparuara","validateNumberFailed":"Vlera e futur nuk është një numër","confirmNewPage":"Çdo ndryshim që nuk është ruajtur do humbasë. Je i sigurtë që dëshiron të krijosh një faqe të re?","confirmCancel":"Disa opsione kanë ndryshuar. Je i sigurtë që dëshiron ta mbyllësh dritaren?","options":"Opsione","target":"Objektivi","targetNew":"Dritare e re (_blank)","targetTop":"Dritare në plan të parë (_top)","targetSelf":"E njëjta dritare (_self)","targetParent":"Dritarja prind (_parent)","langDirLTR":"Nga e majta në të djathë (LTR)","langDirRTL":"Nga e djathta në të majtë (RTL)","styles":"Stil","cssClasses":"Klasa Stili CSS","width":"Gjerësi","height":"Lartësi","align":"Rreshtim","alignLeft":"Majtas","alignRight":"Djathtas","alignCenter":"Qendër","alignJustify":"Zgjero","alignTop":"Lart","alignMiddle":"Në mes","alignBottom":"Poshtë","alignNone":"Asnjë","invalidValue":"Vlerë e pavlefshme","invalidHeight":"Lartësia duhet të jetë një numër","invalidWidth":"Gjerësia duhet të jetë një numër","invalidCssLength":"Vlera e fushës \"%1\" duhet të jetë një numër pozitiv me apo pa njësi matëse të vlefshme CSS (px, %, in, cm, mm, em, ex, pt ose pc).","invalidHtmlLength":"Vlera e fushës \"%1\" duhet të jetë një numër pozitiv me apo pa njësi matëse të vlefshme HTML (px ose %)","invalidInlineStyle":"Stili inline duhet të jetë një apo disa vlera të formatit \"emër: vlerë\", ndarë nga pikëpresje.","cssLengthTooltip":"Fut një numër për vlerën në pixel apo një numër me një njësi të vlefshme CSS (px, %, in, cm, mm, ex, pt, ose pc).","unavailable":"%1<span class=\"cke_accessibility\">, i padisponueshëm</span>"},"about":{"copy":"Të drejtat e kopjimit &copy; $1. Të gjitha të drejtat e rezervuara.","dlgTitle":"Rreth CKEditor","help":"Kontrollo $1 për ndihmë.","moreInfo":"Për informacione rreth licencave shih faqen tonë:","title":"Rreth CKEditor","userGuide":"Udhëzuesi i Shfrytëzuesit të CKEditor"},"basicstyles":{"bold":"Trash","italic":"Pjerrët","strike":"Nëpërmes","subscript":"Nën-skriptë","superscript":"Super-skriptë","underline":"Nënvijëzuar"},"blockquote":{"toolbar":"Citatet"},"clipboard":{"copy":"Kopjo","copyError":"Të dhënat e sigurisë së shfletuesit tuaj nuk lejojnë që redaktuesi automatikisht të kryej veprimin e kopjimit. Ju lutemi shfrytëzoni tastierën për këtë veprim (Ctrl/Cmd+C).","cut":"Preje","cutError":"Të dhënat e sigurisë së shfletuesit tuaj nuk lejojnë që redaktuesi automatikisht të kryej veprimin e prerjes. Ju lutemi shfrytëzoni tastierën për këtë veprim (Ctrl/Cmd+X).","paste":"Hidhe","pasteArea":"Hapësira Hedhëse","pasteMsg":"Ju lutemi hidhni brenda kutizës në vijim duke shfrytëzuar tastierën (<strong>Ctrl/Cmd+V</strong>) dhe shtypni Mirë.","securityMsg":"Për shkak të dhënave të sigurisë së shfletuesit tuaj, redaktuesi nuk është në gjendje të i qaset drejtpërdrejtë të dhanve të tabelës suaj të punës. Ju duhet të hidhni atë përsëri në këtë dritare.","title":"Hidhe"},"contextmenu":{"options":"Mundësitë e Menysë së Kontekstit"},"button":{"selectedLabel":"%1 (Përzgjedhur)"},"toolbar":{"toolbarCollapse":"Zvogëlo Shiritin","toolbarExpand":"Zgjero Shiritin","toolbarGroups":{"document":"Dokument","clipboard":"Tabela Punës/Ribëje","editing":"Duke Redaktuar","forms":"Formular","basicstyles":"Stili Bazë","paragraph":"Paragraf","links":"Nyjet","insert":"Shto","styles":"Stil","colors":"Ngjyrat","tools":"Mjetet"},"toolbars":"Shiritet e Redaktuesit"},"elementspath":{"eleLabel":"Rruga e elementeve","eleTitle":"%1 element"},"format":{"label":"Formati","panelTitle":"Formati i Paragrafit","tag_address":"Adresa","tag_div":"Normal (DIV)","tag_h1":"Titulli 1","tag_h2":"Titulli 2","tag_h3":"Titulli 3","tag_h4":"Titulli 4","tag_h5":"Titulli 5","tag_h6":"Titulli 6","tag_p":"Normal","tag_pre":"Formatuar"},"horizontalrule":{"toolbar":"Vendos Vijë Horizontale"},"image":{"alertUrl":"Ju lutemi shkruani URL-në e fotos","alt":"Tekst Alternativ","border":"Korniza","btnUpload":"Dërgo në server","button2Img":"Dëshironi të e ndërroni pullën e fotos së selektuar në një foto të thjeshtë?","hSpace":"HSpace","img2Button":"Dëshironi të ndryshoni foton e përzgjedhur në pullë?","infoTab":"Informacione mbi Fotografinë","linkTab":"Nyja","lockRatio":"Mbyll Racionin","menu":"Karakteristikat e Fotografisë","resetSize":"Rikthe Madhësinë","title":"Karakteristikat e Fotografisë","titleButton":"Karakteristikat e Pullës së Fotografisë","upload":"Ngarko","urlMissing":"Mungon URL e burimit të fotografisë.","vSpace":"Hapësira Vertikale","validateBorder":"Korniza duhet të jetë numër i plotë.","validateHSpace":"Hapësira horizontale duhet të jetë numër i plotë.","validateVSpace":"Hapësira vertikale duhet të jetë numër i plotë."},"indent":{"indent":"Rrite Identin","outdent":"Zvogëlo Identin"},"fakeobjects":{"anchor":"Spirancë","flash":"Objekt flash","hiddenfield":"Fushë e fshehur","iframe":"IFrame","unknown":"Objekt i Panjohur"},"link":{"acccessKey":"Sipas ID-së së Elementit","advanced":"Të përparuara","advisoryContentType":"Lloji i Përmbajtjes Këshillimore","advisoryTitle":"Titull","anchor":{"toolbar":"Spirancë","menu":"Redakto Spirancën","title":"Anchor Properties","name":"Emri i Spirancës","errorName":"Ju lutemi shkruani emrin e spirancës","remove":"Largo Spirancën"},"anchorId":"Sipas ID-së së Elementit","anchorName":"Sipas Emrit të Spirancës","charset":"Seti i Karaktereve të Burimeve të Nëdlidhura","cssClasses":"Klasa stili CSS","emailAddress":"Posta Elektronike","emailBody":"Trupi i Porosisë","emailSubject":"Titulli i Porosisë","id":"Id","info":"Informacione të Nyjes","langCode":"Kod gjuhe","langDir":"Drejtim teksti","langDirLTR":"Nga e majta në të djathë (LTR)","langDirRTL":"Nga e djathta në të majtë (RTL)","menu":"Redakto Nyjen","name":"Emër","noAnchors":"(Nuk ka asnjë spirancë në dokument)","noEmail":"Ju lutemi shkruani postën elektronike","noUrl":"Ju lutemi shkruani URL-në e nyjes","other":"<tjetër>","popupDependent":"E Varur (Netscape)","popupFeatures":"Karakteristikat e Dritares së Dialogut","popupFullScreen":"Ekran i Plotë (IE)","popupLeft":"Pozita Majtas","popupLocationBar":"Shiriti i Lokacionit","popupMenuBar":"Shiriti i Menysë","popupResizable":"I ndryshueshëm","popupScrollBars":"Shiritat zvarritës","popupStatusBar":"Shiriti i Statutit","popupToolbar":"Shiriti i Mejteve","popupTop":"Top Pozita","rel":"Marrëdhëniet","selectAnchor":"Përzgjidh një Spirancë","styles":"Stil","tabIndex":"Indeksi i fletave","target":"Objektivi","targetFrame":"<frame>","targetFrameName":"Emri i Kornizës së Synuar","targetPopup":"<popup window>","targetPopupName":"Emri i Dritares së Dialogut","title":"Nyja","toAnchor":"Lidhu me spirancën në tekst","toEmail":"Posta Elektronike","toUrl":"URL","toolbar":"Nyja","type":"Lloji i Nyjes","unlink":"Largo Nyjen","upload":"Ngarko"},"list":{"bulletedlist":"Vendos/Largo Listën me Pika","numberedlist":"Vendos/Largo Listën me Numra"},"magicline":{"title":"Vendos paragraf këtu"},"maximize":{"maximize":"Zmadho","minimize":"Zvogëlo"},"pastetext":{"button":"Hidhe si tekst të thjeshtë","title":"Hidhe si Tekst të Thjeshtë"},"pastefromword":{"confirmCleanup":"Teksti që dëshironi të e hidhni siç duket është kopjuar nga Word-i. Dëshironi të e pastroni para se të e hidhni?","error":"Nuk ishte e mundur të fshiheshin të dhënat e hedhura për shkak të një gabimi të brendshëm","title":"Hidhe nga Word-i","toolbar":"Hidhe nga Word-i"},"removeformat":{"toolbar":"Largo Formatin"},"sourcearea":{"toolbar":"Burimi"},"specialchar":{"options":"Mundësitë për Karaktere Speciale","title":"Përzgjidh Karakter Special","toolbar":"Vendos Karakter Special"},"scayt":{"btn_about":"About SCAYT","btn_dictionaries":"Dictionaries","btn_disable":"Disable SCAYT","btn_enable":"Enable SCAYT","btn_langs":"Languages","btn_options":"Options","text_title":"Spell Check As You Type"},"stylescombo":{"label":"Stil","panelTitle":"Stilet e Formatimit","panelTitle1":"Stilet e Bllokut","panelTitle2":"Stili i Brendshëm","panelTitle3":"Stilet e Objektit"},"table":{"border":"Madhësia e kornizave","caption":"Titull","cell":{"menu":"Qeli","insertBefore":"Shto Qeli Para","insertAfter":"Shto Qeli Prapa","deleteCell":"Gris Qelitë","merge":"Bashko Qelitë","mergeRight":"Bashko Djathtas","mergeDown":"Bashko Poshtë","splitHorizontal":"Ndaj Qelinë Horizontalisht","splitVertical":"Ndaj Qelinë Vertikalisht","title":"Rekuizitat e Qelisë","cellType":"Lloji i Qelisë","rowSpan":"Bashko Rreshtat","colSpan":"Bashko Kolonat","wordWrap":"Fund i Fjalës","hAlign":"Bashkimi Horizontal","vAlign":"Bashkimi Vertikal","alignBaseline":"Baza","bgColor":"Ngjyra e Prapavijës","borderColor":"Ngjyra e Kornizave","data":"Të dhënat","header":"Koka","yes":"Po","no":"Jo","invalidWidth":"Gjerësia e qelisë duhet të jetë numër.","invalidHeight":"Lartësia e qelisë duhet të jetë numër.","invalidRowSpan":"Hapësira e rreshtave duhet të jetë numër i plotë.","invalidColSpan":"Hapësira e kolonave duhet të jetë numër i plotë.","chooseColor":"Përzgjidh"},"cellPad":"Mbushja e qelisë","cellSpace":"Hapësira e qelisë","column":{"menu":"Kolona","insertBefore":"Vendos Kolonë Para","insertAfter":"Vendos Kolonë Pas","deleteColumn":"Gris Kolonat"},"columns":"Kolonat","deleteTable":"Gris Tabelën","headers":"Kokat","headersBoth":"Së bashku","headersColumn":"Kolona e parë","headersNone":"Asnjë","headersRow":"Rreshti i Parë","invalidBorder":"Madhësia e kufinjve duhet të jetë numër.","invalidCellPadding":"Mbushja e qelisë duhet të jetë numër pozitiv.","invalidCellSpacing":"Hapësira e qelisë duhet të jetë numër pozitiv.","invalidCols":"Numri i kolonave duhet të jetë numër më i madh se 0.","invalidHeight":"Lartësia e tabelës duhet të jetë numër.","invalidRows":"Numri i rreshtave duhet të jetë numër më i madh se 0.","invalidWidth":"Gjerësia e tabelës duhet të jetë numër.","menu":"Karakteristikat e Tabelës","row":{"menu":"Rreshti","insertBefore":"Shto Rresht Para","insertAfter":"Shto Rresht Prapa","deleteRow":"Gris Rreshtat"},"rows":"Rreshtat","summary":"Përmbledhje","title":"Karakteristikat e Tabelës","toolbar":"Tabela","widthPc":"përqind","widthPx":"piksell","widthUnit":"njësia e gjerësisë"},"undo":{"redo":"Ribëje","undo":"Rizhbëje"},"wsc":{"btnIgnore":"Ignore","btnIgnoreAll":"Ignore All","btnReplace":"Replace","btnReplaceAll":"Replace All","btnUndo":"Undo","changeTo":"Change to","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Spell checker not installed. Do you want to download it now?","manyChanges":"Spell check complete: %1 words changed","noChanges":"Spell check complete: No words changed","noMispell":"Spell check complete: No misspellings found","noSuggestions":"- No suggestions -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Not in dictionary","oneChange":"Spell check complete: One word changed","progress":"Spell check in progress...","title":"Spell Checker","toolbar":"Check Spelling"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/sr-latn.js b/js/ckeditor/lang/sr-latn.js
new file mode 100644
index 0000000..0e51ad5
--- /dev/null
+++ b/js/ckeditor/lang/sr-latn.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['sr-latn']={"editor":"Bogati ureÄ‘ivaÄ teksta","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Press ALT 0 for help","browseServer":"Pretraži server","url":"URL","protocol":"Protokol","upload":"PoÅ¡alji","uploadSubmit":"PoÅ¡alji na server","image":"Slika","flash":"FleÅ¡","form":"Forma","checkbox":"Polje za potvrdu","radio":"Radio-dugme","textField":"Tekstualno polje","textarea":"Zona teksta","hiddenField":"Skriveno polje","button":"Dugme","select":"Izborno polje","imageButton":"Dugme sa slikom","notSet":"<nije postavljeno>","id":"Id","name":"Naziv","langDir":"Smer jezika","langDirLtr":"S leva na desno (LTR)","langDirRtl":"S desna na levo (RTL)","langCode":"KĂ´d jezika","longDescr":"Pun opis URL","cssClass":"Stylesheet klase","advisoryTitle":"Advisory naslov","cssStyle":"Stil","ok":"OK","cancel":"Otkaži","close":"Zatvori","preview":"Izgled stranice","resize":"Resize","generalTab":"OpÅ¡te","advancedTab":"Napredni tagovi","validateNumberFailed":"Ova vrednost nije broj.","confirmNewPage":"NesaÄuvane promene ovog sadržaja će biti izgubljene. Jeste li sigurni da želita da uÄitate novu stranu?","confirmCancel":"You have changed some options. Are you sure you want to close the dialog window?","options":"Opcije","target":"Meta","targetNew":"Novi prozor (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Isti prozor (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"S leva na desno (LTR)","langDirRTL":"S desna na levo (RTL)","styles":"Stil","cssClasses":"Stylesheet klase","width":"Å irina","height":"Visina","align":"Ravnanje","alignLeft":"Levo","alignRight":"Desno","alignCenter":"Sredina","alignJustify":"Obostrano ravnanje","alignTop":"Vrh","alignMiddle":"Sredina","alignBottom":"Dole","alignNone":"None","invalidValue":"Invalid value.","invalidHeight":"Visina mora biti broj.","invalidWidth":"Å irina mora biti broj.","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>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Podebljano","italic":"Kurziv","strike":"Precrtano","subscript":"Indeks","superscript":"Stepen","underline":"PodvuÄeno"},"blockquote":{"toolbar":"Block Quote"},"clipboard":{"copy":"Kopiraj","copyError":"Sigurnosna podeÅ¡avanja VaÅ¡eg pretraživaÄa ne dozvoljavaju operacije automatskog kopiranja teksta. Molimo Vas da koristite preÄicu sa tastature (Ctrl/Cmd+C).","cut":"Iseci","cutError":"Sigurnosna podeÅ¡avanja VaÅ¡eg pretraživaÄa ne dozvoljavaju operacije automatskog isecanja teksta. Molimo Vas da koristite preÄicu sa tastature (Ctrl/Cmd+X).","paste":"Zalepi","pasteArea":"Prostor za lepljenje","pasteMsg":"Molimo Vas da zalepite unutar donje povrine koristeći tastaturnu preÄicu (<STRONG>Ctrl/Cmd+V</STRONG>) i da pritisnete <STRONG>OK</STRONG>.","securityMsg":"Zbog sigurnosnih postavki vaÅ¡eg pregledaÄa, editor nije u mogućnosti da direktno pristupi podacima u klipbordu. Potrebno je da zalepite joÅ¡ jednom u ovom prozoru.","title":"Zalepi"},"contextmenu":{"options":"Context Menu Options"},"button":{"selectedLabel":"%1 (Selected)"},"toolbar":{"toolbarCollapse":"Suzi alatnu traku","toolbarExpand":"ProÅ¡iri alatnu traku","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":"Alatne trake"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"format":{"label":"Format","panelTitle":"Format","tag_address":"Adresa","tag_div":"Normalno (DIV)","tag_h1":"Naslov 1","tag_h2":"Naslov 2","tag_h3":"Naslov 3","tag_h4":"Naslov 4","tag_h5":"Naslov 5","tag_h6":"Naslov 6","tag_p":"Normal","tag_pre":"Formatirano"},"horizontalrule":{"toolbar":"Unesi horizontalnu liniju"},"image":{"alertUrl":"Unesite URL slike","alt":"Alternativni tekst","border":"Okvir","btnUpload":"PoÅ¡alji na 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":"Info slike","linkTab":"Link","lockRatio":"ZakljuÄaj odnos","menu":"Osobine slika","resetSize":"Resetuj veliÄinu","title":"Osobine slika","titleButton":"Osobine dugmeta sa slikom","upload":"PoÅ¡alji","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":"Uvećaj levu marginu","outdent":"Smanji levu marginu"},"fakeobjects":{"anchor":"Unesi/izmeni sidro","flash":"Flash Animation","hiddenfield":"Skriveno polje","iframe":"IFrame","unknown":"Unknown Object"},"link":{"acccessKey":"Pristupni taster","advanced":"Napredni tagovi","advisoryContentType":"Advisory vrsta sadržaja","advisoryTitle":"Advisory naslov","anchor":{"toolbar":"Unesi/izmeni sidro","menu":"Osobine sidra","title":"Osobine sidra","name":"Naziv sidra","errorName":"Unesite naziv sidra","remove":"Ukloni sidro"},"anchorId":"Po Id-u elementa","anchorName":"Po nazivu sidra","charset":"Linked Resource Charset","cssClasses":"Stylesheet klase","emailAddress":"E-Mail adresa","emailBody":"Sadržaj poruke","emailSubject":"Naslov","id":"Id","info":"Link Info","langCode":"Smer jezika","langDir":"Smer jezika","langDirLTR":"S leva na desno (LTR)","langDirRTL":"S desna na levo (RTL)","menu":"Izmeni link","name":"Naziv","noAnchors":"(Nema dostupnih sidra)","noEmail":"Otkucajte adresu elektronske pote","noUrl":"Unesite URL linka","other":"<Đ¾ÑÑ‚Đ°Đ»Đ¾>","popupDependent":"Zavisno (Netscape)","popupFeatures":"Mogućnosti popup prozora","popupFullScreen":"Prikaz preko celog ekrana (IE)","popupLeft":"Od leve ivice ekrana (px)","popupLocationBar":"Lokacija","popupMenuBar":"Kontekstni meni","popupResizable":"Promenljive veliÄine","popupScrollBars":"Scroll bar","popupStatusBar":"Statusna linija","popupToolbar":"Toolbar","popupTop":"Od vrha ekrana (px)","rel":"Odnos","selectAnchor":"Odaberi sidro","styles":"Stil","tabIndex":"Tab indeks","target":"Meta","targetFrame":"<okvir>","targetFrameName":"Naziv odrediÅ¡nog frejma","targetPopup":"<popup prozor>","targetPopupName":"Naziv popup prozora","title":"Link","toAnchor":"Sidro na ovoj stranici","toEmail":"E-Mail","toUrl":"URL","toolbar":"Unesi/izmeni link","type":"Vrsta linka","unlink":"Ukloni link","upload":"PoÅ¡alji"},"list":{"bulletedlist":"Nenabrojiva lista","numberedlist":"Nabrojiva lista"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximize","minimize":"Minimize"},"pastetext":{"button":"Zalepi kao Äist tekst","title":"Zalepi kao Äist tekst"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Zalepi iz Worda","toolbar":"Zalepi iz Worda"},"removeformat":{"toolbar":"Ukloni formatiranje"},"sourcearea":{"toolbar":"KĂ´d"},"specialchar":{"options":"Special Character Options","title":"Odaberite specijalni karakter","toolbar":"Unesi specijalni karakter"},"scayt":{"btn_about":"About SCAYT","btn_dictionaries":"Dictionaries","btn_disable":"Disable SCAYT","btn_enable":"Enable SCAYT","btn_langs":"Languages","btn_options":"Options","text_title":"Spell Check As You Type"},"stylescombo":{"label":"Stil","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"VeliÄina okvira","caption":"Naslov tabele","cell":{"menu":"Cell","insertBefore":"Insert Cell Before","insertAfter":"Insert Cell After","deleteCell":"ObriÅ¡i ćelije","merge":"Spoj celije","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":"Razmak ćelija","cellSpace":"Ćelijski prostor","column":{"menu":"Column","insertBefore":"Insert Column Before","insertAfter":"Insert Column After","deleteColumn":"ObriÅ¡i kolone"},"columns":"Kolona","deleteTable":"IzbriÅ¡i tabelu","headers":"Zaglavlja","headersBoth":"Oba","headersColumn":"Prva kolona","headersNone":"None","headersRow":"Prvi red","invalidBorder":"VeliÄina okvira mora biti broj.","invalidCellPadding":"Padding polja mora biti pozitivan broj.","invalidCellSpacing":"Razmak izmeÄ‘u ćelija mora biti pozitivan broj.","invalidCols":"Broj kolona mora biti broj veći od 0.","invalidHeight":"Visina tabele mora biti broj.","invalidRows":"Broj redova mora biti veći od 0.","invalidWidth":"Å irina tabele mora biti broj.","menu":"Osobine tabele","row":{"menu":"Row","insertBefore":"Insert Row Before","insertAfter":"Insert Row After","deleteRow":"ObriÅ¡i redove"},"rows":"Redova","summary":"Sažetak","title":"Osobine tabele","toolbar":"Tabela","widthPc":"procenata","widthPx":"piksela","widthUnit":"jedinica za Å¡irinu"},"undo":{"redo":"Ponovi akciju","undo":"Poni�ti akciju"},"wsc":{"btnIgnore":"IgnoriÅ¡i","btnIgnoreAll":"IgnoriÅ¡i sve","btnReplace":"Zameni","btnReplaceAll":"Zameni sve","btnUndo":"Vrati akciju","changeTo":"Izmeni","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Provera spelovanja nije instalirana. Da li želite da je skinete sa Interneta?","manyChanges":"Provera spelovanja zavrÅ¡ena: %1 reÄ(i) je izmenjeno","noChanges":"Provera spelovanja zavrÅ¡ena: Nije izmenjena nijedna rec","noMispell":"Provera spelovanja zavrÅ¡ena: greÅ¡ke nisu pronadene","noSuggestions":"- Bez sugestija -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Nije u reÄniku","oneChange":"Provera spelovanja zavrÅ¡ena: Izmenjena je jedna reÄ","progress":"Provera spelovanja u toku...","title":"Spell Checker","toolbar":"Proveri spelovanje"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/sr.js b/js/ckeditor/lang/sr.js
new file mode 100644
index 0000000..1b4b43e
--- /dev/null
+++ b/js/ckeditor/lang/sr.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['sr']={"editor":"Rich Text Editor","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Press ALT 0 for help","browseServer":"ĐŸÑ€ĐµÑ‚Ñ€Đ°Đ¶Đ¸ ÑĐµÑ€Đ²ĐµÑ€","url":"Đ£Đ Đ›","protocol":"ĐŸÑ€Đ¾Ñ‚Đ¾ĐºĐ¾Đ»","upload":"ĐŸĐ¾ÑˆĐ°Ñ™Đ¸","uploadSubmit":"ĐŸĐ¾ÑˆĐ°Ñ™Đ¸ Đ½Đ° ÑĐµÑ€Đ²ĐµÑ€","image":"Đ¡Đ»Đ¸ĐºĐ°","flash":"Đ¤Đ»ĐµÑˆ ĐµĐ»ĐµĐ¼ĐµĐ½Ñ‚","form":"Đ¤Đ¾Ñ€Đ¼Đ°","checkbox":"ĐŸĐ¾Ñ™Đµ Đ·Đ° Đ¿Đ¾Ñ‚Đ²Ñ€Đ´Ñƒ","radio":"Đ Đ°Đ´Đ¸Đ¾-Đ´ÑƒĐ³Đ¼Đµ","textField":"Đ¢ĐµĐºÑÑ‚ÑƒĐ°Đ»Đ½Đ¾ Đ¿Đ¾Ñ™Đµ","textarea":"Đ—Đ¾Đ½Đ° Ñ‚ĐµĐºÑÑ‚Đ°","hiddenField":"Đ¡ĐºÑ€Đ¸Đ²ĐµĐ½Đ¾ Đ¿Đ¾Ñ™Đµ","button":"Đ”ÑƒĐ³Đ¼Đµ","select":"Đ˜Đ·Đ±Đ¾Ñ€Đ½Đ¾ Đ¿Đ¾Ñ™Đµ","imageButton":"Đ”ÑƒĐ³Đ¼Đµ ÑĐ° ÑĐ»Đ¸ĐºĐ¾Đ¼","notSet":"<Đ½Đ¸Ñ˜Đµ Đ¿Đ¾ÑÑ‚Đ°Đ²Ñ™ĐµĐ½Đ¾>","id":"Đ˜Đ´","name":"ĐĐ°Đ·Đ¸Đ²","langDir":"Đ¡Đ¼ĐµÑ€ Ñ˜ĐµĐ·Đ¸ĐºĐ°","langDirLtr":"Đ¡ Đ»ĐµĐ²Đ° Đ½Đ° деÑĐ½Đ¾ (LTR)","langDirRtl":"Đ¡ деÑĐ½Đ° Đ½Đ° Đ»ĐµĐ²Đ¾ (RTL)","langCode":"KĂ´Đ´ Ñ˜ĐµĐ·Đ¸ĐºĐ°","longDescr":"ĐŸÑƒĐ½ Đ¾Đ¿Đ¸Ñ Đ£Đ Đ›","cssClass":"Stylesheet ĐºĐ»Đ°Ñе","advisoryTitle":"Advisory Đ½Đ°ÑĐ»Đ¾Đ²","cssStyle":"Đ¡Ñ‚Đ¸Đ»","ok":"OK","cancel":"OÑ‚ĐºĐ°Đ¶Đ¸","close":"Đ—Đ°Ñ‚Đ²Đ¾Ñ€Đ¸","preview":"Đ˜Đ·Đ³Đ»ĐµĐ´ ÑÑ‚Ñ€Đ°Đ½Đ¸Ñ†Đµ","resize":"Resize","generalTab":"ĐĐ¿ÑˆÑ‚Đµ","advancedTab":"ĐĐ°Đ¿Ñ€ĐµĐ´Đ½Đ¸ Ñ‚Đ°Đ³Đ¾Đ²Đ¸","validateNumberFailed":"ĐĐ²Đ° Đ²Ñ€ĐµĐ´Đ½Đ¾ÑÑ‚ Đ½Đ¸Ñ˜Đµ Ñ†Đ¸Đ³Ñ€Đ°.","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":"ĐĐ¿Ñ†Đ¸Ñ˜Đµ","target":"MeÑ‚a","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"Đ¡ Đ»ĐµĐ²Đ° Đ½Đ° деÑĐ½Đ¾ (LTR)","langDirRTL":"Đ¡ деÑĐ½Đ° Đ½Đ° Đ»ĐµĐ²Đ¾ (RTL)","styles":"Đ¡Ñ‚Đ¸Đ»","cssClasses":"Stylesheet ĐºĐ»Đ°Ñе","width":"Đ¨Đ¸Ñ€Đ¸Đ½Đ°","height":"ВиÑĐ¸Đ½Đ°","align":"Đ Đ°Đ²Đ½Đ°Ñе","alignLeft":"Đ›ĐµĐ²Đ¾","alignRight":"ДеÑĐ½Đ¾","alignCenter":"Đ¡Ñ€ĐµĐ´Đ¸Đ½Đ°","alignJustify":"ĐĐ±Đ¾ÑÑ‚Ñ€Đ°Đ½Đ¾ Ñ€Đ°Đ²Đ½Đ°Ñе","alignTop":"Đ’Ñ€Ñ…","alignMiddle":"Đ¡Ñ€ĐµĐ´Đ¸Đ½Đ°","alignBottom":"Đ”Đ¾Đ»Đµ","alignNone":"None","invalidValue":"Invalid value.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","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>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"ĐŸĐ¾Đ´ĐµĐ±Ñ™Đ°Đ½Đ¾","italic":"ĐÑƒÑ€Đ·Đ¸Đ²","strike":"ĐŸÑ€ĐµÑ†Ñ€Ñ‚Đ°Đ½Đ¾","subscript":"Đ˜Đ½Đ´ĐµĐºÑ","superscript":"Đ¡Ñ‚ĐµĐ¿ĐµĐ½","underline":"ĐŸĐ¾Đ´Đ²ÑƒÑ‡ĐµĐ½Đ¾"},"blockquote":{"toolbar":"Block Quote"},"clipboard":{"copy":"ĐĐ¾Đ¿Đ¸Ñ€Đ°Ñ˜","copyError":"Đ¡Đ¸Đ³ÑƒÑ€Đ½Đ¾ÑĐ½Đ° Đ¿Đ¾Đ´ĐµÑˆĐ°Đ²Đ°ÑĐ° Đ’Đ°ÑˆĐµĐ³ Đ¿Ñ€ĐµÑ‚Ñ€Đ°Đ¶Đ¸Đ²Đ°Ñ‡Đ° Đ½Đµ Đ´Đ¾Đ·Đ²Đ¾Ñ™Đ°Đ²Đ°Ñ˜Ñƒ Đ¾Đ¿ĐµÑ€Đ°Ñ†Đ¸Ñ˜Đµ Đ°ÑƒÑ‚Đ¾Đ¼Đ°Ñ‚ÑĐºĐ¾Đ³ ĐºĐ¾Đ¿Đ¸Ñ€Đ°ÑĐ° Ñ‚ĐµĐºÑÑ‚Đ°. ĐœĐ¾Đ»Đ¸Đ¼Đ¾ Đ’Đ°Ñ Đ´Đ° ĐºĐ¾Ñ€Đ¸ÑÑ‚Đ¸Ñ‚Đµ Đ¿Ñ€ĐµÑ‡Đ¸Ñ†Ñƒ ÑĐ° Ñ‚Đ°ÑÑ‚Đ°Ñ‚ÑƒÑ€Đµ (Ctrl/Cmd+C).","cut":"Đ˜ÑĐµÑ†Đ¸","cutError":"Đ¡Đ¸Đ³ÑƒÑ€Đ½Đ¾ÑĐ½Đ° Đ¿Đ¾Đ´ĐµÑˆĐ°Đ²Đ°ÑĐ° Đ’Đ°ÑˆĐµĐ³ Đ¿Ñ€ĐµÑ‚Ñ€Đ°Đ¶Đ¸Đ²Đ°Ñ‡Đ° Đ½Đµ Đ´Đ¾Đ·Đ²Đ¾Ñ™Đ°Đ²Đ°Ñ˜Ñƒ Đ¾Đ¿ĐµÑ€Đ°Ñ†Đ¸Ñ˜Đµ Đ°ÑƒÑ‚Đ¾Đ¼Đ°Ñ‚ÑĐºĐ¾Đ³ иÑĐµÑ†Đ°ÑĐ° Ñ‚ĐµĐºÑÑ‚Đ°. ĐœĐ¾Đ»Đ¸Đ¼Đ¾ Đ’Đ°Ñ Đ´Đ° ĐºĐ¾Ñ€Đ¸ÑÑ‚Đ¸Ñ‚Đµ Đ¿Ñ€ĐµÑ‡Đ¸Ñ†Ñƒ ÑĐ° Ñ‚Đ°ÑÑ‚Đ°Ñ‚ÑƒÑ€Đµ (Ctrl/Cmd+X).","paste":"Đ—Đ°Đ»ĐµĐ¿Đ¸","pasteArea":"Đ—Đ°Đ»ĐµĐ¿Đ¸ Đ·Đ¾Đ½Ñƒ","pasteMsg":"ĐœĐ¾Đ»Đ¸Đ¼Đ¾ Đ’Đ°Ñ Đ´Đ° Đ·Đ°Đ»ĐµĐ¿Đ¸Ñ‚Đµ ÑƒĐ½ÑƒÑ‚Đ°Ñ€ Đ´Đ¾Ñе Đ¿Đ¾Đ²Ñ€ÑˆĐ¸Đ½Đµ ĐºĐ¾Ñ€Đ¸ÑÑ‚ĐµÑ›Đ¸ Ñ‚Đ°ÑÑ‚Đ°Ñ‚ÑƒÑ€Đ½Ñƒ Đ¿Ñ€ĐµÑ‡Đ¸Ñ†Ñƒ (<STRONG>Ctrl/Cmd+V</STRONG>) и Đ´Đ° Đ¿Ñ€Đ¸Ñ‚Đ¸ÑĐ½ĐµÑ‚Đµ <STRONG>OK</STRONG>.","securityMsg":"Đ—Đ±Đ¾Đ³ ÑĐ¸Đ³ÑƒÑ€Đ½Đ¾ÑĐ½Đ¸Ñ… Đ¿Đ¾Đ´ĐµÑˆĐ°Đ²Đ°ÑĐ° Đ¿Ñ€ĐµÑ‚Ñ€Đ°Đ¶Đ¸Đ²Đ°Ñ‡Đ°, ĐµĐ´Đ¸Ñ‚Đ¾Ñ€ Đ½Đµ Đ¼Đ¾Đ¶Đµ Đ´Đ° Đ¿Ñ€Đ¸ÑÑ‚ÑƒĐ¿Đ¸ Đ¾ÑÑ‚Đ°Đ²Ñƒ. Đ¢Ñ€ĐµĐ±Đ°Ñ‚Đµ Đ´Đ° Đ³Đ° Đ¿Đ¾Đ½Đ¾Đ²Đ¾ Đ·Đ°Đ»ĐµĐ¿Đ¸Ñ‚Đµ у Đ¾Đ²Đ¾Đ¼ Đ¿Ñ€Đ¾Đ·Đ¾Ñ€Ñƒ.","title":"Đ—Đ°Đ»ĐµĐ¿Đ¸"},"contextmenu":{"options":"Context Menu Options"},"button":{"selectedLabel":"%1 (Selected)"},"toolbar":{"toolbarCollapse":"Đ¡ĐºĐ»Đ¾Đ¿Đ¸ Đ°Đ»Đ°Ñ‚Đ½Ñƒ Ñ‚Ñ€Đ°ĐºÑƒ","toolbarExpand":"ĐŸÑ€Đ¾ÑˆĐ¸Ñ€Đ¸ Đ°Đ»Đ°Ñ‚Đ½Ñƒ Ñ‚Ñ€Đ°ĐºÑƒ","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":"Đ•Đ´Đ¸Ñ‚Đ¾Ñ€ Đ°Đ»Đ°Ñ‚Đ½Đµ Ñ‚Ñ€Đ°ĐºĐµ"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"format":{"label":"Đ¤Đ¾Ñ€Đ¼Đ°Ñ‚","panelTitle":"Đ¤Đ¾Ñ€Đ¼Đ°Ñ‚","tag_address":"Adresa","tag_div":"ĐĐ¾Ñ€Đ¼Đ°Đ»Đ½Đ¾ (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":"Formatirano"},"horizontalrule":{"toolbar":"Đ£Đ½ĐµÑи Ñ…Đ¾Ñ€Đ¸Đ·Đ¾Đ½Ñ‚Đ°Đ»Đ½Ñƒ Đ»Đ¸Đ½Đ¸Ñ˜Ñƒ"},"image":{"alertUrl":"Đ£Đ½ĐµÑĐ¸Ñ‚Đµ Đ£Đ Đ› ÑĐ»Đ¸ĐºĐµ","alt":"ĐĐ»Ñ‚ĐµÑ€Đ½Đ°Ñ‚Đ¸Đ²Đ½Đ¸ Ñ‚ĐµĐºÑÑ‚","border":"ĐĐºĐ²Đ¸Ñ€","btnUpload":"ĐŸĐ¾ÑˆĐ°Ñ™Đ¸ Đ½Đ° ÑĐµÑ€Đ²ĐµÑ€","button2Img":"Да ли Đ¶ĐµĐ»Đ¸Ñ‚Đµ Đ´Đ° Đ¿Ñ€Đ¾Đ¼ĐµĐ½Đ¸Ñ‚Đµ Đ¾Đ´Đ°Đ±Ñ€Đ°Đ½Ñƒ ÑĐ»Đ¸ĐºÑƒ Đ´ÑƒĐ³Đ¼ĐµÑ‚Đ° ĐºĐ°Đ¾ Ñ˜ĐµĐ´Đ½Đ¾ÑÑ‚Đ°Đ²Đ½Ñƒ ÑĐ»Đ¸ĐºÑƒ?","hSpace":"HSpace","img2Button":"Да ли Đ¶ĐµĐ»Đ¸Ñ‚Đµ Đ´Đ° Đ¿Ñ€Đ¾Đ¼ĐµĐ½Đ¸Ñ‚Đµ Đ¾Đ´Đ°Đ±Ñ€Đ°Đ½Ñƒ ÑĐ»Đ¸ĐºÑƒ у ÑĐ»Đ¸ĐºÑƒ Đ´ÑƒĐ³Đ¼ĐµÑ‚Đ°?","infoTab":"Đ˜Đ½Ñ„Đ¾ ÑĐ»Đ¸ĐºĐµ","linkTab":"Đ›Đ¸Đ½Đº","lockRatio":"Đ—Đ°ĐºÑ™ÑƒÑ‡Đ°Ñ˜ Đ¾Đ´Đ½Đ¾Ñ","menu":"ĐÑĐ¾Đ±Đ¸Đ½Đµ ÑĐ»Đ¸ĐºĐ°","resetSize":"РеÑĐµÑ‚ÑƒÑ˜ Đ²ĐµĐ»Đ¸Ñ‡Đ¸Đ½Ñƒ","title":"ĐÑĐ¾Đ±Đ¸Đ½Đµ ÑĐ»Đ¸ĐºĐ°","titleButton":"ĐÑĐ¾Đ±Đ¸Đ½Đµ Đ´ÑƒĐ³Đ¼ĐµÑ‚Đ° ÑĐ° ÑĐ»Đ¸ĐºĐ¾Đ¼","upload":"ĐŸĐ¾ÑˆĐ°Ñ™Đ¸","urlMissing":"ĐĐµĐ´Đ¾ÑÑ‚Đ°Ñ˜Đµ Đ£Đ Đ› ÑĐ»Đ¸ĐºĐµ.","vSpace":"VSpace","validateBorder":"Đ˜Đ²Đ¸Ñ†Đ° Ñ‚Ñ€ĐµĐ±Đ° Đ´Đ° Đ±ÑƒĐ´Đµ Ñ†Đ¸Ñ„Ñ€Đ°.","validateHSpace":"HSpace Ñ‚Ñ€ĐµĐ±Đ° Đ´Đ° Đ±ÑƒĐ´Đµ Ñ†Đ¸Ñ„Ñ€Đ°.","validateVSpace":"VSpace Ñ‚Ñ€ĐµĐ±Đ° Đ´Đ° Đ±ÑƒĐ´Đµ Ñ†Đ¸Ñ„Ñ€Đ°."},"indent":{"indent":"Đ£Đ²ĐµÑ›Đ°Ñ˜ Đ»ĐµĐ²Ñƒ Đ¼Đ°Ñ€Đ³Đ¸Đ½Ñƒ","outdent":"Đ¡Đ¼Đ°Ñи Đ»ĐµĐ²Ñƒ Đ¼Đ°Ñ€Đ³Đ¸Đ½Ñƒ"},"fakeobjects":{"anchor":"Anchor","flash":"Flash Animation","hiddenfield":"Hidden Field","iframe":"IFrame","unknown":"Unknown Object"},"link":{"acccessKey":"ĐŸÑ€Đ¸ÑÑ‚ÑƒĐ¿Đ½Đ¸ Ñ‚Đ°ÑÑ‚ĐµÑ€","advanced":"ĐĐ°Đ¿Ñ€ĐµĐ´Đ½Đ¸ Ñ‚Đ°Đ³Đ¾Đ²Đ¸","advisoryContentType":"Advisory Đ²Ñ€ÑÑ‚Đ° ÑĐ°Đ´Ñ€Đ¶Đ°Ñ˜Đ°","advisoryTitle":"Advisory Đ½Đ°ÑĐ»Đ¾Đ²","anchor":{"toolbar":"Đ£Đ½ĐµÑи/Đ¸Đ·Đ¼ĐµĐ½Đ¸ ÑĐ¸Đ´Ñ€Đ¾","menu":"ĐÑĐ¾Đ±Đ¸Đ½Đµ ÑĐ¸Đ´Ñ€Đ°","title":"ĐÑĐ¾Đ±Đ¸Đ½Đµ ÑĐ¸Đ´Ñ€Đ°","name":"Đ˜Đ¼Đµ ÑĐ¸Đ´Ñ€Đ°","errorName":"ĐœĐ¾Đ»Đ¸Đ¼Đ¾ Đ’Đ°Ñ Đ´Đ° ÑƒĐ½ĐµÑĐµÑ‚Đµ Đ¸Đ¼Đµ ÑĐ¸Đ´Ñ€Đ°","remove":"Remove Anchor"},"anchorId":"ĐŸo Đ˜Đ´-jу ĐµĐ»ĐµĐ¼ĐµĐ½Ñ‚Đ°","anchorName":"ĐŸĐ¾ Đ½Đ°Đ·Đ¸Đ²Ñƒ ÑĐ¸Đ´Ñ€Đ°","charset":"Linked Resource Charset","cssClasses":"Stylesheet ĐºĐ»Đ°Ñе","emailAddress":"ĐĐ´Ñ€ĐµÑĐ° ĐµĐ»ĐµĐºÑ‚Ñ€Đ¾Đ½ÑĐºĐµ Đ¿Đ¾ÑˆÑ‚Đµ","emailBody":"Đ¡Đ°Đ´Ñ€Đ¶Đ°Ñ˜ Đ¿Đ¾Ñ€ÑƒĐºĐµ","emailSubject":"ĐĐ°ÑĐ»Đ¾Đ²","id":"Đ˜Đ´","info":"Đ›Đ¸Đ½Đº Đ¸Đ½Ñ„Đ¾","langCode":"Đ¡Đ¼ĐµÑ€ Ñ˜ĐµĐ·Đ¸ĐºĐ°","langDir":"Đ¡Đ¼ĐµÑ€ Ñ˜ĐµĐ·Đ¸ĐºĐ°","langDirLTR":"Đ¡ Đ»ĐµĐ²Đ° Đ½Đ° деÑĐ½Đ¾ (LTR)","langDirRTL":"Đ¡ деÑĐ½Đ° Đ½Đ° Đ»ĐµĐ²Đ¾ (RTL)","menu":"ĐŸÑ€Đ¾Đ¼ĐµĐ½Đ¸ Đ»Đ¸Đ½Đº","name":"ĐĐ°Đ·Đ¸Đ²","noAnchors":"(ĐĐµĐ¼Đ° Đ´Đ¾ÑÑ‚ÑƒĐ¿Đ½Đ¸Ñ… ÑĐ¸Đ´Ñ€Đ°)","noEmail":"ĐÑ‚ĐºÑƒÑ†Đ°Ñ˜Ñ‚Đµ Đ°Đ´Ñ€ĐµÑу ĐµĐ»ĐµĐºÑ‚Ñ€Đ¾Đ½ÑĐºĐµ Đ¿Đ¾ÑˆÑ‚Đµ","noUrl":"Đ£Đ½ĐµÑĐ¸Ñ‚Đµ Đ£Đ Đ› Đ»Đ¸Đ½ĐºĐ°","other":"<Đ´Ñ€ÑƒĐ³Đ¾>","popupDependent":"Đ—Đ°Đ²Đ¸ÑĐ½Đ¾ (Netscape)","popupFeatures":"ĐœĐ¾Đ³ÑƒÑ›Đ½Đ¾ÑÑ‚Đ¸ иÑĐºĐ°Ñ‡ÑƒÑ›ĐµĐ³ Đ¿Ñ€Đ¾Đ·Đ¾Ñ€Đ°","popupFullScreen":"ĐŸÑ€Đ¸ĐºĐ°Đ· Đ¿Ñ€ĐµĐºĐ¾ Ñ†ĐµĐ»Đ¾Đ³ ĐµĐºÑ€Đ°Đ½Đ° (Đ˜E)","popupLeft":"ĐĐ´ Đ»ĐµĐ²Đµ Đ¸Đ²Đ¸Ñ†Đµ ĐµĐºÑ€Đ°Đ½Đ° (Đ¿Đ¸ĐºÑела)","popupLocationBar":"Đ›Đ¾ĐºĐ°Ñ†Đ¸Ñ˜Đ°","popupMenuBar":"ĐĐ¾Đ½Ñ‚ĐµĐºÑÑ‚Đ½Đ¸ Đ¼ĐµĐ½Đ¸","popupResizable":"Đ’ĐµĐ»Đ¸Ñ‡Đ¸Đ½Đ° Ñе Đ¼ĐµÑĐ°","popupScrollBars":"Đ¡ĐºÑ€Đ¾Đ» Đ±Đ°Ñ€","popupStatusBar":"Đ¡Ñ‚Đ°Ñ‚ÑƒÑĐ½Đ° Đ»Đ¸Đ½Đ¸Ñ˜Đ°","popupToolbar":"Toolbar","popupTop":"ĐĐ´ Đ²Ñ€Ñ…Đ° ĐµĐºÑ€Đ°Đ½Đ° (Đ¿Đ¸ĐºÑела)","rel":"ĐĐ´Đ½Đ¾Ñ","selectAnchor":"ĐĐ´Đ°Đ±ĐµÑ€Đ¸ ÑĐ¸Đ´Ñ€Đ¾","styles":"Đ¡Ñ‚Đ¸Đ»","tabIndex":"Đ¢Đ°Đ± Đ¸Đ½Đ´ĐµĐºÑ","target":"MeÑ‚a","targetFrame":"<Đ¾ĐºĐ²Đ¸Ñ€>","targetFrameName":"ĐĐ°Đ·Đ¸Đ² Đ¾Đ´Ñ€ĐµĐ´Đ¸ÑˆĐ½Đ¾Đ³ Ñ„Ñ€ĐµÑ˜Đ¼Đ°","targetPopup":"<иÑĐºĐ°Ñ‡ÑƒÑ›Đ¸ Đ¿Ñ€Đ¾Đ·Đ¾Ñ€>","targetPopupName":"ĐĐ°Đ·Đ¸Đ² иÑĐºĐ°Ñ‡ÑƒÑ›ĐµĐ³ Đ¿Ñ€Đ¾Đ·Đ¾Ñ€Đ°","title":"Đ›Đ¸Đ½Đº","toAnchor":"Đ¡Đ¸Đ´Ñ€Đ¾ Đ½Đ° Đ¾Đ²Đ¾Ñ˜ ÑÑ‚Ñ€Đ°Đ½Đ¸Ñ†Đ¸","toEmail":"EĐ»ĐµĐºÑ‚Ñ€Đ¾Đ½ÑĐºĐ° Đ¿Đ¾ÑˆÑ‚Đ°","toUrl":"Đ£Đ Đ›","toolbar":"Đ£Đ½ĐµÑи/Đ¸Đ·Đ¼ĐµĐ½Đ¸ Đ»Đ¸Đ½Đº","type":"Đ’Ñ€ÑÑ‚Đ° Đ»Đ¸Đ½ĐºĐ°","unlink":"Đ£ĐºĐ»Đ¾Đ½Đ¸ Đ»Đ¸Đ½Đº","upload":"ĐŸĐ¾ÑˆĐ°Ñ™Đ¸"},"list":{"bulletedlist":"ĐĐµĐ½Đ°Đ±Ñ€Đ¾Ñ˜Đ¸Đ²Đ° лиÑÑ‚Đ°","numberedlist":"ĐĐ°Đ±Ñ€Đ¾Ñ˜Đ¸Đ²Ñƒ лиÑту"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximize","minimize":"Minimize"},"pastetext":{"button":"Đ—Đ°Đ»ĐµĐ¿Đ¸ ĐºĐ°Đ¾ Ñ‡Đ¸ÑÑ‚ Ñ‚ĐµĐºÑÑ‚","title":"Đ—Đ°Đ»ĐµĐ¿Đ¸ ĐºĐ°Đ¾ Ñ‡Đ¸ÑÑ‚ Ñ‚ĐµĐºÑÑ‚"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Đ—Đ°Đ»ĐµĐ¿Đ¸ из Worda","toolbar":"Đ—Đ°Đ»ĐµĐ¿Đ¸ из Worda"},"removeformat":{"toolbar":"Đ£ĐºĐ»Đ¾Đ½Đ¸ Ñ„Đ¾Ñ€Đ¼Đ°Ñ‚Đ¸Ñ€Đ°Ñе"},"sourcearea":{"toolbar":"KĂ´Đ´"},"specialchar":{"options":"ĐĐ¿Ñ†Đ¸Ñ˜Đµ ÑĐ¿ĐµÑ†Đ¸Ñ˜Đ°Đ»Đ½Đ¾Đ³ ĐºĐ°Ñ€Đ°ĐºÑ‚ĐµÑ€Đ°","title":"ĐĐ´Đ°Đ±ĐµÑ€Đ¸Ñ‚Đµ ÑĐ¿ĐµÑ†Đ¸Ñ˜Đ°Đ»Đ½Đ¸ ĐºĐ°Ñ€Đ°ĐºÑ‚ĐµÑ€","toolbar":"Đ£Đ½ĐµÑи ÑĐ¿ĐµÑ†Đ¸Ñ˜Đ°Đ»Đ½Đ¸ ĐºĐ°Ñ€Đ°ĐºÑ‚ĐµÑ€"},"scayt":{"btn_about":"About SCAYT","btn_dictionaries":"Dictionaries","btn_disable":"Disable SCAYT","btn_enable":"Enable SCAYT","btn_langs":"Languages","btn_options":"Options","text_title":"Spell Check As You Type"},"stylescombo":{"label":"Đ¡Ñ‚Đ¸Đ»","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"Đ’ĐµĐ»Đ¸Ñ‡Đ¸Đ½Đ° Đ¾ĐºĐ²Đ¸Ñ€Đ°","caption":"ĐĐ°ÑĐ»Đ¾Đ² Ñ‚Đ°Đ±ĐµĐ»Đµ","cell":{"menu":"Cell","insertBefore":"Insert Cell Before","insertAfter":"Insert Cell After","deleteCell":"ĐĐ±Ñ€Đ¸ÑˆĐ¸ Ñ›ĐµĐ»Đ¸Ñ˜Đµ","merge":"Đ¡Đ¿Đ¾Ñ˜ Ñ›ĐµĐ»Đ¸Ñ˜Đµ","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":"Đ Đ°Đ·Đ¼Đ°Đº Ñ›ĐµĐ»Đ¸Ñ˜Đ°","cellSpace":"Đ‹ĐµĐ»Đ¸Ñ˜ÑĐºĐ¸ Đ¿Ñ€Đ¾ÑÑ‚Đ¾Ñ€","column":{"menu":"Column","insertBefore":"Insert Column Before","insertAfter":"Insert Column After","deleteColumn":"ĐĐ±Ñ€Đ¸ÑˆĐ¸ ĐºĐ¾Đ»Đ¾Đ½Đµ"},"columns":"KĐ¾Đ»Đ¾Đ½Đ°","deleteTable":"ĐĐ±Ñ€Đ¸ÑˆĐ¸ Ñ‚Đ°Đ±Đ»Ñƒ","headers":"ĐŸĐ¾Đ³Đ»Đ°Đ²Ñ™Đ°","headersBoth":"Đба","headersColumn":"ĐŸÑ€Đ²Đ° ĐºĐ¾Đ»Đ¾Đ½Đ°","headersNone":"None","headersRow":"ĐŸÑ€Đ²Đ¸ Ñ€ĐµĐ´","invalidBorder":"Đ’ĐµĐ»Đ¸Ñ‡Đ¸Đ½Đ° Đ¸Đ²Đ¸Ñ†Đµ Ñ‚Ñ€ĐµĐ±Đ° Đ´Đ° Đ±ÑƒĐ´Đµ Ñ†Đ¸Ñ„Ñ€Đ°.","invalidCellPadding":"ĐŸÑƒÑеÑе Ñ›ĐµĐ»Đ¸Ñ˜Đµ Ñ‚Ñ€ĐµĐ±Đ° Đ´Đ° Đ±ÑƒĐ´Đµ Đ¿Đ¾Đ·Đ¸Ñ‚Đ¸Đ²Đ½Đ° Ñ†Đ¸Ñ„Ñ€Đ°.","invalidCellSpacing":"Đ Đ°Đ·Đ¼Đ°Đº Ñ›ĐµĐ»Đ¸Ñ˜Đµ Ñ‚Ñ€ĐµĐ±Đ° Đ´Đ° Đ±ÑƒĐ´Đµ Đ¿Đ¾Đ·Đ¸Ñ‚Đ¸Đ²Đ½Đ° Ñ†Đ¸Ñ„Ñ€Đ°.","invalidCols":"Đ‘Ñ€Đ¾Ñ˜ ĐºĐ¾Đ»Đ¾Đ½Đ° Ñ‚Ñ€ĐµĐ±Đ° Đ´Đ° Đ±ÑƒĐ´Đµ Ñ†Đ¸Ñ„Ñ€Đ° Đ²ĐµÑ›Đ° Đ¾Đ´ 0.","invalidHeight":"ВиÑĐ¸Đ½Đ° Ñ‚Đ°Đ±ĐµĐ»Đµ Ñ‚Ñ€ĐµĐ±Đ° Đ´Đ° Đ±ÑƒĐ´Đµ Ñ†Đ¸Ñ„Ñ€Đ°.","invalidRows":"Đ‘Ñ€Đ¾Ñ˜ Ñ€ĐµĐ´Đ° Ñ‚Ñ€ĐµĐ±Đ° Đ´Đ° Đ±ÑƒĐ´Đµ Ñ†Đ¸Ñ„Ñ€Đ° Đ²ĐµÑ›Đ° Đ¾Đ´ 0.","invalidWidth":"Đ¨Đ¸Ñ€Đ¸Đ½Đ° Ñ‚Đ°Đ±ĐµĐ»Đµ Ñ‚Ñ€ĐµĐ±Đ° Đ´Đ° Đ±ÑƒĐ´Đµ Ñ†Đ¸Ñ„Ñ€Đ°.","menu":"ĐÑĐ¾Đ±Đ¸Đ½Đµ Ñ‚Đ°Đ±ĐµĐ»Đµ","row":{"menu":"Row","insertBefore":"Insert Row Before","insertAfter":"Insert Row After","deleteRow":"ĐĐ±Ñ€Đ¸ÑˆĐ¸ Ñ€ĐµĐ´Đ¾Đ²Đµ"},"rows":"Đ ĐµĐ´Đ¾Đ²Đ°","summary":"Đ ĐµĐ·Đ¸Đ¼Đµ","title":"ĐÑĐ¾Đ±Đ¸Đ½Đµ Ñ‚Đ°Đ±ĐµĐ»Đµ","toolbar":"Đ¢Đ°Đ±ĐµĐ»Đ°","widthPc":"Đ¿Ñ€Đ¾Ñ†ĐµĐ½Đ°Ñ‚Đ°","widthPx":"Đ¿Đ¸ĐºÑела","widthUnit":"Ñ˜ĐµĐ´Đ¸Đ½Đ¸Ñ†Đ° ÑˆĐ¸Ñ€Đ¸Đ½Đµ"},"undo":{"redo":"ĐŸĐ¾Đ½Đ¾Đ²Đ¸ Đ°ĐºÑ†Đ¸Ñ˜Ñƒ","undo":"ĐŸĐ¾Đ½Đ¸ÑˆÑ‚Đ¸ Đ°ĐºÑ†Đ¸Ñ˜Ñƒ"},"wsc":{"btnIgnore":"Đ˜Đ³Đ½Đ¾Ñ€Đ¸ÑˆĐ¸","btnIgnoreAll":"Đ˜Đ³Đ½Đ¾Ñ€Đ¸ÑˆĐ¸ ÑĐ²Đµ","btnReplace":"Đ—Đ°Đ¼ĐµĐ½Đ¸","btnReplaceAll":"Đ—Đ°Đ¼ĐµĐ½Đ¸ ÑĐ²Đµ","btnUndo":"Đ’Ñ€Đ°Ñ‚Đ¸ Đ°ĐºÑ†Đ¸Ñ˜Ñƒ","changeTo":"Đ˜Đ·Đ¼ĐµĐ½Đ¸","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"ĐŸÑ€Đ¾Đ²ĐµÑ€Đ° ÑĐ¿ĐµĐ»Đ¾Đ²Đ°ÑĐ° Đ½Đ¸Ñ˜Đµ Đ¸Đ½ÑÑ‚Đ°Đ»Đ¸Ñ€Đ°Đ½Đ°. Да ли Đ¶ĐµĐ»Đ¸Ñ‚Đµ Đ´Đ° Ñ˜Đµ ÑĐºĐ¸Đ½ĐµÑ‚Đµ ÑĐ° Đ˜Đ½Ñ‚ĐµÑ€Đ½ĐµÑ‚Đ°?","manyChanges":"ĐŸÑ€Đ¾Đ²ĐµÑ€Đ° ÑĐ¿ĐµĐ»Đ¾Đ²Đ°ÑĐ° Đ·Đ°Đ²Ñ€ÑˆĐµĐ½Đ°: %1 Ñ€ĐµÑ‡(и) Ñ˜Đµ Đ¸Đ·Đ¼ĐµÑĐµĐ½Đ¾","noChanges":"ĐŸÑ€Đ¾Đ²ĐµÑ€Đ° ÑĐ¿ĐµĐ»Đ¾Đ²Đ°ÑĐ° Đ·Đ°Đ²Ñ€ÑˆĐµĐ½Đ°: ĐĐ¸Ñ˜Đµ Đ¸Đ·Đ¼ĐµÑĐµĐ½Đ° Đ½Đ¸Ñ˜ĐµĐ´Đ½Đ° Ñ€ĐµÑ‡","noMispell":"ĐŸÑ€Đ¾Đ²ĐµÑ€Đ° ÑĐ¿ĐµĐ»Đ¾Đ²Đ°ÑĐ° Đ·Đ°Đ²Ñ€ÑˆĐµĐ½Đ°: Đ³Ñ€ĐµÑˆĐºĐµ Đ½Đ¸Ñу Đ¿Ñ€Đ¾Đ½Đ°Ñ’ĐµĐ½Đµ","noSuggestions":"- Без ÑÑƒĐ³ĐµÑÑ‚Đ¸Ñ˜Đ° -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"ĐĐ¸Ñ˜Đµ у Ñ€ĐµÑ‡Đ½Đ¸ĐºÑƒ","oneChange":"ĐŸÑ€Đ¾Đ²ĐµÑ€Đ° ÑĐ¿ĐµĐ»Đ¾Đ²Đ°ÑĐ° Đ·Đ°Đ²Ñ€ÑˆĐµĐ½Đ°: Đ˜Đ·Đ¼ĐµÑĐµĐ½Đ° Ñ˜Đµ Ñ˜ĐµĐ´Đ½Đ° Ñ€ĐµÑ‡","progress":"ĐŸÑ€Đ¾Đ²ĐµÑ€Đ° ÑĐ¿ĐµĐ»Đ¾Đ²Đ°ÑĐ° у Ñ‚Đ¾ĐºÑƒ...","title":"Spell Checker","toolbar":"ĐŸÑ€Đ¾Đ²ĐµÑ€Đ¸ ÑĐ¿ĐµĐ»Đ¾Đ²Đ°Ñе"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/sv.js b/js/ckeditor/lang/sv.js
new file mode 100644
index 0000000..8c3c831
--- /dev/null
+++ b/js/ckeditor/lang/sv.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['sv']={"editor":"Rich Text Editor","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Tryck ALT 0 för hjälp","browseServer":"Bläddra pĂ¥ server","url":"URL","protocol":"Protokoll","upload":"Ladda upp","uploadSubmit":"Skicka till server","image":"Bild","flash":"Flash","form":"Formulär","checkbox":"Kryssruta","radio":"Alternativknapp","textField":"Textfält","textarea":"Textruta","hiddenField":"Dolt fält","button":"Knapp","select":"Flervalslista","imageButton":"Bildknapp","notSet":"<ej angivet>","id":"Id","name":"Namn","langDir":"SprĂ¥kriktning","langDirLtr":"Vänster till Höger (VTH)","langDirRtl":"Höger till Vänster (HTV)","langCode":"SprĂ¥kkod","longDescr":"URL-beskrivning","cssClass":"Stilmall","advisoryTitle":"Titel","cssStyle":"Stilmall","ok":"OK","cancel":"Avbryt","close":"Stäng","preview":"Förhandsgranska","resize":"Dra för att ändra storlek","generalTab":"Allmänt","advancedTab":"Avancerad","validateNumberFailed":"Värdet är inte ett nummer.","confirmNewPage":"Alla ändringar i innehĂ¥llet kommer att förloras. Ă„r du säker pĂ¥ att du vill ladda en ny sida?","confirmCancel":"NĂ¥gra av alternativen har ändrats. Ă„r du säker pĂ¥ att du vill stänga dialogrutan?","options":"Alternativ","target":"MĂ¥l","targetNew":"Nytt fönster (_blank)","targetTop":"Ă–versta fönstret (_top)","targetSelf":"Samma fönster (_self)","targetParent":"FöregĂ¥ende fönster (_parent)","langDirLTR":"Vänster till höger (LTR)","langDirRTL":"Höger till vänster (RTL)","styles":"Stil","cssClasses":"Stilmallar","width":"Bredd","height":"Höjd","align":"Justering","alignLeft":"Vänster","alignRight":"Höger","alignCenter":"Centrerad","alignJustify":"Justera till marginaler","alignTop":"Ă–verkant","alignMiddle":"Mitten","alignBottom":"Nederkant","alignNone":"Ingen","invalidValue":"Felaktigt värde.","invalidHeight":"Höjd mĂ¥ste vara ett nummer.","invalidWidth":"Bredd mĂ¥ste vara ett nummer.","invalidCssLength":"Värdet för fältet \"%1\" mĂ¥ste vara ett positivt nummer med eller utan CSS-mätenheter (px, %, in, cm, mm, em, ex, pt, eller pc).","invalidHtmlLength":"Värdet för fältet \"%1\" mĂ¥ste vara ett positivt nummer med eller utan godkända HTML-mätenheter (px eller %).","invalidInlineStyle":"Det angivna värdet för style mĂ¥ste innehĂ¥lla en eller flera tupler separerade med semikolon i följande format: \"name : value\"","cssLengthTooltip":"Ange ett nummer i pixlar eller ett nummer men godkänd CSS-mätenhet (px, %, in, cm, mm, em, ex, pt, eller pc).","unavailable":"%1<span class=\"cke_accessibility\">, Ej tillgänglig</span>"},"about":{"copy":"Copyright &copy; $1. Alla rättigheter reserverade.","dlgTitle":"Om CKEditor","help":"Se $1 för hjälp.","moreInfo":"För information av licensiering besök vĂ¥r hemsida:","title":"Om CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Fet","italic":"Kursiv","strike":"Genomstruken","subscript":"Nedsänkta tecken","superscript":"Upphöjda tecken","underline":"Understruken"},"blockquote":{"toolbar":"Blockcitat"},"clipboard":{"copy":"Kopiera","copyError":"Säkerhetsinställningar i Er webbläsare tillĂ¥ter inte Ă¥tgärden kopiera. Använd (Ctrl/Cmd+C) istället.","cut":"Klipp ut","cutError":"Säkerhetsinställningar i Er webbläsare tillĂ¥ter inte Ă¥tgärden klipp ut. Använd (Ctrl/Cmd+X) istället.","paste":"Klistra in","pasteArea":"Paste Area","pasteMsg":"Var god och klistra in Er text i rutan nedan genom att använda (<strong>Ctrl/Cmd+V</strong>) klicka sen pĂ¥ OK.","securityMsg":"PĂ¥ grund av din webbläsares säkerhetsinställningar kan verktyget inte fĂ¥ Ă¥tkomst till urklippsdatan. Var god och använd detta fönster istället.","title":"Klistra in"},"contextmenu":{"options":"Context Menu Options"},"button":{"selectedLabel":"%1 (Vald)"},"toolbar":{"toolbarCollapse":"Dölj verktygsfält","toolbarExpand":"Visa verktygsfält","toolbarGroups":{"document":"Dokument","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Redigera verktygsfält"},"elementspath":{"eleLabel":"Elementets sökväg","eleTitle":"%1 element"},"format":{"label":"Teckenformat","panelTitle":"Teckenformat","tag_address":"Adress","tag_div":"Normal (DIV)","tag_h1":"Rubrik 1","tag_h2":"Rubrik 2","tag_h3":"Rubrik 3","tag_h4":"Rubrik 4","tag_h5":"Rubrik 5","tag_h6":"Rubrik 6","tag_p":"Normal","tag_pre":"Formaterad"},"horizontalrule":{"toolbar":"Infoga horisontal linje"},"image":{"alertUrl":"Var god och ange bildens URL","alt":"Alternativ text","border":"Kant","btnUpload":"Skicka till server","button2Img":"Vill du omvandla den valda bildknappen pĂ¥ en enkel bild?","hSpace":"Horis. marginal","img2Button":"Vill du omvandla den valda bildknappen pĂ¥ en enkel bild?","infoTab":"Bildinformation","linkTab":"Länk","lockRatio":"LĂ¥s höjd/bredd förhĂ¥llanden","menu":"Bildegenskaper","resetSize":"Ă…terställ storlek","title":"Bildegenskaper","titleButton":"Egenskaper för bildknapp","upload":"Ladda upp","urlMissing":"Bildkällans URL saknas.","vSpace":"Vert. marginal","validateBorder":"Kantlinje mĂ¥ste vara ett heltal.","validateHSpace":"HSpace mĂ¥ste vara ett heltal.","validateVSpace":"VSpace mĂ¥ste vara ett heltal."},"indent":{"indent":"Ă–ka indrag","outdent":"Minska indrag"},"fakeobjects":{"anchor":"Ankare","flash":"Flashanimation","hiddenfield":"Gömt fält","iframe":"iFrame","unknown":"Okänt objekt"},"link":{"acccessKey":"Behörighetsnyckel","advanced":"Avancerad","advisoryContentType":"InnehĂ¥llstyp","advisoryTitle":"Titel","anchor":{"toolbar":"Infoga/Redigera ankarlänk","menu":"Egenskaper för ankarlänk","title":"Egenskaper för ankarlänk","name":"Ankarnamn","errorName":"Var god ange ett ankarnamn","remove":"Radera ankare"},"anchorId":"Efter element-id","anchorName":"Efter ankarnamn","charset":"Teckenuppställning","cssClasses":"Stilmall","emailAddress":"E-postadress","emailBody":"InnehĂ¥ll","emailSubject":"Ă„mne","id":"Id","info":"Länkinformation","langCode":"SprĂ¥kkod","langDir":"SprĂ¥kriktning","langDirLTR":"Vänster till höger (VTH)","langDirRTL":"Höger till vänster (HTV)","menu":"Redigera länk","name":"Namn","noAnchors":"(Inga ankare kunde hittas)","noEmail":"Var god ange e-postadress","noUrl":"Var god ange länkens URL","other":"<annan>","popupDependent":"Beroende (endast Netscape)","popupFeatures":"Popup-fönstrets egenskaper","popupFullScreen":"Helskärm (endast IE)","popupLeft":"Position frĂ¥n vänster","popupLocationBar":"Adressfält","popupMenuBar":"Menyfält","popupResizable":"Resizable","popupScrollBars":"Scrolllista","popupStatusBar":"Statusfält","popupToolbar":"Verktygsfält","popupTop":"Position frĂ¥n sidans topp","rel":"FörhĂ¥llande","selectAnchor":"Välj ett ankare","styles":"Stilmall","tabIndex":"Tabindex","target":"MĂ¥l","targetFrame":"<ram>","targetFrameName":"MĂ¥lets ramnamn","targetPopup":"<popup-fönster>","targetPopupName":"Popup-fönstrets namn","title":"Länk","toAnchor":"Länk till ankare i texten","toEmail":"E-post","toUrl":"URL","toolbar":"Infoga/Redigera länk","type":"Länktyp","unlink":"Radera länk","upload":"Ladda upp"},"list":{"bulletedlist":"Punktlista","numberedlist":"Numrerad lista"},"magicline":{"title":"Infoga paragraf här"},"maximize":{"maximize":"Maximera","minimize":"Minimera"},"pastetext":{"button":"Klistra in som vanlig text","title":"Klistra in som vanlig text"},"pastefromword":{"confirmCleanup":"Texten du vill klistra in verkar vara kopierad frĂ¥n Word. Vill du rensa den innan du klistrar in den?","error":"Det var inte möjligt att städa upp den inklistrade data pĂ¥ grund av ett internt fel","title":"Klistra in frĂ¥n Word","toolbar":"Klistra in frĂ¥n Word"},"removeformat":{"toolbar":"Radera formatering"},"sourcearea":{"toolbar":"Källa"},"specialchar":{"options":"Alternativ för utökade tecken","title":"Välj utökat tecken","toolbar":"Klistra in utökat tecken"},"scayt":{"btn_about":"Om SCAYT","btn_dictionaries":"Ordlistor","btn_disable":"Inaktivera SCAYT","btn_enable":"Aktivera SCAYT","btn_langs":"SprĂ¥k","btn_options":"Inställningar","text_title":"Stavningskontroll medan du skriver"},"stylescombo":{"label":"Anpassad stil","panelTitle":"Formatmallar","panelTitle1":"Blockstil","panelTitle2":"Inbäddad stil","panelTitle3":"Objektets stil"},"table":{"border":"Kantstorlek","caption":"Rubrik","cell":{"menu":"Cell","insertBefore":"Lägg till cell före","insertAfter":"Lägg till cell efter","deleteCell":"Radera celler","merge":"Sammanfoga celler","mergeRight":"Sammanfoga höger","mergeDown":"Sammanfoga ner","splitHorizontal":"Dela cell horisontellt","splitVertical":"Dela cell vertikalt","title":"Egenskaper för cell","cellType":"Celltyp","rowSpan":"Rad spann","colSpan":"Kolumnen spann","wordWrap":"Radbrytning","hAlign":"Horisontell justering","vAlign":"Vertikal justering","alignBaseline":"Baslinje","bgColor":"Bakgrundsfärg","borderColor":"Ramfärg","data":"Data","header":"Rubrik","yes":"Ja","no":"Nej","invalidWidth":"Cellens bredd mĂ¥ste vara ett nummer.","invalidHeight":"Cellens höjd mĂ¥ste vara ett nummer.","invalidRowSpan":"Radutvidgning mĂ¥ste vara ett heltal.","invalidColSpan":"Kolumn mĂ¥ste vara ett heltal.","chooseColor":"Välj"},"cellPad":"Cellutfyllnad","cellSpace":"CellavstĂ¥nd","column":{"menu":"Kolumn","insertBefore":"Lägg till kolumn före","insertAfter":"Lägg till kolumn efter","deleteColumn":"Radera kolumn"},"columns":"Kolumner","deleteTable":"Radera tabell","headers":"Rubriker","headersBoth":"BĂ¥da","headersColumn":"Första kolumnen","headersNone":"Ingen","headersRow":"Första raden","invalidBorder":"Ram mĂ¥ste vara ett nummer.","invalidCellPadding":"Luft i cell mĂ¥ste vara ett nummer.","invalidCellSpacing":"Luft i cell mĂ¥ste vara ett nummer.","invalidCols":"Antal kolumner mĂ¥ste vara ett nummer större än 0.","invalidHeight":"Tabellens höjd mĂ¥ste vara ett nummer.","invalidRows":"Antal rader mĂ¥ste vara större än 0.","invalidWidth":"Tabell mĂ¥ste vara ett nummer.","menu":"Tabellegenskaper","row":{"menu":"Rad","insertBefore":"Lägg till rad före","insertAfter":"Lägg till rad efter","deleteRow":"Radera rad"},"rows":"Rader","summary":"Sammanfattning","title":"Tabellegenskaper","toolbar":"Tabell","widthPc":"procent","widthPx":"pixlar","widthUnit":"enhet bredd"},"undo":{"redo":"Gör om","undo":"Ă…ngra"},"wsc":{"btnIgnore":"Ignorera","btnIgnoreAll":"Ignorera alla","btnReplace":"Ersätt","btnReplaceAll":"Ersätt alla","btnUndo":"Ă…ngra","changeTo":"Ă„ndra till","errorLoading":"Tjänsten är ej tillgänglig: %s.","ieSpellDownload":"Stavningskontrollen är ej installerad. Vill du göra det nu?","manyChanges":"Stavningskontroll slutförd: %1 ord rättades.","noChanges":"Stavningskontroll slutförd: Inga ord rättades.","noMispell":"Stavningskontroll slutförd: Inga stavfel pĂ¥träffades.","noSuggestions":"- Förslag saknas -","notAvailable":"Tyvärr är tjänsten ej tillgänglig nu","notInDic":"Saknas i ordlistan","oneChange":"Stavningskontroll slutförd: Ett ord rättades.","progress":"Stavningskontroll pĂ¥gĂ¥r...","title":"Kontrollera stavning","toolbar":"Stavningskontroll"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/th.js b/js/ckeditor/lang/th.js
new file mode 100644
index 0000000..09e7e8d
--- /dev/null
+++ b/js/ckeditor/lang/th.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['th']={"editor":"Rich Text Editor","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"à¸à¸” ALT 0 หาà¸à¸•à¹‰à¸­à¸‡à¸à¸²à¸£à¸„วามà¸à¹ˆà¸§à¸¢à¹€à¸«à¸¥à¸·à¸­","browseServer":"เปิดหน้าต่างจัดà¸à¸²à¸£à¹„ฟล์อัà¸à¹‚หลด","url":"ที่อยู่อ้างอิง URL","protocol":"โปรโตคอล","upload":"อัà¸à¹‚หลดไฟล์","uploadSubmit":"อัà¸à¹‚หลดไฟล์ไปเà¸à¹‡à¸à¹„ว้ที่เครื่องà¹à¸¡à¹ˆà¸‚่าย (เซิร์ฟเวอร์)","image":"รูปภาà¸","flash":"ไฟล์ Flash","form":"à¹à¸à¸à¸Ÿà¸­à¸£à¹Œà¸¡","checkbox":"เà¸à¹‡à¸„à¸à¹à¸­à¸","radio":"เรดิโอà¸à¸±à¸•à¸•à¸­à¸™","textField":"เท็à¸à¸‹à¹Œà¸Ÿà¸´à¸¥à¸”์","textarea":"เท็à¸à¸‹à¹Œà¹à¸­à¹€à¸£à¸µà¸¢","hiddenField":"ฮิดเดนฟิลด์","button":"ปุ่ม","select":"à¹à¸–à¸à¸•à¸±à¸§à¹€à¸¥à¸·à¸­à¸","imageButton":"ปุ่มà¹à¸à¸à¸£à¸¹à¸›à¸ à¸²à¸","notSet":"<ไม่ระà¸à¸¸>","id":"ไอดี","name":"à¸à¸·à¹ˆà¸­","langDir":"à¸à¸²à¸£à¹€à¸‚ียน-อ่านภาษา","langDirLtr":"จาà¸à¸‹à¹‰à¸²à¸¢à¹„ปขวา (LTR)","langDirRtl":"จาà¸à¸‚วามาซ้าย (RTL)","langCode":"รหัสภาษา","longDescr":"คำอธิà¸à¸²à¸¢à¸›à¸£à¸°à¸à¸­à¸ URL","cssClass":"คลาสของไฟล์à¸à¸³à¸«à¸™à¸”ลัà¸à¸©à¸“ะà¸à¸²à¸£à¹à¸ªà¸”งผล","advisoryTitle":"คำเà¸à¸£à¸´à¹ˆà¸™à¸™à¸³","cssStyle":"ลัà¸à¸©à¸“ะà¸à¸²à¸£à¹à¸ªà¸”งผล","ok":"ตà¸à¸¥à¸‡","cancel":"ยà¸à¹€à¸¥à¸´à¸","close":"ปิด","preview":"ดูหน้าเอà¸à¸ªà¸²à¸£à¸•à¸±à¸§à¸­à¸¢à¹ˆà¸²à¸‡","resize":"ปรัà¸à¸‚นาด","generalTab":"ทั่วไป","advancedTab":"ขั้นสูง","validateNumberFailed":"ค่านี้ไม่ใà¸à¹ˆà¸•à¸±à¸§à¹€à¸¥à¸‚","confirmNewPage":"à¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡à¹ƒà¸”ๆ ในเนื้อหานี้ ที่ไม่ได้ถูà¸à¸à¸±à¸™à¸—ึà¸à¹„ว้ จะสูà¸à¸«à¸²à¸¢à¸—ั้งหมด คุณà¹à¸™à¹ˆà¹ƒà¸ˆà¸§à¹ˆà¸²à¸ˆà¸°à¹€à¸£à¸µà¸¢à¸à¸«à¸™à¹‰à¸²à¹ƒà¸«à¸¡à¹ˆ?","confirmCancel":"ตัวเลือà¸à¸à¸²à¸‡à¸•à¸±à¸§à¸¡à¸µà¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡ คุณà¹à¸™à¹ˆà¹ƒà¸ˆà¸§à¹ˆà¸²à¸ˆà¸°à¸›à¸´à¸”à¸à¸¥à¹ˆà¸­à¸‡à¹‚ต้ตอà¸à¸™à¸µà¹‰?","options":"ตัวเลือà¸","target":"à¸à¸²à¸£à¹€à¸›à¸´à¸”หน้าลิงค์","targetNew":"หน้าต่างใหม่ (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"หน้าต่างเดียวà¸à¸±à¸™ (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"จาà¸à¸‹à¹‰à¸²à¸¢à¹„ปขวา (LTR)","langDirRTL":"จาà¸à¸‚วามาซ้าย (RTL)","styles":"ลัà¸à¸©à¸“ะà¸à¸²à¸£à¹à¸ªà¸”งผล","cssClasses":"คลาสของไฟล์à¸à¸³à¸«à¸™à¸”ลัà¸à¸©à¸“ะà¸à¸²à¸£à¹à¸ªà¸”งผล","width":"ความà¸à¸§à¹‰à¸²à¸‡","height":"ความสูง","align":"à¸à¸²à¸£à¸ˆà¸±à¸”วาง","alignLeft":"à¸à¸´à¸”ซ้าย","alignRight":"à¸à¸´à¸”ขวา","alignCenter":"à¸à¸¶à¹ˆà¸‡à¸à¸¥à¸²à¸‡","alignJustify":"நியாயபà¯à®ªà®Ÿà¯à®¤à¯à®¤à®µà¯à®®à¯","alignTop":"à¸à¸™à¸ªà¸¸à¸”","alignMiddle":"à¸à¸¶à¹ˆà¸‡à¸à¸¥à¸²à¸‡à¹à¸™à¸§à¸•à¸±à¹‰à¸‡","alignBottom":"à¸à¸´à¸”ด้านล่าง","alignNone":"None","invalidValue":"ค่าไม่ถูà¸à¸•à¹‰à¸­à¸‡","invalidHeight":"ความสูงต้องเป็นตัวเลข","invalidWidth":"ความà¸à¸§à¹‰à¸²à¸‡à¸•à¹‰à¸­à¸‡à¹€à¸›à¹‡à¸™à¸•à¸±à¸§à¹€à¸¥à¸‚","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>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"ตัวหนา","italic":"ตัวเอียง","strike":"ตัวขีดเส้นทัà¸","subscript":"ตัวห้อย","superscript":"ตัวยà¸","underline":"ตัวขีดเส้นใต้"},"blockquote":{"toolbar":"Block Quote"},"clipboard":{"copy":"สำเนา","copyError":"ไม่สามารถสำเนาข้อความที่เลือà¸à¹„ว้ได้เนื่องจาà¸à¸à¸²à¸£à¸à¸³à¸«à¸™à¸”ค่าระดัà¸à¸„วามปลอดภัย. à¸à¸£à¸¸à¸“าใà¸à¹‰à¸›à¸¸à¹ˆà¸¡à¸¥à¸±à¸”เà¸à¸·à¹ˆà¸­à¸§à¸²à¸‡à¸‚้อความà¹à¸—น (à¸à¸”ปุ่ม Ctrl/Cmd à¹à¸¥à¸°à¸•à¸±à¸§ C à¸à¸£à¹‰à¸­à¸¡à¸à¸±à¸™).","cut":"ตัด","cutError":"ไม่สามารถตัดข้อความที่เลือà¸à¹„ว้ได้เนื่องจาà¸à¸à¸²à¸£à¸à¸³à¸«à¸™à¸”ค่าระดัà¸à¸„วามปลอดภัย. à¸à¸£à¸¸à¸“าใà¸à¹‰à¸›à¸¸à¹ˆà¸¡à¸¥à¸±à¸”เà¸à¸·à¹ˆà¸­à¸§à¸²à¸‡à¸‚้อความà¹à¸—น (à¸à¸”ปุ่ม Ctrl/Cmd à¹à¸¥à¸°à¸•à¸±à¸§ X à¸à¸£à¹‰à¸­à¸¡à¸à¸±à¸™).","paste":"วาง","pasteArea":"Paste Area","pasteMsg":"à¸à¸£à¸¸à¸“าใà¸à¹‰à¸„ีย์à¸à¸­à¸£à¹Œà¸”เท่านั้น โดยà¸à¸”ปุ๋ม (<strong>Ctrl/Cmd à¹à¸¥à¸° V</strong>)à¸à¸£à¹‰à¸­à¸¡à¹†à¸à¸±à¸™ à¹à¸¥à¸°à¸à¸” <strong>OK</strong>.","securityMsg":"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.","title":"วาง"},"contextmenu":{"options":"Context Menu Options"},"button":{"selectedLabel":"%1 (Selected)"},"toolbar":{"toolbarCollapse":"ซ่อนà¹à¸–à¸à¹€à¸„รื่องมือ","toolbarExpand":"เปิดà¹à¸–à¸à¹€à¸„รื่องมือ","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":"à¹à¸–à¸à¹€à¸„รื่องมือà¸à¹ˆà¸§à¸¢à¸à¸´à¸¡à¸à¹Œà¸‚้อความ"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"format":{"label":"รูปà¹à¸à¸","panelTitle":"รูปà¹à¸à¸","tag_address":"Address","tag_div":"Paragraph (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":"à¹à¸—รà¸à¹€à¸ªà¹‰à¸™à¸„ั่นà¸à¸£à¸£à¸—ัด"},"image":{"alertUrl":"à¸à¸£à¸¸à¸“าระà¸à¸¸à¸—ี่อยู่อ้างอิงออนไลน์ของไฟล์รูปภาภ(URL)","alt":"คำประà¸à¸­à¸à¸£à¸¹à¸›à¸ à¸²à¸","border":"ขนาดขอà¸à¸£à¸¹à¸›","btnUpload":"อัà¸à¹‚หลดไฟล์ไปเà¸à¹‡à¸à¹„ว้ที่เครื่องà¹à¸¡à¹ˆà¸‚่าย (เซิร์ฟเวอร์)","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"ระยะà¹à¸™à¸§à¸™à¸­à¸™","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"ข้อมูลของรูปภาà¸","linkTab":"ลิ้งค์","lockRatio":"à¸à¸³à¸«à¸™à¸”อัตราส่วน à¸à¸§à¹‰à¸²à¸‡-สูง à¹à¸à¸à¸„งที่","menu":"คุณสมà¸à¸±à¸•à¸´à¸‚อง รูปภาà¸","resetSize":"à¸à¸³à¸«à¸™à¸”รูปเท่าขนาดจริง","title":"คุณสมà¸à¸±à¸•à¸´à¸‚อง รูปภาà¸","titleButton":"คุณสมà¸à¸±à¸•à¸´à¸‚อง ปุ่มà¹à¸à¸à¸£à¸¹à¸›à¸ à¸²à¸","upload":"อัà¸à¹‚หลดไฟล์","urlMissing":"Image source URL is missing.","vSpace":"ระยะà¹à¸™à¸§à¸•à¸±à¹‰à¸‡","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"indent":{"indent":"เà¸à¸´à¹ˆà¸¡à¸£à¸°à¸¢à¸°à¸¢à¹ˆà¸­à¸«à¸™à¹‰à¸²","outdent":"ลดระยะย่อหน้า"},"fakeobjects":{"anchor":"à¹à¸—รà¸/à¹à¸à¹‰à¹„ข Anchor","flash":"ภาà¸à¸­à¸™à¸´à¹€à¸¡à¸à¸±à¹ˆà¸™à¹à¸Ÿà¸¥à¸","hiddenfield":"ฮิดเดนฟิลด์","iframe":"IFrame","unknown":"วัตถุไม่ทราà¸à¸à¸™à¸´à¸”"},"link":{"acccessKey":"à¹à¸­à¸„เซส คีย์","advanced":"ขั้นสูง","advisoryContentType":"à¸à¸™à¸´à¸”ของคำเà¸à¸£à¸´à¹ˆà¸™à¸™à¸³","advisoryTitle":"คำเà¸à¸£à¸´à¹ˆà¸™à¸™à¸³","anchor":{"toolbar":"à¹à¸—รà¸/à¹à¸à¹‰à¹„ข Anchor","menu":"รายละเอียด Anchor","title":"รายละเอียด Anchor","name":"à¸à¸·à¹ˆà¸­ Anchor","errorName":"à¸à¸£à¸¸à¸“าระà¸à¸¸à¸à¸·à¹ˆà¸­à¸‚อง Anchor","remove":"Remove Anchor"},"anchorId":"ไอดี","anchorName":"à¸à¸·à¹ˆà¸­","charset":"ลิงค์เà¸à¸·à¹ˆà¸­à¸¡à¹‚ยงไปยังà¸à¸¸à¸”ตัวอัà¸à¸©à¸£","cssClasses":"คลาสของไฟล์à¸à¸³à¸«à¸™à¸”ลัà¸à¸©à¸“ะà¸à¸²à¸£à¹à¸ªà¸”งผล","emailAddress":"อีเมล์ (E-Mail)","emailBody":"ข้อความ","emailSubject":"หัวเรื่อง","id":"ไอดี","info":"รายละเอียด","langCode":"à¸à¸²à¸£à¹€à¸‚ียน-อ่านภาษา","langDir":"à¸à¸²à¸£à¹€à¸‚ียน-อ่านภาษา","langDirLTR":"จาà¸à¸‹à¹‰à¸²à¸¢à¹„ปขวา (LTR)","langDirRTL":"จาà¸à¸‚วามาซ้าย (RTL)","menu":"à¹à¸à¹‰à¹„ข ลิงค์","name":"à¸à¸·à¹ˆà¸­","noAnchors":"(ยังไม่มีจุดเà¸à¸·à¹ˆà¸­à¸¡à¹‚ยงภายในหน้าเอà¸à¸ªà¸²à¸£à¸™à¸µà¹‰)","noEmail":"à¸à¸£à¸¸à¸“าระà¸à¸¸à¸­à¸µà¹€à¸¡à¸¥à¹Œ (E-mail)","noUrl":"à¸à¸£à¸¸à¸“าระà¸à¸¸à¸—ี่อยู่อ้างอิงออนไลน์ (URL)","other":"<อื่น ๆ>","popupDependent":"à¹à¸ªà¸”งเต็มหน้าจอ (Netscape)","popupFeatures":"คุณสมà¸à¸±à¸•à¸´à¸‚องหน้าจอเล็ภ(Pop-up)","popupFullScreen":"à¹à¸ªà¸”งเต็มหน้าจอ (IE5.5++ เท่านั้น)","popupLeft":"à¸à¸´à¸à¸±à¸”ซ้าย (Left Position)","popupLocationBar":"à¹à¸ªà¸”งที่อยู่ของไฟล์","popupMenuBar":"à¹à¸ªà¸”งà¹à¸–à¸à¹€à¸¡à¸™à¸¹","popupResizable":"สามารถปรัà¸à¸‚นาดได้","popupScrollBars":"à¹à¸ªà¸”งà¹à¸–à¸à¹€à¸¥à¸·à¹ˆà¸­à¸™","popupStatusBar":"à¹à¸ªà¸”งà¹à¸–à¸à¸ªà¸–านะ","popupToolbar":"à¹à¸ªà¸”งà¹à¸–à¸à¹€à¸„รื่องมือ","popupTop":"à¸à¸´à¸à¸±à¸”à¸à¸™ (Top Position)","rel":"ความสัมà¸à¸±à¸™à¸˜à¹Œ","selectAnchor":"ระà¸à¸¸à¸‚้อมูลของจุดเà¸à¸·à¹ˆà¸­à¸¡à¹‚ยง (Anchor)","styles":"ลัà¸à¸©à¸“ะà¸à¸²à¸£à¹à¸ªà¸”งผล","tabIndex":"ลำดัà¸à¸‚อง à¹à¸—็à¸","target":"à¸à¸²à¸£à¹€à¸›à¸´à¸”หน้าลิงค์","targetFrame":"<เปิดในเฟรม>","targetFrameName":"à¸à¸·à¹ˆà¸­à¸—าร์เà¸à¹‡à¸•à¹€à¸Ÿà¸£à¸¡","targetPopup":"<เปิดหน้าจอเล็ภ(Pop-up)>","targetPopupName":"ระà¸à¸¸à¸à¸·à¹ˆà¸­à¸«à¸™à¹‰à¸²à¸ˆà¸­à¹€à¸¥à¹‡à¸ (Pop-up)","title":"ลิงค์เà¸à¸·à¹ˆà¸­à¸¡à¹‚ยงเว็ภอีเมล์ รูปภาภหรือไฟล์อื่นๆ","toAnchor":"จุดเà¸à¸·à¹ˆà¸­à¸¡à¹‚ยง (Anchor)","toEmail":"ส่งอีเมล์ (E-Mail)","toUrl":"ที่อยู่อ้างอิง URL","toolbar":"à¹à¸—รà¸/à¹à¸à¹‰à¹„ข ลิงค์","type":"ประเภทของลิงค์","unlink":"ลภลิงค์","upload":"อัà¸à¹‚หลดไฟล์"},"list":{"bulletedlist":"ลำดัà¸à¸£à¸²à¸¢à¸à¸²à¸£à¹à¸à¸à¸ªà¸±à¸à¸¥à¸±à¸à¸©à¸“์","numberedlist":"ลำดัà¸à¸£à¸²à¸¢à¸à¸²à¸£à¹à¸à¸à¸•à¸±à¸§à¹€à¸¥à¸‚"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"ขยายใหà¸à¹ˆ","minimize":"ย่อขนาด"},"pastetext":{"button":"วางà¹à¸à¸à¸•à¸±à¸§à¸­à¸±à¸à¸©à¸£à¸˜à¸£à¸£à¸¡à¸”า","title":"วางà¹à¸à¸à¸•à¸±à¸§à¸­à¸±à¸à¸©à¸£à¸˜à¸£à¸£à¸¡à¸”า"},"pastefromword":{"confirmCleanup":"ข้อความที่คุณต้องà¸à¸²à¸£à¸§à¸²à¸‡à¸¥à¸‡à¹„ปเป็นข้อความที่คัดลอà¸à¸¡à¸²à¸ˆà¸²à¸à¹‚ปรà¹à¸à¸£à¸¡à¹„มโครซอฟท์เวิร์ด คุณต้องà¸à¸²à¸£à¸¥à¹‰à¸²à¸‡à¸„่าข้อความดังà¸à¸¥à¹ˆà¸²à¸§à¸à¹ˆà¸­à¸™à¸§à¸²à¸‡à¸¥à¸‡à¹„ปหรือไม่?","error":"ไม่สามารถล้างข้อมูลที่ต้องà¸à¸²à¸£à¸§à¸²à¸‡à¹„ด้เนื่องจาà¸à¹€à¸à¸´à¸”ข้อผิดà¸à¸¥à¸²à¸”ภายในระà¸à¸","title":"วางสำเนาจาà¸à¸•à¸±à¸§à¸­à¸±à¸à¸©à¸£à¹€à¸§à¸´à¸£à¹Œà¸”","toolbar":"วางสำเนาจาà¸à¸•à¸±à¸§à¸­à¸±à¸à¸©à¸£à¹€à¸§à¸´à¸£à¹Œà¸”"},"removeformat":{"toolbar":"ล้างรูปà¹à¸à¸"},"sourcearea":{"toolbar":"ดูรหัส HTML"},"specialchar":{"options":"Special Character Options","title":"à¹à¸—รà¸à¸•à¸±à¸§à¸­à¸±à¸à¸©à¸£à¸à¸´à¹€à¸¨à¸©","toolbar":"à¹à¸—รà¸à¸•à¸±à¸§à¸­à¸±à¸à¸©à¸£à¸à¸´à¹€à¸¨à¸©"},"scayt":{"btn_about":"About SCAYT","btn_dictionaries":"Dictionaries","btn_disable":"Disable SCAYT","btn_enable":"Enable SCAYT","btn_langs":"Languages","btn_options":"Options","text_title":"Spell Check As You Type"},"stylescombo":{"label":"ลัà¸à¸©à¸“ะ","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"ขนาดเส้นขอà¸","caption":"หัวเรื่องของตาราง","cell":{"menu":"à¸à¹ˆà¸­à¸‡à¸•à¸²à¸£à¸²à¸‡","insertBefore":"Insert Cell Before","insertAfter":"Insert Cell After","deleteCell":"ลà¸à¸à¹ˆà¸­à¸‡","merge":"ผสานà¸à¹ˆà¸­à¸‡","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":"ระยะà¹à¸™à¸§à¸•à¸±à¹‰à¸‡","cellSpace":"ระยะà¹à¸™à¸§à¸™à¸­à¸™à¸™","column":{"menu":"คอลัมน์","insertBefore":"Insert Column Before","insertAfter":"Insert Column After","deleteColumn":"ลà¸à¸ªà¸”มน์"},"columns":"สดมน์","deleteTable":"ลà¸à¸•à¸²à¸£à¸²à¸‡","headers":"ส่วนหัว","headersBoth":"ทั้งสองอย่าง","headersColumn":"คอลัมน์à¹à¸£à¸","headersNone":"None","headersRow":"à¹à¸–วà¹à¸£à¸","invalidBorder":"ขนาดเส้นà¸à¸£à¸­à¸à¸•à¹‰à¸­à¸‡à¹€à¸›à¹‡à¸™à¸ˆà¸³à¸™à¸§à¸™à¸•à¸±à¸§à¹€à¸¥à¸‚","invalidCellPadding":"à¸à¹ˆà¸­à¸‡à¸§à¹ˆà¸²à¸‡à¸ à¸²à¸¢à¹ƒà¸™à¹€à¸‹à¸¥à¸¥à¹Œà¸•à¹‰à¸­à¸‡à¹€à¸¥à¸‚จำนวนà¸à¸§à¸","invalidCellSpacing":"à¸à¹ˆà¸­à¸‡à¸§à¹ˆà¸²à¸‡à¸ à¸²à¸¢à¹ƒà¸™à¹€à¸‹à¸¥à¸¥à¹Œà¸•à¹‰à¸­à¸‡à¹€à¸›à¹‡à¸™à¹€à¸¥à¸‚จำนวนà¸à¸§à¸","invalidCols":"จำนวนคอลัมน์ต้องเป็นจำนวนมาà¸à¸à¸§à¹ˆà¸² 0","invalidHeight":"ส่วนสูงของตารางต้องเป็นตัวเลข","invalidRows":"จำนวนของà¹à¸–วต้องเป็นจำนวนมาà¸à¸à¸§à¹ˆà¸² 0","invalidWidth":"ความà¸à¸§à¹‰à¸²à¸‡à¸•à¸²à¸£à¸²à¸‡à¸•à¹‰à¸­à¸‡à¹€à¸›à¹‡à¸™à¸•à¸±à¸§à¹€à¸¥à¸‚","menu":"คุณสมà¸à¸±à¸•à¸´à¸‚อง ตาราง","row":{"menu":"à¹à¸–ว","insertBefore":"Insert Row Before","insertAfter":"Insert Row After","deleteRow":"ลà¸à¹à¸–ว"},"rows":"à¹à¸–ว","summary":"สรุปความ","title":"คุณสมà¸à¸±à¸•à¸´à¸‚อง ตาราง","toolbar":"ตาราง","widthPc":"เปอร์เซ็น","widthPx":"จุดสี","widthUnit":"หน่วยความà¸à¸§à¹‰à¸²à¸‡"},"undo":{"redo":"ทำซ้ำคำสั่ง","undo":"ยà¸à¹€à¸¥à¸´à¸à¸„ำสั่ง"},"wsc":{"btnIgnore":"ยà¸à¹€à¸§à¹‰à¸™","btnIgnoreAll":"ยà¸à¹€à¸§à¹‰à¸™à¸—ั้งหมด","btnReplace":"à¹à¸—นที่","btnReplaceAll":"à¹à¸—นที่ทั้งหมด","btnUndo":"ยà¸à¹€à¸¥à¸´à¸","changeTo":"à¹à¸à¹‰à¹„ขเป็น","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"ไม่ได้ติดตั้งระà¸à¸à¸•à¸£à¸§à¸ˆà¸ªà¸­à¸à¸„ำสะà¸à¸”. ต้องà¸à¸²à¸£à¸•à¸´à¸”ตั้งไหมครัà¸?","manyChanges":"ตรวจสอà¸à¸„ำสะà¸à¸”เสร็จสิ้น:: à¹à¸à¹‰à¹„ข %1 คำ","noChanges":"ตรวจสอà¸à¸„ำสะà¸à¸”เสร็จสิ้น: ไม่มีà¸à¸²à¸£à¹à¸à¹‰à¸„ำใดๆ","noMispell":"ตรวจสอà¸à¸„ำสะà¸à¸”เสร็จสิ้น: ไม่à¸à¸à¸„ำสะà¸à¸”ผิด","noSuggestions":"- ไม่มีคำà¹à¸™à¸°à¸™à¸³à¹ƒà¸”ๆ -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"ไม่à¸à¸à¹ƒà¸™à¸”ิà¸à¸à¸±à¸™à¸™à¸²à¸£à¸µ","oneChange":"ตรวจสอà¸à¸„ำสะà¸à¸”เสร็จสิ้น: à¹à¸à¹‰à¹„ข1คำ","progress":"à¸à¸³à¸¥à¸±à¸‡à¸•à¸£à¸§à¸ˆà¸ªà¸­à¸à¸„ำสะà¸à¸”...","title":"Spell Checker","toolbar":"ตรวจà¸à¸²à¸£à¸ªà¸°à¸à¸”คำ"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/tr.js b/js/ckeditor/lang/tr.js
new file mode 100644
index 0000000..43f0562
--- /dev/null
+++ b/js/ckeditor/lang/tr.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['tr']={"editor":"Zengin Metin EditörĂ¼","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Yardım için ALT 0 tuÅŸlarına basın","browseServer":"Sunucuya Gözat","url":"URL","protocol":"Protokol","upload":"Karşıya YĂ¼kle","uploadSubmit":"Sunucuya Gönder","image":"Resim","flash":"Flash","form":"Form","checkbox":"Onay Kutusu","radio":"Seçenek DĂ¼ÄŸmesi","textField":"Metin Kutusu","textarea":"Metin Alanı","hiddenField":"Gizli Alan","button":"DĂ¼ÄŸme","select":"Seçme Alanı","imageButton":"Resim DĂ¼ÄŸmesi","notSet":"<tanımlanmamış>","id":"Kimlik","name":"Ä°sim","langDir":"Dil YönĂ¼","langDirLtr":"Soldan SaÄŸa (LTR)","langDirRtl":"SaÄŸdan Sola (RTL)","langCode":"Dil Kodlaması","longDescr":"Uzun Tanımlı URL","cssClass":"Biçem Sayfası Sınıfları","advisoryTitle":"Ă–neri BaÅŸlığı","cssStyle":"Biçem","ok":"Tamam","cancel":"Ä°ptal","close":"Kapat","preview":"Ă–nizleme","resize":"Yeniden Boyutlandır","generalTab":"Genel","advancedTab":"GeliÅŸmiÅŸ","validateNumberFailed":"Bu deÄŸer bir sayı deÄŸildir.","confirmNewPage":"Bu içerikle ilgili kaydedilmemiÅŸ tĂ¼m bilgiler kaybolacaktır. Yeni bir sayfa yĂ¼klemek istediÄŸinizden emin misiniz?","confirmCancel":"Bazı seçenekleri deÄŸiÅŸtirdiniz. Ä°letiÅŸim penceresini kapatmak istediÄŸinizden emin misiniz?","options":"Seçenekler","target":"Hedef","targetNew":"Yeni Pencere (_blank)","targetTop":"En Ăœstteki Pencere (_top)","targetSelf":"Aynı Pencere (_self)","targetParent":"Ăœst Pencere (_parent)","langDirLTR":"Soldan SaÄŸa (LTR)","langDirRTL":"SaÄŸdan Sola (RTL)","styles":"Biçem","cssClasses":"Biçem Sayfası Sınıfları","width":"GeniÅŸlik","height":"YĂ¼kseklik","align":"Hizalama","alignLeft":"Sol","alignRight":"SaÄŸ","alignCenter":"Ortala","alignJustify":"Ä°ki Kenara Yaslanmış","alignTop":"Ăœst","alignMiddle":"Orta","alignBottom":"Alt","alignNone":"Hiçbiri","invalidValue":"Geçersiz deÄŸer.","invalidHeight":"YĂ¼kseklik deÄŸeri bir sayı olmalıdır.","invalidWidth":"GeniÅŸlik deÄŸeri bir sayı olmalıdır.","invalidCssLength":"\"%1\" alanı için verilen deÄŸer, geçerli bir CSS ölĂ§Ă¼ birimi (px, %, in, cm, mm, em, ex, pt, veya pc) içeren veya içermeyen pozitif bir sayı olmalıdır.","invalidHtmlLength":"BelirttiÄŸiniz sayı \"%1\" alanı için pozitif bir sayı HTML birim deÄŸeri olmalıdır (px veya %).","invalidInlineStyle":"Satıriçi biçem için verilen deÄŸer, \"isim : deÄŸer\" biçiminde birbirinden noktalı virgĂ¼llerle ayrılan bir veya daha fazla deÄŸiÅŸkenler grubundan oluÅŸmalıdır.","cssLengthTooltip":"Piksel tĂ¼rĂ¼nde bir sayı veya geçerli bir CSS ölĂ§Ă¼ birimi (px, %, in, cm, mm, em, ex, pt veya pc) içeren bir sayı girin.","unavailable":"%1<span class=\"cke_accessibility\">, kullanılamaz</span>"},"about":{"copy":"Copyright &copy; $1. TĂ¼m hakları saklıdır.","dlgTitle":"CKEditor Hakkında","help":"Yardım için $1 kontrol edin.","moreInfo":"Lisanslama hakkında daha fazla bilgi almak için lĂ¼tfen sitemizi ziyaret edin:","title":"CKEditor Hakkında","userGuide":"CKEditor Kullanıcı Kılavuzu"},"basicstyles":{"bold":"Kalın","italic":"Ä°talik","strike":"ĂœstĂ¼ Çizgili","subscript":"Alt Simge","superscript":"Ăœst Simge","underline":"Altı Çizgili"},"blockquote":{"toolbar":"Blok OluÅŸtur"},"clipboard":{"copy":"Kopyala","copyError":"Gezgin yazılımınızın gĂ¼venlik ayarları dĂ¼zenleyicinin otomatik kopyalama iÅŸlemine izin vermiyor. Ä°ÅŸlem için (Ctrl/Cmd+C) tuÅŸlarını kullanın.","cut":"Kes","cutError":"Gezgin yazılımınızın gĂ¼venlik ayarları dĂ¼zenleyicinin otomatik kesme iÅŸlemine izin vermiyor. Ä°ÅŸlem için (Ctrl/Cmd+X) tuÅŸlarını kullanın.","paste":"Yapıştır","pasteArea":"Yapıştırma Alanı","pasteMsg":"LĂ¼tfen aÅŸağıdaki kutunun içine yapıştırın. (<STRONG>Ctrl/Cmd+V</STRONG>) ve <STRONG>Tamam</STRONG> butonunu tıklayın.","securityMsg":"Gezgin yazılımınızın gĂ¼venlik ayarları dĂ¼zenleyicinin direkt olarak panoya eriÅŸimine izin vermiyor. Bu pencere içine tekrar yapıştırmalısınız..","title":"Yapıştır"},"contextmenu":{"options":"İçerik MenĂ¼sĂ¼ Seçenekleri"},"button":{"selectedLabel":"%1 (SeçilmiÅŸ)"},"toolbar":{"toolbarCollapse":"Araç çubuklarını topla","toolbarExpand":"Araç çubuklarını aç","toolbarGroups":{"document":"Belge","clipboard":"Pano/Geri al","editing":"DĂ¼zenleme","forms":"Formlar","basicstyles":"Temel Stiller","paragraph":"Paragraf","links":"BaÄŸlantılar","insert":"Ekle","styles":"Stiller","colors":"Renkler","tools":"Araçlar"},"toolbars":"Araç çubukları EditörĂ¼"},"elementspath":{"eleLabel":"Elementlerin yolu","eleTitle":"%1 elementi"},"format":{"label":"Biçim","panelTitle":"Biçim","tag_address":"Adres","tag_div":"Paragraf (DIV)","tag_h1":"BaÅŸlık 1","tag_h2":"BaÅŸlık 2","tag_h3":"BaÅŸlık 3","tag_h4":"BaÅŸlık 4","tag_h5":"BaÅŸlık 5","tag_h6":"BaÅŸlık 6","tag_p":"Normal","tag_pre":"Biçimli"},"horizontalrule":{"toolbar":"Yatay Satır Ekle"},"image":{"alertUrl":"LĂ¼tfen resmin URL'sini yazınız","alt":"Alternatif Yazı","border":"Kenar","btnUpload":"Sunucuya Yolla","button2Img":"Seçili resim butonunu basit resime çevirmek istermisiniz?","hSpace":"Yatay BoÅŸluk","img2Button":"Seçili olan resimi, resimli butona çevirmek istermisiniz?","infoTab":"Resim Bilgisi","linkTab":"KöprĂ¼","lockRatio":"Oranı Kilitle","menu":"Resim Ă–zellikleri","resetSize":"Boyutu BaÅŸa DöndĂ¼r","title":"Resim Ă–zellikleri","titleButton":"Resimli DĂ¼ÄŸme Ă–zellikleri","upload":"Karşıya YĂ¼kle","urlMissing":"Resmin URL kaynağı eksiktir.","vSpace":"Dikey BoÅŸluk","validateBorder":"Çerçeve tam sayı olmalıdır.","validateHSpace":"HSpace tam sayı olmalıdır.","validateVSpace":"VSpace tam sayı olmalıdır."},"indent":{"indent":"Sekme Arttır","outdent":"Sekme Azalt"},"fakeobjects":{"anchor":"BaÄŸlantı","flash":"Flash Animasyonu","hiddenfield":"Gizli Alan","iframe":"IFrame","unknown":"Bilinmeyen Nesne"},"link":{"acccessKey":"EriÅŸim TuÅŸu","advanced":"GeliÅŸmiÅŸ","advisoryContentType":"Danışma İçerik TĂ¼rĂ¼","advisoryTitle":"Danışma BaÅŸlığı","anchor":{"toolbar":"BaÄŸlantı Ekle/DĂ¼zenle","menu":"BaÄŸlantı Ă–zellikleri","title":"BaÄŸlantı Ă–zellikleri","name":"BaÄŸlantı Adı","errorName":"LĂ¼tfen baÄŸlantı için ad giriniz","remove":"BaÄŸlantıyı Kaldır"},"anchorId":"Eleman Kimlik Numarası ile","anchorName":"BaÄŸlantı Adı ile","charset":"BaÄŸlı Kaynak Karakter Gurubu","cssClasses":"Biçem Sayfası Sınıfları","emailAddress":"E-Posta Adresi","emailBody":"Ä°leti Gövdesi","emailSubject":"Ä°leti Konusu","id":"Id","info":"Link Bilgisi","langCode":"Dil YönĂ¼","langDir":"Dil YönĂ¼","langDirLTR":"Soldan SaÄŸa (LTR)","langDirRTL":"SaÄŸdan Sola (RTL)","menu":"Link DĂ¼zenle","name":"Ad","noAnchors":"(Bu belgede hiç çapa yok)","noEmail":"LĂ¼tfen E-posta adresini yazın","noUrl":"LĂ¼tfen Link URL'sini yazın","other":"<diÄŸer>","popupDependent":"Bağımlı (Netscape)","popupFeatures":"Yeni Açılan Pencere Ă–zellikleri","popupFullScreen":"Tam Ekran (IE)","popupLeft":"Sola Göre Konum","popupLocationBar":"Yer ÇubuÄŸu","popupMenuBar":"MenĂ¼ ÇubuÄŸu","popupResizable":"Resizable","popupScrollBars":"Kaydırma Çubukları","popupStatusBar":"Durum ÇubuÄŸu","popupToolbar":"Araç ÇubuÄŸu","popupTop":"Yukarıya Göre Konum","rel":"Ä°liÅŸki","selectAnchor":"BaÄŸlantı Seç","styles":"Biçem","tabIndex":"Sekme Ä°ndeksi","target":"Hedef","targetFrame":"<çerçeve>","targetFrameName":"Hedef Çerçeve Adı","targetPopup":"<yeni açılan pencere>","targetPopupName":"Yeni Açılan Pencere Adı","title":"Link","toAnchor":"Bu sayfada çapa","toEmail":"E-Posta","toUrl":"URL","toolbar":"Link Ekle/DĂ¼zenle","type":"Link TĂ¼rĂ¼","unlink":"KöprĂ¼ Kaldır","upload":"Karşıya YĂ¼kle"},"list":{"bulletedlist":"Simgeli Liste","numberedlist":"Numaralı Liste"},"magicline":{"title":"ParaÄŸrafı buraya ekle"},"maximize":{"maximize":"BĂ¼yĂ¼lt","minimize":"KĂ¼Ă§Ă¼lt"},"pastetext":{"button":"DĂ¼z Metin Olarak Yapıştır","title":"DĂ¼z Metin Olarak Yapıştır"},"pastefromword":{"confirmCleanup":"Yapıştırmaya çalıştığınız metin Word'den kopyalanmıştır. Yapıştırmadan önce silmek istermisiniz?","error":"Yapıştırmadaki veri bilgisi hata dĂ¼zelene kadar silinmeyecektir","title":"Word'den Yapıştır","toolbar":"Word'den Yapıştır"},"removeformat":{"toolbar":"Biçimi Kaldır"},"sourcearea":{"toolbar":"Kaynak"},"specialchar":{"options":"Ă–zel Karakter Seçenekleri","title":"Ă–zel Karakter Seç","toolbar":"Ă–zel Karakter Ekle"},"scayt":{"btn_about":"SCAYT'ı hakkında","btn_dictionaries":"SözlĂ¼kler","btn_disable":"SCAYT'ı pasifleÅŸtir","btn_enable":"SCAYT'ı etkinleÅŸtir","btn_langs":"Diller","btn_options":"Seçenekler","text_title":"GirmiÅŸ olduÄŸunuz kelime denetimi"},"stylescombo":{"label":"Biçem","panelTitle":"Stilleri DĂ¼zenliyor","panelTitle1":"Blok Stilleri","panelTitle2":"Inline Stilleri","panelTitle3":"Nesne Stilleri"},"table":{"border":"Kenar Kalınlığı","caption":"BaÅŸlık","cell":{"menu":"HĂ¼cre","insertBefore":"HĂ¼cre Ekle - Ă–nce","insertAfter":"HĂ¼cre Ekle - Sonra","deleteCell":"HĂ¼cre Sil","merge":"HĂ¼creleri BirleÅŸtir","mergeRight":"BirleÅŸtir - SaÄŸdaki Ä°le ","mergeDown":"BirleÅŸtir - AÅŸağıdaki Ä°le ","splitHorizontal":"HĂ¼creyi Yatay Böl","splitVertical":"HĂ¼creyi Dikey Böl","title":"HĂ¼cre Ă–zellikleri","cellType":"HĂ¼cre Tipi","rowSpan":"Satırlar Mesafesi (Span)","colSpan":"SĂ¼tĂ¼nlar Mesafesi (Span)","wordWrap":"Kelime Kaydırma","hAlign":"DĂ¼ÅŸey Hizalama","vAlign":"YataÅŸ Hizalama","alignBaseline":"Tabana","bgColor":"Arkaplan Rengi","borderColor":"Çerçeve Rengi","data":"Veri","header":"BaÅŸlık","yes":"Evet","no":"Hayır","invalidWidth":"HĂ¼cre geniÅŸliÄŸi sayı olmalıdır.","invalidHeight":"HĂ¼cre yĂ¼ksekliÄŸi sayı olmalıdır.","invalidRowSpan":"Satırların mesafesi tam sayı olmalıdır.","invalidColSpan":"SĂ¼tĂ¼nların mesafesi tam sayı olmalıdır.","chooseColor":"Seçiniz"},"cellPad":"Izgara yazı arası","cellSpace":"Izgara kalınlığı","column":{"menu":"SĂ¼tun","insertBefore":"Kolon Ekle - Ă–nce","insertAfter":"Kolon Ekle - Sonra","deleteColumn":"SĂ¼tun Sil"},"columns":"SĂ¼tunlar","deleteTable":"Tabloyu Sil","headers":"BaÅŸlıklar","headersBoth":"Her Ä°kisi","headersColumn":"Ä°lk SĂ¼tun","headersNone":"Yok","headersRow":"Ä°lk Satır","invalidBorder":"Çerceve bĂ¼yĂ¼klĂ¼klĂ¼ÄŸĂ¼ sayı olmalıdır.","invalidCellPadding":"HĂ¼cre aralığı (padding) sayı olmalıdır.","invalidCellSpacing":"HĂ¼cre boÅŸluÄŸu (spacing) sayı olmalıdır.","invalidCols":"SĂ¼tĂ¼n sayısı 0 sayısından bĂ¼yĂ¼k olmalıdır.","invalidHeight":"Tablo yĂ¼ksekliÄŸi sayı olmalıdır.","invalidRows":"Satır sayısı 0 sayısından bĂ¼yĂ¼k olmalıdır.","invalidWidth":"Tablo geniÅŸliÄŸi sayı olmalıdır.","menu":"Tablo Ă–zellikleri","row":{"menu":"Satır","insertBefore":"Satır Ekle - Ă–nce","insertAfter":"Satır Ekle - Sonra","deleteRow":"Satır Sil"},"rows":"Satırlar","summary":"Ă–zet","title":"Tablo Ă–zellikleri","toolbar":"Tablo","widthPc":"yĂ¼zde","widthPx":"piksel","widthUnit":"geniÅŸlik birimi"},"undo":{"redo":"Tekrarla","undo":"Geri Al"},"wsc":{"btnIgnore":"Yoksay","btnIgnoreAll":"TĂ¼mĂ¼nĂ¼ Yoksay","btnReplace":"DeÄŸiÅŸtir","btnReplaceAll":"TĂ¼mĂ¼nĂ¼ DeÄŸiÅŸtir","btnUndo":"Geri Al","changeTo":"Åuna deÄŸiÅŸtir:","errorLoading":"Uygulamada yĂ¼klerken hata oluÅŸtu: %s.","ieSpellDownload":"Yazım denetimi yĂ¼klenmemiÅŸ. Åimdi yĂ¼klemek ister misiniz?","manyChanges":"Yazım denetimi tamamlandı: %1 kelime deÄŸiÅŸtirildi","noChanges":"Yazım denetimi tamamlandı: Hiçbir kelime deÄŸiÅŸtirilmedi","noMispell":"Yazım denetimi tamamlandı: Yanlış yazıma rastlanmadı","noSuggestions":"- Ă–neri Yok -","notAvailable":"ĂœzĂ¼gĂ¼nĂ¼z, bu servis ÅŸuanda hizmet dışıdır.","notInDic":"SözlĂ¼kte Yok","oneChange":"Yazım denetimi tamamlandı: Bir kelime deÄŸiÅŸtirildi","progress":"Yazım denetimi iÅŸlemde...","title":"Yazımı Denetle","toolbar":"Yazım Denetimi"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/tt.js b/js/ckeditor/lang/tt.js
new file mode 100644
index 0000000..45bb79c
--- /dev/null
+++ b/js/ckeditor/lang/tt.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['tt']={"editor":"Đ¤Đ¾Ñ€Đ¼Đ°Ñ‚Đ»Đ°ÑƒĐ»Ñ‹ Ñ‚ĐµĐºÑÑ‚ Ó©Đ»ĐºÓ™Ñе","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Đ¯Ñ€Đ´Ó™Đ¼ Ó©Ñ‡ĐµĐ½ ALT 0 баÑÑ‹Đ³Ñ‹Đ·","browseServer":"Đ¡ĐµÑ€Đ²ĐµÑ€ ĐºĐ°Ñ€Đ°Đ¿ Ñ‡Ñ‹Đ³Ñƒ","url":"Đ¡Ñ‹Đ»Ñ‚Đ°Đ»Đ°Đ¼Đ°","protocol":"ĐŸÑ€Đ¾Ñ‚Đ¾ĐºĐ¾Đ»","upload":"Đ™Ó©ĐºĐ»Ó™̉¯","uploadSubmit":"Đ¡ĐµÑ€Đ²ĐµÑ€Đ³Đ° ̉—Đ¸Đ±Ó™Ñ€̉¯","image":"Đ Ó™ÑĐµĐ¼","flash":"Đ¤Đ»ĐµÑˆ","form":"Đ¤Đ¾Ñ€Đ¼Đ°","checkbox":"Đ§ĐµĐºĐ±Đ¾ĐºÑ","radio":"Đ Đ°Đ´Đ¸Đ¾ Ñ‚Ó©Đ¹Đ¼Ó™","textField":"Đ¢ĐµĐºÑÑ‚ ĐºÑ‹Ñ€Ñ‹","textarea":"Đ¢ĐµĐºÑÑ‚ Đ¼Ó™Đ¹Đ´Đ°Đ½Ñ‹","hiddenField":"Đ¯ÑˆĐµÑ€ĐµĐ½ ĐºÑ‹Ñ€","button":"Đ¢Ó©Đ¹Đ¼É™","select":"Đ¡Đ°Đ¹Đ»Đ°Ñƒ ĐºÑ‹Ñ€Ñ‹","imageButton":"Đ Ó™ÑĐµĐ¼Đ»Đµ Ñ‚Ó©Đ¹Đ¼É™","notSet":"<Đ±Đ¸Đ»Đ³ĐµĐ»Ó™Đ½Đ¼Ó™Đ³Ó™Đ½>","id":"Id","name":"Đ˜ÑĐµĐ¼","langDir":"Đ¯Đ·Ñ‹Đ»Ñ‹Ñˆ ÑĐ½É™Đ»ĐµÑˆĐµ","langDirLtr":"Đ¡ÑƒĐ»Đ´Đ°Đ½ у̉£Đ³Đ° ÑĐ·Ñ‹Đ»Ñ‹Ñˆ (LTR)","langDirRtl":"Đ£̉£Đ½Đ°Đ½ ÑÑƒĐ»Đ³Đ° ÑĐ·Ñ‹Đ»Ñ‹Ñˆ (RTL)","langCode":"Đ¢ĐµĐ» ĐºĐ¾Đ´Ñ‹","longDescr":"̉–ĐµĐ½Ñ‚ĐµĐºĐ»Đµ Ñ‚Đ°ÑĐ²Đ¸Ñ€Đ»Đ°Đ¼Đ°Đ³Đ° ÑÑ‹Đ»Ñ‚Đ°Đ»Đ°Đ¼Đ°","cssClass":"Đ¡Ñ‚Đ¸Đ»ÑŒĐ»Ó™Ñ€ ĐºĐ»Đ°ÑÑĐ»Đ°Ñ€Ñ‹","advisoryTitle":"Đи̉£Ó™Ñˆ иÑĐµĐ¼","cssStyle":"Đ¡Ñ‚Đ¸Đ»ÑŒ","ok":"Đ¢Ó™Đ¼Đ°Đ¼","cancel":"Đ‘Đ°Ñˆ Ñ‚Đ°Ñ€Ñ‚Ñƒ","close":"Đ§Ñ‹Đ³Ñƒ","preview":"ĐĐ°Ñ€Đ°Đ¿ Đ°Đ»Ñƒ","resize":"Đ—ÑƒÑ€Đ»Ñ‹ĐºĐ½Ñ‹ ̉¯Đ·Đ³Ó™Ñ€Ñ‚̉¯","generalTab":"Đ¢Ó©Đ¿","advancedTab":"Đи̉£Ó™Đ¹Ñ‚ĐµĐ»Đ³Ó™Đ½ ĐºÓ©Đ¹Đ»Ó™̉¯Đ»Ó™Ñ€","validateNumberFailed":"Ó˜Đ»ĐµĐ³Đµ ĐºÑ‹Đ¹Đ¼Đ¼Ó™Ñ‚ ÑĐ°Đ½ Ñ‚̉¯Đ³ĐµĐ»","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":"̉®Đ·Đ»ĐµĐºĐ»Ó™Ñ€","target":"ĐœĐ°ĐºÑĐ°Ñ‚","targetNew":"Đ¯̉£Đ° Ñ‚Ó™Ñ€Ó™Đ·Ó™ (_blank)","targetTop":"Ó¨ÑĐºĐµ Ñ‚Ó™Ñ€Ó™Đ·Ó™ (_top)","targetSelf":"Đ¨ÑƒĐ» ̉¯Đº Ñ‚Ó™Ñ€Ó™Đ·Ó™ (_self)","targetParent":"ĐĐ½Đ° Ñ‚Ó™Ñ€Ó™Đ·Ó™ (_parent)","langDirLTR":"Đ¡ÑƒĐ»Đ´Đ°Đ½ у̉£Đ³Đ° ÑĐ·Ñ‹Đ»Ñ‹Ñˆ (LTR)","langDirRTL":"Đ£̉£Đ½Đ°Đ½ ÑÑƒĐ»Đ³Đ° ÑĐ·Ñ‹Đ»Ñ‹Ñˆ (RTL)","styles":"Đ¡Ñ‚Đ¸Đ»ÑŒ","cssClasses":"Đ¡Ñ‚Đ¸Đ»ÑŒĐ»Ó™Ñ€ ĐºĐ»Đ°ÑÑĐ»Đ°Ñ€Ñ‹","width":"Đи̉£Đ»ĐµĐº","height":"Đ‘Đ¸ĐµĐºĐ»ĐµĐº","align":"Đ¢Đ¸Đ³ĐµĐ·Đ»Ó™̉¯","alignLeft":"Đ¡ÑƒĐ» ÑĐºĐºĐ°","alignRight":"Đ£̉£ ÑĐºĐºĐ°","alignCenter":"̉®Đ·Ó™ĐºĐºÓ™","alignJustify":"Đи̉£Đ»ĐµĐºĐºÓ™ ĐºĐ°Ñ€Đ°Đ¿ Ñ‚Đ¸Đ³ĐµĐ·Đ»Ó™̉¯","alignTop":"Ó¨ÑĐºÓ™","alignMiddle":"Đ£Ñ€Ñ‚Đ°Đ³Đ°","alignBottom":"ĐÑĐºĐ°","alignNone":"̉ºĐ¸Ñ‡Đ±ĐµÑ€","invalidValue":"Đ”Ó©Ñ€ĐµÑ Đ±ÑƒĐ»Đ¼Đ°Đ³Đ°Đ½ ĐºÑ‹Đ¹Đ¼Đ¼Ó™Ñ‚","invalidHeight":"Đ‘Đ¸ĐµĐºĐ»ĐµĐº ÑĐ°Đ½ Đ±ÑƒĐ»Ñ‹Ñ€Đ³Đ° Ñ‚Đ¸ĐµÑˆ","invalidWidth":"Đи̉£Đ»ĐµĐº ÑĐ°Đ½ Đ±ÑƒĐ»Ñ‹Ñ€Đ³Đ° Ñ‚Đ¸ĐµÑˆ","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>"},"about":{"copy":"Copyright &copy; $1. Đ‘Đ°Ñ€ Ñ…Đ¾ĐºÑƒĐºĐ»Đ°Ñ€ ÑĐ°ĐºĐ»Đ°Đ½Đ³Đ°Đ½","dlgTitle":"CKEditor Ñ‚ÑƒÑ€Ñ‹Đ½Đ´Đ°","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"CKEditor Ñ‚ÑƒÑ€Ñ‹Đ½Đ´Đ°","userGuide":"CKEditor ĐºÑƒĐ»Đ»Đ°Đ½Đ¼Đ°ÑÑ‹"},"basicstyles":{"bold":"ĐĐ°Đ»Ñ‹Đ½","italic":"ĐурÑĐ¸Đ²","strike":"Đ¡Ñ‹Đ·Ñ‹Đ»Đ³Đ°Đ½","subscript":"ĐÑĐºÑ‹ Đ¸Đ½Đ´ĐµĐºÑ","superscript":"Ó¨ÑĐºĐµ Đ¸Đ½Đ´ĐµĐºÑ","underline":"ĐÑÑ‚Ñ‹Đ½Đ° ÑÑ‹Đ·Ñ‹Đ»Đ³Đ°Đ½"},"blockquote":{"toolbar":"Ó¨Đ·ĐµĐ¼Ñ‚Ó™ Đ±Đ»Đ¾Đ³Ñ‹"},"clipboard":{"copy":"Đ̉¯Ñ‡ĐµÑ€Đ¼Ó™Đ»Ó™̉¯","copyError":"Đ‘Ñ€Đ°ÑƒĐ·ĐµÑ€Ñ‹Đ³Ñ‹Đ·Đ½Ñ‹̉£ Đ¸Đ¼Đ¸Đ½Đ»ĐµĐº ̉¯Đ·Đ»ĐµĐºĐ»Ó™Ñ€Đµ Đ°Đ²Ñ‚Đ¾Đ¼Đ°Ñ‚Đ¸Đº Ñ€Ó™Đ²ĐµÑˆÑ‚Ó™ Đº̉¯Ñ‡ĐµÑ€Đ¼Ó™Đ»Ó™̉¯ ̉¯Ñ‚Ó™̉¯Đ½Đµ Ñ‚Ñ‹Ñ. Đ¢Đ¸Đ· Ñ‚Ó©Đ¹Đ¼Ó™Đ»Ó™Ñ€Đ½Đµ (Ctrl/Cmd+C) ĐºÑƒĐ»Đ»Đ°Đ½Ñ‹Đ³Ñ‹Đ·.","cut":"ĐиÑĐµĐ¿ Đ°Đ»Ñƒ","cutError":"Đ‘Ñ€Đ°ÑƒĐ·ĐµÑ€Ñ‹Đ³Ñ‹Đ·Đ½Ñ‹̉£ Đ¸Đ¼Đ¸Đ½Đ»ĐµĐº ̉¯Đ·Đ»ĐµĐºĐ»Ó™Ñ€Đµ Đ°Đ²Ñ‚Đ¾Đ¼Đ°Ñ‚Đ¸Đº Ñ€Ó™Đ²ĐµÑˆÑ‚Ó™ Đº̉¯Ñ‡ĐµÑ€Đ¼Ó™Đ»Ó™̉¯ ̉¯Ñ‚Ó™̉¯Đ½Đµ Ñ‚Ñ‹Ñ. Đ¢Đ¸Đ· Ñ‚Ó©Đ¹Đ¼Ó™Đ»Ó™Ñ€Đ½Đµ (Ctrl/Cmd+C) ĐºÑƒĐ»Đ»Đ°Đ½Ñ‹Đ³Ñ‹Đ·.","paste":"Ó¨ÑÑ‚Ó™̉¯","pasteArea":"Ó¨ÑÑ‚Ó™̉¯ Đ¼Ó™Đ¹Đ´Đ°Đ½Ñ‹","pasteMsg":"Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK","securityMsg":"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.","title":"Ó¨ÑÑ‚Ó™̉¯"},"contextmenu":{"options":"ĐĐ¾Đ½Ñ‚ĐµĐºÑÑ‚ Đ¼ĐµĐ½Ñ ̉¯Đ·Đ»ĐµĐºĐ»Ó™Ñ€Đµ"},"button":{"selectedLabel":"%1 (Đ¡Đ°Đ¹Đ»Đ°Đ½Đ³Đ°Đ½)"},"toolbar":{"toolbarCollapse":"Collapse Toolbar","toolbarExpand":"Expand Toolbar","toolbarGroups":{"document":"Đ”Đ¾ĐºÑƒĐ¼ĐµĐ½Ñ‚","clipboard":"ĐĐ»Đ¼Đ°ÑˆÑƒ Đ±ÑƒÑ„ĐµÑ€Ñ‹/ĐĐ°Đ¹Ñ‚Đ°Ñ€Ñƒ","editing":"Đ¢Ó©Đ·Ó™Ñ‚̉¯","forms":"Đ¤Đ¾Ñ€Đ¼Đ°Đ»Đ°Ñ€","basicstyles":"Đ¢Ó©Đ¿ ÑÑ‚Đ¸Đ»ÑŒĐ»Ó™Ñ€","paragraph":"ĐŸĐ°Ñ€Đ°Đ³Ñ€Đ°Ñ„","links":"Đ¡Ñ‹Đ»Ñ‚Đ°Đ»Đ°Đ¼Đ°Đ»Đ°Ñ€","insert":"Ó¨ÑÑ‚Ó™̉¯","styles":"Đ¡Ñ‚Đ¸Đ»ÑŒĐ»Ó™Ñ€","colors":"Đ¢Ó©ÑĐ»Ó™Ñ€","tools":"ĐĐ¾Ñ€Đ°Đ»Đ»Đ°Ñ€"},"toolbars":"Editor toolbars"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 ÑĐ»ĐµĐ¼ĐµĐ½Ñ‚"},"format":{"label":"Đ¤Đ¾Ñ€Đ¼Đ°Ñ‚Đ»Đ°Ñƒ","panelTitle":"ĐŸĐ°Ñ€Đ°Đ³Ñ€Đ°Ñ„ Ñ„Đ¾Ñ€Đ¼Đ°Ñ‚Đ»Đ°Đ²Ñ‹","tag_address":"ĐĐ´Ñ€ĐµÑ","tag_div":"Гади (DIV)","tag_h1":"Đ‘Đ°ÑˆĐ»Đ°Đ¼ 1","tag_h2":"Đ‘Đ°ÑˆĐ»Đ°Đ¼ 2","tag_h3":"Đ‘Đ°ÑˆĐ»Đ°Đ¼ 3","tag_h4":"Đ‘Đ°ÑˆĐ»Đ°Đ¼ 4","tag_h5":"Đ‘Đ°ÑˆĐ»Đ°Đ¼ 5","tag_h6":"Đ‘Đ°ÑˆĐ»Đ°Đ¼ 6","tag_p":"Гади","tag_pre":"Đ¤Đ¾Ñ€Đ¼Đ°Ñ‚Đ»Đ°ÑƒĐ»Ñ‹"},"horizontalrule":{"toolbar":"Đ¯Ñ‚Đ¼Đ° ÑÑ‹Đ·Ñ‹Đº Ó©ÑÑ‚Ó™̉¯"},"image":{"alertUrl":"Đ Ó™ÑĐµĐ¼Đ³Ó™ ÑÑ‹Đ»Ñ‚Đ°Đ»Đ°Đ¼Đ° ÑĐ·Ñ‹Đ³Ñ‹Đ·","alt":"ĐĐ»ÑŒÑ‚ĐµÑ€Đ½Đ°Ñ‚Đ¸Đ² Ñ‚ĐµĐºÑÑ‚","border":"Đ§Đ¸Đº","btnUpload":"Đ¡ĐµÑ€Đ²ĐµÑ€Đ³Đ° ̉—Đ¸Đ±Ó™Ñ€̉¯","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":"Đ Ó™ÑĐµĐ¼ Ñ‚Đ°ÑĐ²Đ¸Ñ€Đ»Đ°Đ¼Đ°ÑÑ‹","linkTab":"Đ¡Ñ‹Đ»Ñ‚Đ°Đ»Đ°Đ¼Đ°","lockRatio":"Lock Ratio","menu":"Đ Ó™ÑĐµĐ¼ ̉¯Đ·Đ»ĐµĐºĐ»Ó™Ñ€Đµ","resetSize":"Đ‘Đ°ÑˆÑ‚Đ°Đ³Ñ‹ Đ·ÑƒÑ€Đ»Ñ‹Đº","title":"Đ Ó™ÑĐµĐ¼ ̉¯Đ·Đ»ĐµĐºĐ»Ó™Ñ€Đµ","titleButton":"Đ Ó™ÑĐµĐ¼Đ»Đµ Ñ‚Ó©Đ¹Đ¼É™ ̉¯Đ·Đ»ĐµĐºĐ»Ó™Ñ€Đµ","upload":"Đ™Ó©ĐºĐ»Ó™̉¯","urlMissing":"Image source URL is missing.","vSpace":"VSpace","validateBorder":"Đ§Đ¸Đº ĐºĐ¸̉£Đ»ĐµĐ³Đµ ÑĐ°Đ½ Đ±ÑƒĐ»Ñ‹Ñ€Đ³Đ° Ñ‚Đ¸ĐµÑˆ","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"indent":{"indent":"ĐÑ‚ÑÑ‚ÑƒĐ¿Đ½Ñ‹ Đ°Ñ€Ñ‚Ñ‚Ñ‹Ñ€Ñƒ","outdent":"ĐÑ‚ÑÑ‚ÑƒĐ¿Đ½Ñ‹ ĐºĐµÑ‡ĐµÑ€Ó™Đ¹Ñ‚̉¯"},"fakeobjects":{"anchor":"Đ¯ĐºĐ¾Ñ€ÑŒ","flash":"Đ¤Đ»ĐµÑˆ Đ°Đ½Đ¸Đ¼Đ°Ñ†Đ¸ÑÑÑ‹","hiddenfield":"Đ¯ÑˆĐµÑ€ĐµĐ½ ĐºÑ‹Ñ€","iframe":"IFrame","unknown":"Đ¢Đ°Đ½Ñ‹Đ»Đ¼Đ°Đ³Đ°Đ½ Đ¾Đ±ÑĐµĐºÑ‚"},"link":{"acccessKey":"Access Key","advanced":"Đи̉£Ó™Đ¹Ñ‚ĐµĐ»Đ³Ó™Đ½ ĐºÓ©Đ¹Đ»Ó™̉¯Đ»Ó™Ñ€","advisoryContentType":"Advisory Content Type","advisoryTitle":"Đи̉£Ó™Ñˆ иÑĐµĐ¼","anchor":{"toolbar":"Đ¯ĐºĐ¾Ñ€ÑŒ","menu":"Đ¯ĐºĐ¾Ñ€ÑŒĐ½Đµ ̉¯Đ·Đ³Ó™Ñ€Ñ‚̉¯","title":"Đ¯ĐºĐ¾Ñ€ÑŒ ̉¯Đ·Đ»ĐµĐºĐ»Ó™Ñ€Đµ","name":"Đ¯ĐºĐ¾Ñ€ÑŒ иÑĐµĐ¼Đµ","errorName":"Đ¯ĐºĐ¾Ñ€ÑŒĐ½Đµ̉£ иÑĐµĐ¼ĐµĐ½ ÑĐ·Ñ‹Đ³Ñ‹Đ·","remove":"Đ¯ĐºĐ¾Ñ€ÑŒĐ½Đµ Đ±ĐµÑ‚ĐµÑ€̉¯"},"anchorId":"Đ­Đ»ĐµĐ¼ĐµĐ½Ñ‚ Đ¸Đ´ĐµĐ½Ñ‚Đ¸Ñ„Đ¸ĐºĐ°Ñ‚Đ¾Ñ€Ñ‹ Đ±ÑƒĐµĐ½Ñ‡Đ°","anchorName":"Đ¯ĐºĐ¾Ñ€ÑŒ иÑĐµĐ¼Đµ Đ±ÑƒĐµĐ½Ñ‡Đ°","charset":"Linked Resource Charset","cssClasses":"Đ¡Ñ‚Đ¸Đ»ÑŒĐ»Ó™Ñ€ ĐºĐ»Đ°ÑÑĐ»Đ°Ñ€Ñ‹","emailAddress":"Đ­Đ»ĐµĐºÑ‚Ñ€Đ¾Đ½ Đ¿Đ¾Ñ‡Ñ‚Đ° Đ°Đ´Ñ€ĐµÑÑ‹","emailBody":"Đ¥Đ°Ñ‚ ÑÑ‡Ñ‚Ó™Đ»ĐµĐ³Đµ","emailSubject":"Đ¥Đ°Ñ‚ Ñ‚ĐµĐ¼Đ°ÑÑ‹","id":"Đ˜Đ´ĐµĐ½Ñ‚Đ¸Ñ„Đ¸ĐºĐ°Ñ‚Đ¾Ñ€","info":"Đ¡Ñ‹Đ»Ñ‚Đ°Đ»Đ°Đ¼Đ° Ñ‚Đ°ÑĐ²Đ¸Ñ€Đ»Đ°Đ¼Đ°ÑÑ‹","langCode":"Đ¢ĐµĐ» ĐºĐ¾Đ´Ñ‹","langDir":"Đ¯Đ·Ñ‹Đ»Ñ‹Ñˆ ÑĐ½É™Đ»ĐµÑˆĐµ","langDirLTR":"Đ¡ÑƒĐ»Đ´Đ°Đ½ у̉£Đ³Đ° ÑĐ·Ñ‹Đ»Ñ‹Ñˆ (LTR)","langDirRTL":"Đ£̉£Đ½Đ°Đ½ ÑÑƒĐ»Đ³Đ° ÑĐ·Ñ‹Đ»Ñ‹Ñˆ (RTL)","menu":"Đ¡Ñ‹Đ»Ñ‚Đ°Đ»Đ°Đ¼Đ°yĐ½Ñ‹ ̉¯Đ·Đ³Ó™Ñ€Ñ‚̉¯","name":"Đ˜ÑĐµĐ¼","noAnchors":"(Ó˜Đ»ĐµĐ³Đµ Đ´Đ¾ĐºÑƒĐ¼ĐµĐ½Ñ‚Ñ‚Đ° ÑĐºĐ¾Ñ€ÑŒĐ»Ó™Ñ€ Ñ‚Đ°Đ±Ñ‹Đ»Đ¼Đ°Đ´Ñ‹)","noEmail":"Đ­Đ»ĐµĐºÑ‚Ñ€Đ¾Đ½ Đ¿Đ¾Ñ‡Ñ‚Đ° Đ°Đ´Ñ€ĐµÑÑ‹Đ½ ÑĐ·Ñ‹Đ³Ñ‹Đ·","noUrl":"Đ¡Ñ‹Đ»Ñ‚Đ°Đ»Đ°Đ¼Đ°Đ½Ñ‹ ÑĐ·Ñ‹Đ³Ñ‹Đ·","other":"<б̉¯Ñ‚Ó™Đ½>","popupDependent":"Đ‘Ó™Đ¹Đ»Đµ (Netscape)","popupFeatures":"Popup Window Features","popupFullScreen":"Đ¢ÑƒĐ»Ñ‹ ÑĐºÑ€Đ°Đ½ (IE)","popupLeft":"Left Position","popupLocationBar":"Location Bar","popupMenuBar":"Menu Bar","popupResizable":"Resizable","popupScrollBars":"Scroll Bars","popupStatusBar":"Status Bar","popupToolbar":"Toolbar","popupTop":"Top Position","rel":"Đ‘Ó™Đ¹Đ»Ó™Đ½ĐµÑˆ","selectAnchor":"Đ¯ĐºĐ¾Ñ€ÑŒĐ½Đµ ÑĐ°Đ¹Đ»Đ°Ñƒ","styles":"Đ¡Ñ‚Đ¸Đ»ÑŒ","tabIndex":"Tab Index","target":"ĐœĐ°ĐºÑĐ°Ñ‚","targetFrame":"<frame>","targetFrameName":"Target Frame Name","targetPopup":"<popup window>","targetPopupName":"ĐŸĐ¾Đ¿Đ°Đ¿ Ñ‚Ó™Ñ€Ó™Đ·Ó™Ñе иÑĐµĐ¼Đµ","title":"Đ¡Ñ‹Đ»Ñ‚Đ°Đ»Đ°Đ¼Đ°","toAnchor":"Đ¯ĐºĐ¾Ñ€ÑŒĐ½Đµ Ñ‚ĐµĐºÑÑ‚ Đ±ĐµĐ»Ó™Đ½ Đ±Ó™Đ¹Đ»Ó™̉¯","toEmail":"Đ­Đ»ĐµĐºÑ‚Ñ€Đ¾Đ½ Đ¿Đ¾Ñ‡Ñ‚Đ°","toUrl":"Đ¡Ñ‹Đ»Ñ‚Đ°Đ»Đ°Đ¼Đ°","toolbar":"Đ¡Ñ‹Đ»Ñ‚Đ°Đ»Đ°Đ¼Đ°","type":"Đ¡Ñ‹Đ»Ñ‚Đ°Đ»Đ°Đ¼Đ° Ñ‚Ó©Ñ€Đµ","unlink":"Đ¡Ñ‹Đ»Ñ‚Đ°Đ»Đ°Đ¼Đ°Đ½Ñ‹ Đ±ĐµÑ‚ĐµÑ€̉¯","upload":"Đ™Ó©ĐºĐ»Ó™̉¯"},"list":{"bulletedlist":"ĐœĐ°Ñ€ĐºĐµÑ€Đ»Ñ‹ Ñ‚ĐµĐ·Đ¼Ó™ Ó©ÑÑ‚Ó™̉¯/Đ±ĐµÑ‚ĐµÑ€̉¯","numberedlist":" ĐĐ¾Đ¼ĐµÑ€Đ»Đ°Đ½Đ³Đ°Đ½ Ñ‚ĐµĐ·Đ¼Ó™ Ó©ÑÑ‚Ó™̉¯/Đ±ĐµÑ‚ĐµÑ€̉¯"},"magicline":{"title":"Đ‘Đ¸Ñ€ĐµĐ³Ó™ Đ¿Đ°Ñ€Đ°Đ³Ñ€Đ°Ñ„ Ó©ÑÑ‚Ó™̉¯"},"maximize":{"maximize":"Đ—ÑƒÑ€Đ°Đ¹Ñ‚Ñƒ","minimize":"ĐĐµÑ‡ĐµÑ€Ó™Đ¹Ñ‚̉¯"},"pastetext":{"button":"Đ¤Đ¾Ñ€Đ¼Đ°Ñ‚Đ»Đ°ÑƒÑÑ‹Đ· Ñ‚ĐµĐºÑÑ‚ Ó©ÑÑ‚Ó™̉¯","title":"Đ¤Đ¾Ñ€Đ¼Đ°Ñ‚Đ»Đ°ÑƒÑÑ‹Đ· Ñ‚ĐµĐºÑÑ‚ Ó©ÑÑ‚Ó™̉¯"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Word'Ñ‚Đ°Đ½ Ó©ÑÑ‚Ó™̉¯","toolbar":"Word'Ñ‚Đ°Đ½ Ó©ÑÑ‚Ó™̉¯"},"removeformat":{"toolbar":"Đ¤Đ¾Ñ€Đ¼Đ°Ñ‚Đ»Đ°ÑƒĐ½Ñ‹ Đ±ĐµÑ‚ĐµÑ€̉¯"},"sourcearea":{"toolbar":"Đ§Ñ‹Đ³Đ°Đ½Đ°Đº"},"specialchar":{"options":"ĐœĐ°Ñ…ÑÑƒÑ ÑĐ¸Đ¼Đ²Đ¾Đ» ̉¯Đ·Đ»ĐµĐºĐ»Ó™Ñ€Đµ","title":"ĐœĐ°Ñ…ÑÑƒÑ ÑĐ¸Đ¼Đ²Đ¾Đ» ÑĐ°Đ¹Đ»Đ°Ñƒ","toolbar":"ĐœĐ°Ñ…ÑÑƒÑ ÑĐ¸Đ¼Đ²Đ¾Đ» Ó©ÑÑ‚Ó™̉¯"},"scayt":{"btn_about":"About SCAYT","btn_dictionaries":"Dictionaries","btn_disable":"Disable SCAYT","btn_enable":"Enable SCAYT","btn_langs":"Languages","btn_options":"Options","text_title":"Spell Check As You Type"},"stylescombo":{"label":"Đ¡Ñ‚Đ¸Đ»ÑŒĐ»Ó™Ñ€","panelTitle":"Đ¤Đ¾Ñ€Đ¼Đ°Ñ‚Đ»Đ°Ñƒ ÑÑ‚Đ¸Đ»ÑŒĐ»Ó™Ñ€Đµ","panelTitle1":"Đ‘Đ»Đ¾ĐºĐ»Đ°Ñ€ ÑÑ‚Đ¸Đ»ÑŒĐ»Ó™Ñ€Đµ","panelTitle2":"Đ­Ñ‡ĐºĐµ ÑÑ‚Đ¸Đ»ÑŒĐ»Ó™Ñ€","panelTitle3":"ĐбÑĐµĐºÑ‚Đ»Đ°Ñ€ ÑÑ‚Đ¸Đ»ÑŒĐ»Ó™Ñ€Đµ"},"table":{"border":"Đ§Đ¸Đº ĐºĐ°Đ»Ñ‹Đ½Đ»Ñ‹Đ³Ñ‹","caption":"Đ˜ÑĐµĐ¼","cell":{"menu":"Đ̉¯Đ·Ó™Đ½Ó™Đº","insertBefore":"ĐĐ»Đ´Ñ‹Đ½Đ° Đº̉¯Đ·Ó™Đ½Ó™Đº Ó©ÑÑ‚Ó™̉¯","insertAfter":"ĐÑ€Ñ‚Ñ‹Đ½Đ° Đº̉¯Đ·Ó™Đ½Ó™Đº Ó©ÑÑ‚Ó™̉¯","deleteCell":"Đ̉¯Đ·Ó™Đ½Ó™ĐºĐ»Ó™Ñ€Đ½Đµ Đ±ĐµÑ‚ĐµÑ€̉¯","merge":"Đ̉¯Đ·Ó™Đ½Ó™ĐºĐ»Ó™Ñ€Đ½Đµ Đ±ĐµÑ€Đ»Ó™ÑˆÑ‚ĐµÑ€̉¯","mergeRight":"Đ£̉£ ÑĐºÑ‚Đ°Đ³Ñ‹ Đ±ĐµĐ»Ó™Đ½ Đ±ĐµÑ€Đ»Ó™ÑˆÑ‚ĐµÑ€̉¯","mergeDown":"ĐÑÑ‚Đ°Đ³Ñ‹ Đ±ĐµĐ»Ó™Đ½ Đ±ĐµÑ€Đ»Ó™ÑˆÑ‚ĐµÑ€̉¯","splitHorizontal":"Đ̉¯Đ·Ó™Đ½Ó™ĐºĐ½Đµ ÑĐ»Đ»Đ°Ñ€Đ³Đ° б̉¯Đ»̉¯","splitVertical":"Đ̉¯Đ·Ó™Đ½Ó™ĐºĐ½Đµ Đ±Đ°Đ³Đ°Đ½Đ°Đ»Đ°Ñ€Đ³Đ° б̉¯Đ»̉¯","title":"Đ̉¯Đ·Ó™Đ½Ó™Đº ̉¯Đ·Đ»ĐµĐºĐ»Ó™Ñ€Đµ","cellType":"Đ̉¯Đ·Ó™Đ½Ó™Đº Ñ‚Ó©Ñ€Đµ","rowSpan":"Đ®Đ»Đ»Đ°Ñ€Đ½Ñ‹ Đ±ĐµÑ€Đ»Ó™ÑˆÑ‚ĐµÑ€̉¯","colSpan":"Đ‘Đ°Đ³Đ°Đ½Đ°Đ»Đ°Ñ€Đ½Ñ‹ Đ±ĐµÑ€Đ»Ó™ÑˆÑ‚ĐµÑ€̉¯","wordWrap":"Đ¢ĐµĐºÑÑ‚Đ½Ñ‹ Đº̉¯Ñ‡ĐµÑ€̉¯","hAlign":"Đ¯Ñ‚Đ¼Đ° Ñ‚Đ¸Đ³ĐµĐ·Đ»Ó™̉¯","vAlign":"ĐÑĐ¼Đ° Ñ‚Đ¸Đ³ĐµĐ·Đ»Ó™̉¯","alignBaseline":"Đ¢Đ°ÑĐ½Ñ‹Ñ‡ ÑÑ‹Đ·Ñ‹Đ³Ñ‹","bgColor":"Đ¤Đ¾Đ½ Ñ‚Ó©Ñе","borderColor":"Đ§Đ¸Đº Ñ‚Ó©Ñе","data":"ĐœÓ™Đ³ÑĐ»̉¯Đ¼Đ°Ñ‚","header":"Đ‘Đ°ÑˆĐ»Ñ‹Đº","yes":"Ó˜Đ¹Đµ","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":"Đ¡Đ°Đ¹Đ»Đ°Ñƒ"},"cellPad":"Cell padding","cellSpace":"Cell spacing","column":{"menu":"Đ‘Đ°Đ³Đ°Đ½Đ°","insertBefore":"Đ¡ÑƒĐ»Đ´Đ°Đ½ Đ±Đ°Đ³Đ°Đ½Đ°Đ»Đ°Ñ€ Ó©ÑÑ‚Ó™̉¯","insertAfter":"Đ£̉£Đ½Đ°Đ½ Đ±Đ°Đ³Đ°Đ½Đ°Đ»Đ°Ñ€ Ó©ÑÑ‚Ó™̉¯","deleteColumn":"Đ‘Đ°Đ³Đ°Đ½Đ°Đ»Đ°Ñ€Đ½Ñ‹ Đ±ĐµÑ‚ĐµÑ€̉¯"},"columns":"Đ‘Đ°Đ³Đ°Đ½Đ°Đ»Đ°Ñ€","deleteTable":"Đ¢Đ°Đ±Đ»Đ¸Ñ†Đ°Đ½Ñ‹ Đ±ĐµÑ‚ĐµÑ€̉¯","headers":"Đ‘Đ°ÑˆĐ»Ñ‹ĐºĐ»Đ°Ñ€","headersBoth":"Đ˜ĐºĐµÑе Đ´Ó™","headersColumn":"Đ‘ĐµÑ€ĐµĐ½Ñ‡Đµ Đ±Đ°Đ³Đ°Đ½Đ°","headersNone":"̉ºĐ¸Ñ‡Đ±ĐµÑ€","headersRow":"Đ‘ĐµÑ€ĐµĐ½Ñ‡Đµ ÑĐ»","invalidBorder":"Đ§Đ¸Đº ĐºĐ¸̉£Đ»ĐµĐ³Đµ ÑĐ°Đ½ Đ±ÑƒĐ»Ñ‹Ñ€Đ³Đ° Ñ‚Đ¸ĐµÑˆ","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":"Đ¢Đ°Đ±Đ»Đ¸Ñ†Đ° Đ±Đ¸ĐµĐºĐ»ĐµĐ³Đµ ÑĐ°Đ½ Đ±ÑƒĐ»Ñ‹Ñ€Đ³Đ° Ñ‚Đ¸ĐµÑˆ","invalidRows":"Number of rows must be a number greater than 0.","invalidWidth":"Đ¢Đ°Đ±Đ»Đ¸Ñ†Đ° ĐºĐ¸̉£Đ»ĐµĐ³Đµ ÑĐ°Đ½ Đ±ÑƒĐ»Ñ‹Ñ€Đ³Đ° Ñ‚Đ¸ĐµÑˆ","menu":"Đ¢Đ°Đ±Đ»Đ¸Ñ†Đ° ̉¯Đ·Đ»ĐµĐºĐ»Ó™Ñ€Đµ","row":{"menu":"Юл","insertBefore":"Ó¨ÑÑ‚Ó™Đ½ ÑĐ»Đ»Đ°Ñ€ Ó©ÑÑ‚Ó™̉¯","insertAfter":"ĐÑÑ‚Đ°Đ½ ÑĐ»Đ»Đ°Ñ€ Ó©ÑÑ‚Ó™̉¯","deleteRow":"Đ®Đ»Đ»Đ°Ñ€Đ½Ñ‹ Đ±ĐµÑ‚ĐµÑ€̉¯"},"rows":"Đ®Đ»Đ»Đ°Ñ€","summary":"Đ™Đ¾Đ¼Đ³Đ°ĐºĐ»Đ°Ñƒ","title":"Đ¢Đ°Đ±Đ»Đ¸Ñ†Đ° ̉¯Đ·Đ»ĐµĐºĐ»Ó™Ñ€Đµ","toolbar":"Đ¢Đ°Đ±Đ»Đ¸Ñ†Đ°","widthPc":"Đ¿Ñ€Đ¾Ñ†ĐµĐ½Ñ‚","widthPx":"ĐĐ¾ĐºÑ‚Đ°Đ»Đ°Ñ€","widthUnit":"ĐºĐ¸̉£Đ»ĐµĐº Đ±ĐµÑ€Ó™Đ¼Đ»ĐµĐ³Đµ"},"undo":{"redo":"ĐĐ°Đ±Đ°Ñ‚Đ»Đ°Ñƒ","undo":"ĐĐ°Đ¹Ñ‚Đ°Ñ€Ñƒ"},"wsc":{"btnIgnore":"Ignore","btnIgnoreAll":"Ignore All","btnReplace":"Replace","btnReplaceAll":"Replace All","btnUndo":"Undo","changeTo":"Change to","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Spell checker not installed. Do you want to download it now?","manyChanges":"Spell check complete: %1 words changed","noChanges":"Spell check complete: No words changed","noMispell":"Spell check complete: No misspellings found","noSuggestions":"- No suggestions -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Not in dictionary","oneChange":"Spell check complete: One word changed","progress":"Spell check in progress...","title":"Spell Checker","toolbar":"Check Spelling"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/ug.js b/js/ckeditor/lang/ug.js
new file mode 100644
index 0000000..3d5785c
--- /dev/null
+++ b/js/ckeditor/lang/ug.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['ug']={"editor":"تەھرىرلىگۈچ","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"ALT+0 نى بÛسىپ Ùاردەمنى كۆرۈڭ","browseServer":"كۆرسىتىش مۇلازىمÛتىر","url":"ئەسلى ھۆججەت","protocol":"ÙƒÛلىشىم","upload":"Ùۈكلە","uploadSubmit":"مۇلازىمÛتىرغا Ùۈكلە","image":"سۈرەت","flash":"Flash","form":"جەدۋەل","checkbox":"ÙƒÛ†Ù¾ تاللاش رامكىسى","radio":"Ùەككە تاللاش توپچىسى","textField":"Ùەككە قۇر تÛكىست","textarea":"ÙƒÛ†Ù¾ قۇر تÛكىست","hiddenField":"Ùوشۇرۇن دائىرە","button":"توپچا","select":"تىزىم/تىزىملىك","imageButton":"سۈرەت دائىرە","notSet":"‹تەڭشەلمىگەن›","id":"ID","name":"ئات","langDir":"تىل Ùۆنىلىشى","langDirLtr":"سولدىن ئوڭغا (LTR)","langDirRtl":"ئوڭدىن سولغا (RTL)","langCode":"تىل كودى","longDescr":"تەپسىلى٠چۈشەندۈرۈش ئادرÛسى","cssClass":"ئۇسلۇب خىلىنىڭ ئاتى","advisoryTitle":"ماۋزۇ","cssStyle":"قۇر ئىچىدىكى ئۇسلۇبى","ok":"جەزملە","cancel":"ۋاز ÙƒÛ•Ú†","close":"تاقا","preview":"ئالدىن كۆزەت","resize":"چوڭلۇقىنى ئۆزگەرت","generalTab":"ئادەتتىكى","advancedTab":"ئالىÙ","validateNumberFailed":"سان پىچىمىدا كىرگۈزۈش زۆرۈر","confirmNewPage":"نۆۋەتتىكى پۈتۈك مەزمۇنى ساقلانمىدى، ÙÛÚ­Ù‰ پۈتۈك قۇرامسىز؟","confirmCancel":"قىسمەن ئۆزگەرتىش ساقلانمىدى، بۇ سۆزلەشكۈنى تاقامسىز؟","options":"تاللانما","target":"نىشان كۆزنەك","targetNew":"ÙÛÚ­Ù‰ كۆزنەك (_blank)","targetTop":"پۈتۈن بەت (_top)","targetSelf":"مەزكۇر كۆزنەك (_self)","targetParent":"ئاتا كۆزنەك (_parent)","langDirLTR":"سولدىن ئوڭغا (LTR)","langDirRTL":"ئوڭدىن سولغا (RTL)","styles":"ئۇسلۇبلار","cssClasses":"ئۇسلۇب خىللىرى","width":"كەڭلىك","height":"ئÛگىزلىك","align":"توغرىلىنىشى","alignLeft":"سول","alignRight":"ئوڭ","alignCenter":"ئوتتۇرا","alignJustify":"ئىككى تەرەپتىن توغرىلا","alignTop":"ئۈستى","alignMiddle":"ئوتتۇرا","alignBottom":"ئاستى","alignNone":"None","invalidValue":"ئىناۋەتسىز قىممەت.","invalidHeight":"ئÛگىزلىك چوقۇم رەقەم پىچىمىدا بولۇشى زۆرۈر","invalidWidth":"كەڭلىك چوقۇم رەقەم پىچىمىدا بولۇشى زۆرۈر","invalidCssLength":"بۇ سۆز بۆلىكى چوقۇم مۇۋاپىق بولغان CSS ئۇزۇنلۇق قىممىتى بولۇشى زۆرۈر، بىرلىكى (px, %, in, cm, mm, em, ex, pt Ùاكى pc)","invalidHtmlLength":"بۇ سۆز بۆلىكى چوقۇم بىرىكمە HTML ئۇزۇنلۇق قىممىتى بولۇشى ÙƒÛرەك. ئۆز ئىچىگە ئالىدىغان بىرلىك (px Ùاكى %)","invalidInlineStyle":"ئىچكى باغلانما ئۇسلۇبى چوقۇم Ú†Ûكىتلىك Ù¾Û•Ø´ بىلەن ئاÙرىلغان بىر Ùاكى ÙƒÛ†Ù¾ «خاسلىق ئاتى:خاسلىق قىممىتى» پىچىمىدا بولۇشى لازىم","cssLengthTooltip":"بۇ سۆز بۆلىكى بىرىكمە CSS ئۇزۇنلۇق قىممىتى بولۇشى ÙƒÛرەك. ئۆز ئىچىگە ئالىدىغان بىرلىك (px, %, in, cm, mm, em, ex, pt Ùاكى pc)","unavailable":"%1<span class=\\\\\"cke_accessibility\\\\\">ØŒ ئىشلەتكىلى بولماÙدۇ</span>"},"about":{"copy":"Copyright &copy; $1. نەشر ھوقۇقىغا ئىگە","dlgTitle":"CKEditor ھەققىدە","help":"$1 نى زىÙارەت قىلىپ Ùاردەمگە ئÛرىشىڭ","moreInfo":"تور تۇراÙىمىزنى زىÙارەت قىلىپ ÙƒÛلىشىمگە ئائىت تÛخىمۇ ÙƒÛ†Ù¾ ئۇچۇرغا ئÛرىشىڭ","title":"CKEditor ھەققىدە","userGuide":"CKEditor ئىشلەتكۈچى قوللانمىسى"},"basicstyles":{"bold":"توم","italic":"Ùانتۇ","strike":"ئۆچۈرۈش سىزىقى","subscript":"تۆۋەن ئىندÛكس","superscript":"Ùۇقىرى ئىندÛكس","underline":"ئاستى سىزىق"},"blockquote":{"toolbar":"بۆلەك نەقىل"},"clipboard":{"copy":"نەشر ھوقۇقىغا ئىگە بەلگىسى","copyError":"تور كۆرگۈڭىزنىڭ بىخەتەرلىك تەڭشىكى تەھرىرلىگۈچنىڭ كۆچۈر مەشغۇلاتىنى ئۆزلۈكىدىن ئىجرا قىلىشىغا Ùول قوÙماÙدۇ، ھەرپتاختا تÛز كۇنۇپكا (Ctrl/Cmd+C) ئارقىلىق تاماملاڭ","cut":"كەس","cutError":"تور كۆرگۈڭىزنىڭ بىخەتەرلىك تەڭشىكى تەھرىرلىگۈچنىڭ كەس مەشغۇلاتىنى ئۆزلۈكىدىن ئىجرا قىلىشىغا Ùول قوÙماÙدۇ، ھەرپتاختا تÛز كۇنۇپكا (Ctrl/Cmd+X) ئارقىلىق تاماملاڭ","paste":"چاپلا","pasteArea":"چاپلاش دائىرىسى","pasteMsg":"ھەرپتاختا تÛز كۇنۇپكا (<STRONG>Ctrl/Cmd+V</STRONG>) نى ئىشلىتىپ مەزمۇننى تۆۋەندىكى رامكىغا كۆچۈرۈڭ، ئاندىن <STRONG>جەزملە</STRONG>نى بÛسىڭ","securityMsg":"توركۆرگۈڭىزنىڭ بىخەتەرلىك تەڭشىكى سەۋەبىدىن بۇ تەھرىرلىگۈچ چاپلاش تاختىسىدىكى مەزمۇننى بىۋاستە زىÙارەت قىلالماÙدۇ، بۇ كۆزنەكتە قاÙتا بىر Ù‚Ûتىم چاپلىشىڭىز ÙƒÛرەك.","title":"چاپلا"},"contextmenu":{"options":"قىسقا Ùول تىزىملىك تاللانمىسى"},"button":{"selectedLabel":"%1 (Selected)"},"toolbar":{"toolbarCollapse":"قورال بالداقنى قاتلا","toolbarExpand":"قورال بالداقنى ÙاÙ","toolbarGroups":{"document":"پۈتۈك","clipboard":"چاپلاش تاختىسى/ÙÛنىۋال","editing":"تەھرىر","forms":"جەدۋەل","basicstyles":"ئاساسى٠ئۇسلۇب","paragraph":"ئابزاس","links":"ئۇلانما","insert":"قىستۇر","styles":"ئۇسلۇب","colors":"رەڭ","tools":"قورال"},"toolbars":"قورال بالداق"},"elementspath":{"eleLabel":"ئÛÙ„ÛÙ…Ûنت Ùولى","eleTitle":"%1 ئÛÙ„ÛÙ…Ûنت"},"format":{"label":"پىچىم","panelTitle":"پىچىم","tag_address":"ئادرÛس","tag_div":"ئابزاس (DIV)","tag_h1":"ماۋزۇ 1","tag_h2":"ماۋزۇ 2","tag_h3":"ماۋزۇ 3","tag_h4":"ماۋزۇ 4","tag_h5":"ماۋزۇ 5","tag_h6":"ماۋزۇ 6","tag_p":"ئادەتتىكى","tag_pre":"تىزىلغان پىچىم"},"horizontalrule":{"toolbar":"توغرا سىزىق قىستۇر"},"image":{"alertUrl":"سۈرەت ئادرÛسىنى كىرگۈزۈڭ","alt":"تÛكىست ئالماشتۇر","border":"گىرۋەك چوڭلۇقى","btnUpload":"مۇلازىمÛتىرغا Ùۈكلە","button2Img":"نۆۋەتتىكى توپچىنى سۈرەتكە ئۆزگەرتەمسىز؟","hSpace":"توغرىسىغا ئارىلىقى","img2Button":"نۆۋەتتىكى سۈرەتنى توپچىغا ئۆزگەرتەمسىز؟","infoTab":"سۈرەت","linkTab":"ئۇلانما","lockRatio":"نىسبەتنى قۇلۇپلا","menu":"سۈرەت خاسلىقى","resetSize":"ئەسلى Ú†ÙˆÚ­Ù„Û‡Ù‚","title":"سۈرەت خاسلىقى","titleButton":"سۈرەت دائىرە خاسلىقى","upload":"Ùۈكلە","urlMissing":"سۈرەتنىڭ ئەسلى ھۆججەت ئادرÛسى ÙƒÛ•Ù…","vSpace":"بوÙىغا ئارىلىقى","validateBorder":"گىرۋەك چوڭلۇقى چوقۇم سان بولىدۇ","validateHSpace":"توغرىسىغا ئارىلىق چوقۇم پۈتۈن سان بولىدۇ","validateVSpace":"بوÙىغا ئارىلىق چوقۇم پۈتۈن سان بولىدۇ"},"indent":{"indent":"تاراÙت","outdent":"ÙƒÛ•Ú­Û•Ùت"},"fakeobjects":{"anchor":"لەڭگەرلىك نۇقتا","flash":"Flash جانلاندۇرۇم","hiddenfield":"Ùوشۇرۇن دائىرە","iframe":"IFrame","unknown":"ÙÙˆÚ†Û‡Ù† Ù†Û•Ú­"},"link":{"acccessKey":"زىÙارەت كۇنۇپكا","advanced":"ئالىÙ","advisoryContentType":"مەزمۇن تىپى","advisoryTitle":"ماۋزۇ","anchor":{"toolbar":"لەڭگەرلىك نۇقتا ئۇلانمىسى قىستۇر/تەھرىرلە","menu":"لەڭگەرلىك نۇقتا ئۇلانما خاسلىقى","title":"لەڭگەرلىك نۇقتا ئۇلانما خاسلىقى","name":"لەڭگەرلىك نۇقتا ئاتى","errorName":"لەڭگەرلىك نۇقتا ئاتىنى كىرگۈزۈڭ","remove":"لەڭگەرلىك نۇقتا ئۆچۈر"},"anchorId":"لەڭگەرلىك نۇقتا ID سى بوÙÙ‰Ú†Û•","anchorName":"لەڭگەرلىك نۇقتا ئاتى بوÙÙ‰Ú†Û•","charset":"ھەرپ كودلىنىشى","cssClasses":"ئۇسلۇب خىلى ئاتى","emailAddress":"ئادرÛس","emailBody":"مەزمۇن","emailSubject":"ماۋزۇ","id":"ID","info":"ئۇلانما ئۇچۇرى","langCode":"تىل كودى","langDir":"تىل Ùۆنىلىشى","langDirLTR":"سولدىن ئوڭغا (LTR)","langDirRTL":"ئوڭدىن سولغا (RTL)","menu":"ئۇلانما تەھرىر","name":"ئات","noAnchors":"(بۇ پۈتۈكتە ئىشلەتكىلى بولىدىغان لەڭگەرلىك نۇقتا Ùوق)","noEmail":"ئÛلخەت ئادرÛسىنى كىرگۈزۈڭ","noUrl":"ئۇلانما ئادرÛسىنى كىرگۈزۈڭ","other":"‹باشقا›","popupDependent":"تەۋە (NS)","popupFeatures":"قاڭقىش كۆزنەك خاسلىقى","popupFullScreen":"پۈتۈن ئÛكران (IE)","popupLeft":"سول","popupLocationBar":"ئادرÛس بالداق","popupMenuBar":"تىزىملىك بالداق","popupResizable":"چوڭلۇقى ئۆزگەرتىشچان","popupScrollBars":"دومىلىما سۈرگۈچ","popupStatusBar":"ھالەت بالداق","popupToolbar":"قورال بالداق","popupTop":"ئوڭ","rel":"باغلىنىش","selectAnchor":"بىر لەڭگەرلىك نۇقتا تاللاڭ","styles":"قۇر ئىچىدىكى ئۇسلۇبى","tabIndex":"Tab تەرتىپى","target":"نىشان","targetFrame":"‹كاندۇك›","targetFrameName":"نىشان كاندۇك ئاتى","targetPopup":"‹قاڭقىش كۆزنەك›","targetPopupName":"قاڭقىش كۆزنەك ئاتى","title":"ئۇلانما","toAnchor":"بەت ئىچىدىكى لەڭگەرلىك نۇقتا ئۇلانمىسى","toEmail":"ئÛلخەت","toUrl":"ئادرÛس","toolbar":"ئۇلانما قىستۇر/تەھرىرلە","type":"ئۇلانما تىپى","unlink":"ئۇلانما بىكار قىل","upload":"Ùۈكلە"},"list":{"bulletedlist":"تۈر بەلگە تىزىمى","numberedlist":"تەرتىپ نومۇر تىزىمى"},"magicline":{"title":"بۇ جاÙغا ئابزاس قىستۇر"},"maximize":{"maximize":"چوڭاÙت","minimize":"كىچىكلەت"},"pastetext":{"button":"پىچىمى Ùوق تÛكىست سۈپىتىدە چاپلا","title":"پىچىمى Ùوق تÛكىست سۈپىتىدە چاپلا"},"pastefromword":{"confirmCleanup":"سىز چاپلىماقچى بولغان مەزمۇن MS Word تىن كەلگەندەك قىلىدۇ، MS Word پىچىمىنى تازىلىۋەتكەندىن ÙƒÛÙىن ئاندىن چاپلامدۇ؟","error":"ئىچكى خاتالىق سەۋەبىدىن چاپلاÙدىغان سانلىق مەلۇماتنى تازىلىÙالماÙدۇ","title":"MS Word تىن چاپلا","toolbar":"MS Word تىن چاپلا"},"removeformat":{"toolbar":"پىچىمنى چىقىرىۋەت"},"sourcearea":{"toolbar":"مەنبە"},"specialchar":{"options":"ئالاھىدە ھەرپ تاللانمىسى","title":"ئالاھىدە ھەرپ تاللاڭ","toolbar":"ئالاھىدە ھەرپ قىستۇر"},"scayt":{"btn_about":"شۇئان ئىملا تەكشۈرۈش ھەققىدە","btn_dictionaries":"لۇغەت","btn_disable":"شۇئان ئىملا تەكشۈرۈشنى چەكلە","btn_enable":"شۇئان ئىملا تەكشۈرۈشنى قوزغات","btn_langs":"تىل","btn_options":"تاللانما","text_title":"شۇئان ئىملا تەكشۈر"},"stylescombo":{"label":"ئۇسلۇب","panelTitle":"ئۇسلۇب","panelTitle1":"بۆلەك دەرىجىسىدىكى ئÛÙ„ÛÙ…Ûنت ئۇسلۇبى","panelTitle2":"ئىچكى باغلانما ئÛÙ„ÛÙ…Ûنت ئۇسلۇبى","panelTitle3":"Ù†Û•Ú­ (Object) ئÛÙ„ÛÙ…Ûنت ئۇسلۇبى"},"table":{"border":"گىرۋەك","caption":"ماۋزۇ","cell":{"menu":"كاتەكچە","insertBefore":"سولغا كاتەكچە قىستۇر","insertAfter":"ئوڭغا كاتەكچە قىستۇر","deleteCell":"كەتەكچە ئۆچۈر","merge":"كاتەكچە بىرلەشتۈر","mergeRight":"كاتەكچىنى ئوڭغا بىرلەشتۈر","mergeDown":"كاتەكچىنى ئاستىغا بىرلەشتۈر","splitHorizontal":"كاتەكچىنى توغرىسىغا بىرلەشتۈر","splitVertical":"كاتەكچىنى بوÙىغا بىرلەشتۈر","title":"كاتەكچە خاسلىقى","cellType":"كاتەكچە تىپى","rowSpan":"بوÙىغا چات ئارىسى قۇر سانى","colSpan":"توغرىسىغا چات ئارىسى ئىستون سانى","wordWrap":"ئۆزلۈكىدىن قۇر قاتلا","hAlign":"توغرىسىغا توغرىلا","vAlign":"بوÙىغا توغرىلا","alignBaseline":"ئاساسى٠سىزىق","bgColor":"تەگلىك رەڭگى","borderColor":"گىرۋەك رەڭگى","data":"سانلىق مەلۇمات","header":"جەدۋەل باشى","yes":"ھەئە","no":"Ùاق","invalidWidth":"كاتەكچە كەڭلىكى چوقۇم سان بولىدۇ","invalidHeight":"كاتەكچە ئÛگىزلىكى چوقۇم سان بولىدۇ","invalidRowSpan":"قۇر چات ئارىسى چوقۇم پۈتۈن سان بولىدۇ ","invalidColSpan":"ئىستون چات ئارىسى چوقۇم پۈتۈن سان بولىدۇ","chooseColor":"تاللاڭ"},"cellPad":"Ùان ئارىلىق","cellSpace":"ئارىلىق","column":{"menu":"ئىستون","insertBefore":"سولغا ئىستون قىستۇر","insertAfter":"ئوڭغا ئىستون قىستۇر","deleteColumn":"ئىستون ئۆچۈر"},"columns":"ئىستون سانى","deleteTable":"جەدۋەل ئۆچۈر","headers":"ماۋزۇ كاتەكچە","headersBoth":"بىرىنچى ئىستون Û‹Û• بىرىنچى قۇر","headersColumn":"بىرىنچى ئىستون","headersNone":"Ùوق","headersRow":"بىرىنچى قۇر","invalidBorder":"گىرۋەك توملۇقى چوقۇم سان بولىدۇ","invalidCellPadding":"كاتەكچىگە چوقۇم سان تولدۇرۇلىدۇ","invalidCellSpacing":"كاتەكچە ئارىلىقى چوقۇم سان بولىدۇ","invalidCols":"بەلگىلەنگەن قۇر سانى چوقۇم نۆلدىن Ú†ÙˆÚ­ بولىدۇ","invalidHeight":"جەدۋەل ئÛگىزلىكى چوقۇم سان بولىدۇ","invalidRows":"بەلگىلەنگەن ئىستون سانى چوقۇم نۆلدىن Ú†ÙˆÚ­ بولىدۇ","invalidWidth":"جەدۋەل كەڭلىكى چوقۇم سان بولىدۇ","menu":"جەدۋەل خاسلىقى","row":{"menu":"قۇر","insertBefore":"ئۈستىگە قۇر قىستۇر","insertAfter":"ئاستىغا قۇر قىستۇر","deleteRow":"قۇر ئۆچۈر"},"rows":"قۇر سانى","summary":"ئۈزۈندە","title":"جەدۋەل خاسلىقى","toolbar":"جەدۋەل","widthPc":"پىرسەنت","widthPx":"پىكسÛÙ„","widthUnit":"كەڭلىك بىرلىكى"},"undo":{"redo":"قاÙتىلا ","undo":"ÙÛنىۋال"},"wsc":{"btnIgnore":"پەرۋا قىلما","btnIgnoreAll":"ھەممىگە پەرۋا قىلما","btnReplace":"ئالماشتۇر","btnReplaceAll":"ھەممىنى ئالماشتۇر","btnUndo":"ÙÛنىۋال","changeTo":"ئۆزگەرت","errorLoading":"لازىملىق مۇلازىمÛتىرنى Ùۈكلىگەندە خاتالىق كۆرۈلدى: %s.","ieSpellDownload":"ئىملا تەكشۈرۈش قىستۇرمىسى تÛخى ئورنىتىلمىغان، ھازىرلا چۈشۈرەمسىز؟","manyChanges":"ئىملا تەكشۈرۈش تامام: %1 سۆزنى ئۆزگەرتتى","noChanges":"ئىملا تەكشۈرۈش تامام: Ú¾Ûچقانداق سۆزنى ئۆزگەرتمىدى","noMispell":"ئىملا تەكشۈرۈش تامام: ئىملا خاتالىقى باÙقالمىدى","noSuggestions":"-تەكلىپ Ùوق-","notAvailable":"كەچۈرۈڭ، مۇلازىمÛتىرنى ۋاقتىنچە ئىشلەتكىلى بولماÙدۇ","notInDic":"لۇغەتتە Ùوق","oneChange":"ئىملا تەكشۈرۈش تامام: بىر سۆزنى ئۆزگەرتتى","progress":"ئىملا تەكشۈرۈۋاتىدۇ…","title":"ئىملا تەكشۈر","toolbar":"ئىملا تەكشۈر"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/uk.js b/js/ckeditor/lang/uk.js
new file mode 100644
index 0000000..3c4bd88
--- /dev/null
+++ b/js/ckeditor/lang/uk.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['uk']={"editor":"Đ¢ĐµĐºÑÑ‚Đ¾Đ²Đ¸Đ¹ Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€","editorPanel":"ĐŸĐ°Đ½ĐµĐ»ÑŒ Ñ‚ĐµĐºÑÑ‚Đ¾Đ²Đ¾Đ³Đ¾ Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€Đ°","common":{"editorHelp":"Đ½Đ°Ñ‚Đ¸ÑĐ½Ñ–Ñ‚ÑŒ ALT 0 Đ´Đ»Ñ Đ´Đ¾Đ²Ñ–Đ´ĐºĐ¸","browseServer":"ĐĐ³Đ»ÑĐ´ Đ¡ĐµÑ€Đ²ĐµÑ€Đ°","url":"URL","protocol":"ĐŸÑ€Đ¾Ñ‚Đ¾ĐºĐ¾Đ»","upload":"ĐĐ°Đ´Ñ–ÑĐ»Đ°Ñ‚Đ¸","uploadSubmit":"ĐĐ°Đ´Ñ–ÑĐ»Đ°Ñ‚Đ¸ Đ½Đ° ÑĐµÑ€Đ²ĐµÑ€","image":"Đ—Đ¾Đ±Ñ€Đ°Đ¶ĐµĐ½Đ½Ñ","flash":"Flash","form":"Đ¤Đ¾Ñ€Đ¼Đ°","checkbox":"Đ“Đ°Đ»Đ¾Ñ‡ĐºĐ°","radio":"ĐĐ½Đ¾Đ¿ĐºĐ° Đ²Đ¸Đ±Đ¾Ñ€Ñƒ","textField":"Đ¢ĐµĐºÑÑ‚Đ¾Đ²Đµ Đ¿Đ¾Đ»Đµ","textarea":"Đ¢ĐµĐºÑÑ‚Đ¾Đ²Đ° Đ¾Đ±Đ»Đ°ÑÑ‚ÑŒ","hiddenField":"ĐŸÑ€Đ¸Ñ…Đ¾Đ²Đ°Đ½Đµ Đ¿Đ¾Đ»Đµ","button":"ĐĐ½Đ¾Đ¿ĐºĐ°","select":"Đ¡Đ¿Đ¸ÑĐ¾Đº","imageButton":"ĐĐ½Đ¾Đ¿ĐºĐ° Ñ–Đ· Đ·Đ¾Đ±Ñ€Đ°Đ¶ĐµĐ½Đ½ÑĐ¼","notSet":"<Đ½Đµ Đ²Đ¸Đ·Đ½Đ°Ñ‡ĐµĐ½Đ¾>","id":"Đ†Đ´ĐµĐ½Ñ‚Đ¸Ñ„Ñ–ĐºĐ°Ñ‚Đ¾Ñ€","name":"Đ†Đ¼'Ñ","langDir":"ĐĐ°Đ¿Ñ€ÑĐ¼Đ¾Đº Đ¼Đ¾Đ²Đ¸","langDirLtr":"Đ—Đ»Ñ–Đ²Đ° Đ½Đ°Đ¿Ñ€Đ°Đ²Đ¾ (LTR)","langDirRtl":"Đ¡Đ¿Ñ€Đ°Đ²Đ° Đ½Đ°Đ»Ñ–Đ²Đ¾ (RTL)","langCode":"ĐĐ¾Đ´ Đ¼Đ¾Đ²Đ¸","longDescr":"Đ”Đ¾Đ²Đ³Đ¸Đ¹ Đ¾Đ¿Đ¸Ñ URL","cssClass":"ĐĐ»Đ°Ñ CSS","advisoryTitle":"Đ—Đ°Đ³Đ¾Đ»Đ¾Đ²Đ¾Đº","cssStyle":"Đ¡Ñ‚Đ¸Đ»ÑŒ CSS","ok":"ĐĐ","cancel":"Đ¡ĐºĐ°ÑÑƒĐ²Đ°Ñ‚Đ¸","close":"Đ—Đ°ĐºÑ€Đ¸Ñ‚Đ¸","preview":"ĐŸĐ¾Đ¿ĐµÑ€ĐµĐ´Đ½Ñ–Đ¹ Đ¿ĐµÑ€ĐµĐ³Đ»ÑĐ´","resize":"ĐŸĐ¾Ñ‚ÑĐ³Đ½Ñ–Ñ‚ÑŒ Đ´Đ»Ñ Đ·Đ¼Ñ–Đ½Đ¸ Ñ€Đ¾Đ·Đ¼Ñ–Ñ€Ñ–Đ²","generalTab":"ĐÑĐ½Đ¾Đ²Đ½Đµ","advancedTab":"Đ”Đ¾Đ´Đ°Ñ‚ĐºĐ¾Đ²Đµ","validateNumberFailed":"Đ—Đ½Đ°Ñ‡ĐµĐ½Đ½Ñ Đ½Đµ Ñ” Ñ†Ñ–Đ»Đ¸Đ¼ Ñ‡Đ¸ÑĐ»Đ¾Đ¼.","confirmNewPage":"Đ’ÑÑ– Đ½ĐµĐ·Đ±ĐµÑ€ĐµĐ¶ĐµĐ½Ñ– Đ·Đ¼Ñ–Đ½Đ¸ Đ±ÑƒĐ´ÑƒÑ‚ÑŒ Đ²Ñ‚Ñ€Đ°Ñ‡ĐµĐ½Ñ–. Ви Đ²Đ¿ĐµĐ²Đ½ĐµĐ½Ñ–, Ñ‰Đ¾ Ñ…Đ¾Ñ‡ĐµÑ‚Đµ Đ·Đ°Đ²Đ°Đ½Ñ‚Đ°Đ¶Đ¸Ñ‚Đ¸ Đ½Đ¾Đ²Ñƒ ÑÑ‚Đ¾Ñ€Ñ–Đ½ĐºÑƒ?","confirmCancel":"ДеÑĐºÑ– Đ¾Đ¿Ñ†Ñ–Ñ— Đ·Đ¼Ñ–Đ½ĐµĐ½Đ¾. Đ—Đ°ĐºÑ€Đ¸Ñ‚Đ¸ Đ²Ñ–ĐºĐ½Đ¾ без Đ·Đ±ĐµÑ€ĐµĐ¶ĐµĐ½Đ½Ñ Đ·Đ¼Ñ–Đ½?","options":"ĐĐ¿Ñ†Ñ–Ñ—","target":"Đ¦Ñ–Đ»ÑŒ","targetNew":"ĐĐ¾Đ²Đµ Đ²Ñ–ĐºĐ½Đ¾ (_blank)","targetTop":"ĐŸĐ¾Ñ‚Đ¾Ñ‡Đ½Đµ Đ²Ñ–ĐºĐ½Đ¾ (_top)","targetSelf":"ĐŸĐ¾Ñ‚Đ¾Ñ‡Đ½Đ¸Đ¹ Ñ„Ñ€ĐµĐ¹Đ¼/Đ²Ñ–ĐºĐ½Đ¾ (_self)","targetParent":"Đ‘Đ°Ñ‚ÑŒĐºÑ–Đ²ÑÑŒĐºĐ¸Đ¹ Ñ„Ñ€ĐµĐ¹Đ¼/Đ²Ñ–ĐºĐ½Đ¾ (_parent)","langDirLTR":"Đ—Đ»Ñ–Đ²Đ° Đ½Đ°Đ¿Ñ€Đ°Đ²Đ¾ (LTR)","langDirRTL":"Đ¡Đ¿Ñ€Đ°Đ²Đ° Đ½Đ°Đ»Ñ–Đ²Đ¾ (RTL)","styles":"Đ¡Ñ‚Đ¸Đ»ÑŒ CSS","cssClasses":"ĐĐ»Đ°Ñ CSS","width":"Đ¨Đ¸Ñ€Đ¸Đ½Đ°","height":"ВиÑĐ¾Ñ‚Đ°","align":"Đ’Đ¸Ñ€Ñ–Đ²Đ½ÑĐ²Đ°Đ½Đ½Ñ","alignLeft":"ĐŸĐ¾ Đ»Ñ–Đ²Đ¾Đ¼Ñƒ ĐºÑ€Đ°Ñ","alignRight":"ĐŸĐ¾ Đ¿Ñ€Đ°Đ²Đ¾Đ¼Ñƒ ĐºÑ€Đ°Ñ","alignCenter":"ĐŸĐ¾ Ñ†ĐµĐ½Ñ‚Ñ€Ñƒ","alignJustify":"ĐŸĐ¾ ÑˆĐ¸Ñ€Đ¸Đ½Ñ–","alignTop":"ĐŸĐ¾ Đ²ĐµÑ€Ñ…Đ½ÑŒĐ¾Đ¼Ñƒ ĐºÑ€Đ°Ñ","alignMiddle":"ĐŸĐ¾ ÑĐµÑ€ĐµĐ´Đ¸Đ½Ñ–","alignBottom":"ĐŸĐ¾ Đ½Đ¸Đ¶Đ½ÑŒĐ¾Đ¼Ñƒ ĐºÑ€Đ°Ñ","alignNone":"ĐĐµĐ¼Đ°","invalidValue":"ĐĐµĐ²Ñ–Ñ€Đ½Đµ Đ·Đ½Đ°Ñ‡ĐµĐ½Đ½Ñ.","invalidHeight":"ВиÑĐ¾Ñ‚Đ° Đ¿Đ¾Đ²Đ¸Đ½Đ½Đ° Đ±ÑƒÑ‚Đ¸ Ñ†Ñ–Đ»Đ¸Đ¼ Ñ‡Đ¸ÑĐ»Đ¾Đ¼.","invalidWidth":"Đ¨Đ¸Ñ€Đ¸Đ½Đ° Đ¿Đ¾Đ²Đ¸Đ½Đ½Đ° Đ±ÑƒÑ‚Đ¸ Ñ†Ñ–Đ»Đ¸Đ¼ Ñ‡Đ¸ÑĐ»Đ¾Đ¼.","invalidCssLength":"Đ—Đ½Đ°Ñ‡ĐµĐ½Đ½Ñ, Đ²ĐºĐ°Đ·Đ°Đ½Đµ Đ´Đ»Ñ \"%1\" Đ² Đ¿Đ¾Đ»Ñ– Đ¿Đ¾Đ²Đ¸Đ½Đ½Đ¾ Đ±ÑƒÑ‚Đ¸ Đ¿Đ¾Đ·Đ¸Ñ‚Đ¸Đ²Đ½Đ¸Đ¼ Ñ‡Đ¸ÑĐ»Đ¾Đ¼ Đ°Đ±Đ¾ без Đ´Ñ–Đ¹ÑĐ½Đ¾Đ³Đ¾ Đ²Đ¸Đ¼Ñ–Ñ€Ñƒ CSS Đ±Đ»Đ¾ĐºÑƒ (px, %, in, cm, mm, em, ex, pt Đ°Đ±Đ¾ pc).","invalidHtmlLength":"Đ—Đ½Đ°Ñ‡ĐµĐ½Đ½Ñ, Đ²ĐºĐ°Đ·Đ°Đ½Đµ Đ´Đ»Ñ \"%1\" Đ² Đ¿Đ¾Đ»Ñ– Đ¿Đ¾Đ²Đ¸Đ½Đ½Đ¾ Đ±ÑƒÑ‚Đ¸ Đ¿Đ¾Đ·Đ¸Ñ‚Đ¸Đ²Đ½Đ¸Đ¼ Ñ‡Đ¸ÑĐ»Đ¾Đ¼ Đ°Đ±Đ¾ без Đ´Ñ–Đ¹ÑĐ½Đ¾Đ³Đ¾ Đ²Đ¸Đ¼Ñ–Ñ€Ñƒ HTML Đ±Đ»Đ¾ĐºÑƒ (px Đ°Đ±Đ¾ %).","invalidInlineStyle":"Đ—Đ½Đ°Ñ‡ĐµĐ½Đ½Ñ, Đ²ĐºĐ°Đ·Đ°Đ½Đµ Đ´Đ»Ñ Đ²Đ±ÑƒĐ´Đ¾Đ²Đ°Đ½Đ¾Đ³Đ¾ ÑÑ‚Đ¸Đ»Ñ Đ¿Đ¾Đ²Đ¸Đ½Đ½Đµ ÑĐºĐ»Đ°Đ´Đ°Ñ‚Đ¸ÑÑ Đ· Đ¾Đ´Đ½Đ¾Đ³Đ¾ Ñ‡Đ¸ ĐºÑ–Đ»ÑŒĐºĐ¾Ñ… ĐºĐ¾Ñ€Ñ‚ĐµĐ¶Ñ–Đ² у Ñ„Đ¾Ñ€Đ¼Đ°Ñ‚Ñ– \"Ñ–Đ¼'Ñ : Đ·Đ½Đ°Ñ‡ĐµĐ½Đ½Ñ\", Ñ€Đ¾Đ·Đ´Ñ–Đ»ĐµĐ½Đ¸Ñ… ĐºÑ€Đ°Đ¿ĐºĐ¾Ñ Đ· ĐºĐ¾Đ¼Đ¾Ñ.","cssLengthTooltip":"Đ’Đ²ĐµĐ´Ñ–Ñ‚ÑŒ Đ½Đ¾Đ¼ĐµÑ€ Đ·Đ½Đ°Ñ‡ĐµĐ½Đ½Ñ Đ² Đ¿Ñ–ĐºÑелÑÑ… Đ°Đ±Đ¾ Ñ‡Đ¸ÑĐ»Đ¾ Đ· Đ´Ñ–Đ¹ÑĐ½Đ¾Ñ Đ¾Đ´Đ¸Đ½Đ¸Ñ†Ñ– CSS (px, %, in, cm, mm, em, ex, pt Đ°Đ±Đ¾ pc).","unavailable":"%1<span class=\"cke_accessibility\">, Đ½Đµ Đ´Đ¾ÑÑ‚ÑƒĐ¿Đ½Đµ</span>"},"about":{"copy":"Copyright &copy; $1. Đ’ÑÑ– Đ¿Ñ€Đ°Đ²Đ° Đ·Đ°ÑÑ‚ĐµÑ€ĐµĐ¶ĐµĐ½Đ¾.","dlgTitle":"ĐŸÑ€Đ¾ CKEditor","help":"ĐŸĐµÑ€ĐµĐ²Ñ–Ñ€Ñ‚Đµ $1 Đ´Đ»Ñ Đ´Đ¾Đ¿Đ¾Đ¼Đ¾Đ³Đ¸.","moreInfo":"Đ©Đ¾Đ´Đ¾ Ñ–Đ½Ñ„Đ¾Ñ€Đ¼Đ°Ñ†Ñ–Ñ— Đ· Đ»Ñ–Ñ†ĐµĐ½Đ·ÑƒĐ²Đ°Đ½Đ½Ñ Đ·Đ°Đ²Ñ–Ñ‚Đ°Đ¹Ñ‚Đµ Đ½Đ° Đ½Đ°Ñˆ ÑĐ°Đ¹Ñ‚:","title":"ĐŸÑ€Đ¾ CKEditor","userGuide":"Đ†Đ½ÑÑ‚Ñ€ÑƒĐºÑ†Ñ–Ñ ĐĐ¾Ñ€Đ¸ÑÑ‚ÑƒĐ²Đ°Ñ‡Đ° Đ´Đ»Ñ CKEditor"},"basicstyles":{"bold":"Đ–Đ¸Ñ€Đ½Đ¸Đ¹","italic":"ĐурÑĐ¸Đ²","strike":"Đ—Đ°ĐºÑ€ĐµÑĐ»ĐµĐ½Đ¸Đ¹","subscript":"ĐĐ¸Đ¶Đ½Ñ–Đ¹ Ñ–Đ½Đ´ĐµĐºÑ","superscript":"Đ’ĐµÑ€Ñ…Đ½Ñ–Đ¹ Ñ–Đ½Đ´ĐµĐºÑ","underline":"ĐŸÑ–Đ´ĐºÑ€ĐµÑĐ»ĐµĐ½Đ¸Đ¹"},"blockquote":{"toolbar":"Đ¦Đ¸Ñ‚Đ°Ñ‚Đ°"},"clipboard":{"copy":"ĐĐ¾Đ¿Ñ–ÑĐ²Đ°Ñ‚Đ¸","copyError":"ĐĐ°Đ»Đ°ÑˆÑ‚ÑƒĐ²Đ°Đ½Đ½Ñ Đ±ĐµĐ·Đ¿ĐµĐºĐ¸ Đ’Đ°ÑˆĐ¾Đ³Đ¾ Đ±Ñ€Đ°ÑƒĐ·ĐµÑ€Đ° Đ½Đµ Đ´Đ¾Đ·Đ²Đ¾Đ»ÑÑÑ‚ÑŒ Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€Ñƒ Đ°Đ²Ñ‚Đ¾Đ¼Đ°Ñ‚Đ¸Ñ‡Đ½Đ¾ Đ²Đ¸ĐºĐ¾Đ½ÑƒĐ²Đ°Ñ‚Đ¸ Đ¾Đ¿ĐµÑ€Đ°Ñ†Ñ–Ñ— ĐºĐ¾Đ¿Ñ–ÑĐ²Đ°Đ½Đ½Ñ. Đ‘ÑƒĐ´ÑŒ лаÑĐºĐ°, Đ²Đ¸ĐºĐ¾Ñ€Đ¸ÑÑ‚Đ¾Đ²ÑƒĐ¹Ñ‚Đµ ĐºĐ»Đ°Đ²Ñ–Đ°Ñ‚ÑƒÑ€Ñƒ Đ´Đ»Ñ Ñ†ÑŒĐ¾Đ³Đ¾ (Ctrl/Cmd+C).","cut":"Đ’Đ¸Ñ€Ñ–Đ·Đ°Ñ‚Đ¸","cutError":"ĐĐ°Đ»Đ°ÑˆÑ‚ÑƒĐ²Đ°Đ½Đ½Ñ Đ±ĐµĐ·Đ¿ĐµĐºĐ¸ Đ’Đ°ÑˆĐ¾Đ³Đ¾ Đ±Ñ€Đ°ÑƒĐ·ĐµÑ€Đ° Đ½Đµ Đ´Đ¾Đ·Đ²Đ¾Đ»ÑÑÑ‚ÑŒ Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€Ñƒ Đ°Đ²Ñ‚Đ¾Đ¼Đ°Ñ‚Đ¸Ñ‡Đ½Đ¾ Đ²Đ¸ĐºĐ¾Đ½ÑƒĐ²Đ°Ñ‚Đ¸ Đ¾Đ¿ĐµÑ€Đ°Ñ†Ñ–Ñ— Đ²Đ¸Ñ€Ñ–Đ·ÑƒĐ²Đ°Đ½Đ½Ñ. Đ‘ÑƒĐ´ÑŒ лаÑĐºĐ°, Đ²Đ¸ĐºĐ¾Ñ€Đ¸ÑÑ‚Đ¾Đ²ÑƒĐ¹Ñ‚Đµ ĐºĐ»Đ°Đ²Ñ–Đ°Ñ‚ÑƒÑ€Ñƒ Đ´Đ»Ñ Ñ†ÑŒĐ¾Đ³Đ¾ (Ctrl/Cmd+X)","paste":"Đ’ÑÑ‚Đ°Đ²Đ¸Ñ‚Đ¸","pasteArea":"ĐблаÑÑ‚ÑŒ Đ²ÑÑ‚Đ°Đ²ĐºĐ¸","pasteMsg":"Đ‘ÑƒĐ´ÑŒ лаÑĐºĐ°, Đ²ÑÑ‚Đ°Đ²Ñ‚Đµ Ñ–Đ½Ñ„Đ¾Ñ€Đ¼Đ°Ñ†Ñ–Ñ Đ· Đ±ÑƒÑ„ĐµÑ€Đ° Đ¾Đ±Đ¼Ñ–Đ½Ñƒ Đ² Ñ†Ñ Đ¾Đ±Đ»Đ°ÑÑ‚ÑŒ, ĐºĐ¾Ñ€Đ¸ÑтуÑÑ‡Đ¸ÑÑŒ ĐºĐ¾Đ¼Đ±Ñ–Đ½Đ°Ñ†Ñ–Ñ”Ñ ĐºĐ»Đ°Đ²Ñ–Ñˆ (<STRONG>Ctrl/Cmd+V</STRONG>), Ñ‚Đ° Đ½Đ°Ñ‚Đ¸ÑĐ½Ñ–Ñ‚ÑŒ <STRONG>OK</STRONG>.","securityMsg":"Đ ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€ Đ½Đµ Đ¼Đ¾Đ¶Đµ Đ¾Ñ‚Ñ€Đ¸Đ¼Đ°Ñ‚Đ¸ Đ¿Ñ€ÑĐ¼Đ¸Đ¹ Đ´Đ¾ÑÑ‚ÑƒĐ¿ Đ´Đ¾ Đ±ÑƒÑ„ĐµÑ€Ñƒ Đ¾Đ±Đ¼Ñ–Đ½Ñƒ у Đ·Đ²'ÑĐ·ĐºÑƒ Đ· Đ½Đ°Đ»Đ°ÑˆÑ‚ÑƒĐ²Đ°Đ½Đ½ÑĐ¼Đ¸ Đ’Đ°ÑˆĐ¾Đ³Đ¾ Đ±Ñ€Đ°ÑƒĐ·ĐµÑ€Đ°. Đ’Đ°Đ¼ Đ¿Đ¾Ñ‚Ñ€Ñ–Đ±Đ½Đ¾ Đ²ÑÑ‚Đ°Đ²Đ¸Ñ‚Đ¸ Ñ–Đ½Ñ„Đ¾Ñ€Đ¼Đ°Ñ†Ñ–Ñ Đ² Ñ†Đµ Đ²Ñ–ĐºĐ½Đ¾.","title":"Đ’ÑÑ‚Đ°Đ²Đ¸Ñ‚Đ¸"},"contextmenu":{"options":"ĐĐ¿Ñ†Ñ–Ñ— ĐºĐ¾Đ½Ñ‚ĐµĐºÑÑ‚Đ½Đ¾Đ³Đ¾ Đ¼ĐµĐ½Ñ"},"button":{"selectedLabel":"%1 (Đ’Đ¸Đ±Ñ€Đ°Đ½Đ¾)"},"toolbar":{"toolbarCollapse":"Đ—Đ³Đ¾Ñ€Đ½ÑƒÑ‚Đ¸ Đ¿Đ°Đ½ĐµĐ»ÑŒ Ñ–Đ½ÑÑ‚Ñ€ÑƒĐ¼ĐµĐ½Ñ‚Ñ–Đ²","toolbarExpand":"Đ Đ¾Đ·Đ³Đ¾Ñ€Đ½ÑƒÑ‚Đ¸ Đ¿Đ°Đ½ĐµĐ»ÑŒ Ñ–Đ½ÑÑ‚Ñ€ÑƒĐ¼ĐµĐ½Ñ‚Ñ–Đ²","toolbarGroups":{"document":"Đ”Đ¾ĐºÑƒĐ¼ĐµĐ½Ñ‚","clipboard":"Đ‘ÑƒÑ„ĐµÑ€ Đ¾Đ±Đ¼Ñ–Đ½Ñƒ / Đ¡ĐºĐ°ÑÑƒĐ²Đ°Ñ‚Đ¸","editing":"Đ ĐµĐ´Đ°Đ³ÑƒĐ²Đ°Đ½Đ½Ñ","forms":"Đ¤Đ¾Ñ€Đ¼Đ¸","basicstyles":"ĐÑĐ½Đ¾Đ²Đ½Đ¸Đ¹ Đ¡Ñ‚Đ¸Đ»ÑŒ","paragraph":"ĐŸĐ°Ñ€Đ°Đ³Ñ€Đ°Ñ„","links":"ĐŸĐ¾ÑĐ¸Đ»Đ°Đ½Đ½Ñ","insert":"Đ’ÑÑ‚Đ°Đ²Đ¸Ñ‚Đ¸","styles":"Đ¡Ñ‚Đ¸Đ»Ñ–","colors":"ĐĐ¾Đ»ÑŒĐ¾Ñ€Đ¸","tools":"Đ†Đ½ÑÑ‚Ñ€ÑƒĐ¼ĐµĐ½Ñ‚Đ¸"},"toolbars":"ĐŸĐ°Đ½ĐµĐ»ÑŒ Ñ–Đ½ÑÑ‚Ñ€ÑƒĐ¼ĐµĐ½Ñ‚Ñ–Đ² Ñ€ĐµĐ´Đ°ĐºÑ‚Đ¾Ñ€Đ°"},"elementspath":{"eleLabel":"ШлÑÑ…","eleTitle":"%1 ĐµĐ»ĐµĐ¼ĐµĐ½Ñ‚"},"format":{"label":"Đ¤Đ¾Ñ€Đ¼Đ°Ñ‚ÑƒĐ²Đ°Đ½Đ½Ñ","panelTitle":"Đ¤Đ¾Ñ€Đ¼Đ°Ñ‚ÑƒĐ²Đ°Đ½Đ½Ñ Đ¿Đ°Ñ€Đ°Đ³Ñ€Đ°Ñ„Đ°","tag_address":"ĐĐ´Ñ€ĐµÑĐ°","tag_div":"ĐĐ¾Ñ€Đ¼Đ°Đ»ÑŒĐ½Đ¸Đ¹ (div)","tag_h1":"Đ—Đ°Đ³Đ¾Đ»Đ¾Đ²Đ¾Đº 1","tag_h2":"Đ—Đ°Đ³Đ¾Đ»Đ¾Đ²Đ¾Đº 2","tag_h3":"Đ—Đ°Đ³Đ¾Đ»Đ¾Đ²Đ¾Đº 3","tag_h4":"Đ—Đ°Đ³Đ¾Đ»Đ¾Đ²Đ¾Đº 4","tag_h5":"Đ—Đ°Đ³Đ¾Đ»Đ¾Đ²Đ¾Đº 5","tag_h6":"Đ—Đ°Đ³Đ¾Đ»Đ¾Đ²Đ¾Đº 6","tag_p":"ĐĐ¾Ñ€Đ¼Đ°Đ»ÑŒĐ½Đ¸Đ¹","tag_pre":"Đ¤Đ¾Ñ€Đ¼Đ°Ñ‚Đ¾Đ²Đ°Đ½Đ¸Đ¹"},"horizontalrule":{"toolbar":"Đ“Đ¾Ñ€Đ¸Đ·Đ¾Đ½Ñ‚Đ°Đ»ÑŒĐ½Đ° Đ»Ñ–Đ½Ñ–Ñ"},"image":{"alertUrl":"Đ‘ÑƒĐ´ÑŒ лаÑĐºĐ°, Đ²ĐºĐ°Đ¶Ñ–Ñ‚ÑŒ URL Đ·Đ¾Đ±Ñ€Đ°Đ¶ĐµĐ½Đ½Ñ","alt":"ĐĐ»ÑŒÑ‚ĐµÑ€Đ½Đ°Ñ‚Đ¸Đ²Đ½Đ¸Đ¹ Ñ‚ĐµĐºÑÑ‚","border":"Đ Đ°Đ¼ĐºĐ°","btnUpload":"ĐĐ°Đ´Ñ–ÑĐ»Đ°Ñ‚Đ¸ Đ½Đ° ÑĐµÑ€Đ²ĐµÑ€","button2Img":"Đ‘Đ°Đ¶Đ°Ñ”Ñ‚Đµ Đ¿ĐµÑ€ĐµÑ‚Đ²Đ¾Ñ€Đ¸Ñ‚Đ¸ Đ¾Đ±Ñ€Đ°Đ½Ñƒ ĐºĐ½Đ¾Đ¿ĐºÑƒ-Đ·Đ¾Đ±Ñ€Đ°Đ¶ĐµĐ½Đ½Ñ Đ½Đ° Đ¿Ñ€Đ¾ÑÑ‚Đµ Đ·Đ¾Đ±Ñ€Đ°Đ¶ĐµĐ½Đ½Ñ?","hSpace":"Đ“Đ¾Ñ€Đ¸Đ·. Đ²Ñ–Đ´ÑÑ‚ÑƒĐ¿","img2Button":"Đ‘Đ°Đ¶Đ°Ñ”Ñ‚Đµ Đ¿ĐµÑ€ĐµÑ‚Đ²Đ¾Ñ€Đ¸Ñ‚Đ¸ Đ¾Đ±Ñ€Đ°Đ½Đµ Đ·Đ¾Đ±Ñ€Đ°Đ¶ĐµĐ½Đ½Ñ Đ½Đ° ĐºĐ½Đ¾Đ¿ĐºÑƒ-Đ·Đ¾Đ±Ñ€Đ°Đ¶ĐµĐ½Đ½Ñ?","infoTab":"Đ†Đ½Ñ„Đ¾Ñ€Đ¼Đ°Ñ†Ñ–Ñ Đ¿Ñ€Đ¾ Đ·Đ¾Đ±Ñ€Đ°Đ¶ĐµĐ½Đ½Ñ","linkTab":"ĐŸĐ¾ÑĐ¸Đ»Đ°Đ½Đ½Ñ","lockRatio":"Đ—Đ±ĐµÑ€ĐµĐ³Ñ‚Đ¸ Đ¿Ñ€Đ¾Đ¿Đ¾Ñ€Ñ†Ñ–Ñ—","menu":"ВлаÑÑ‚Đ¸Đ²Đ¾ÑÑ‚Ñ– Đ·Đ¾Đ±Ñ€Đ°Đ¶ĐµĐ½Đ½Ñ","resetSize":"ĐÑ‡Đ¸ÑÑ‚Đ¸Ñ‚Đ¸ Đ¿Đ¾Đ»Ñ Ñ€Đ¾Đ·Đ¼Ñ–Ñ€Ñ–Đ²","title":"ВлаÑÑ‚Đ¸Đ²Đ¾ÑÑ‚Ñ– Đ·Đ¾Đ±Ñ€Đ°Đ¶ĐµĐ½Đ½Ñ","titleButton":"ВлаÑÑ‚Đ¸Đ²Đ¾ÑÑ‚Ñ– ĐºĐ½Đ¾Đ¿ĐºĐ¸ Ñ–Đ· Đ·Đ¾Đ±Ñ€Đ°Đ¶ĐµĐ½Đ½ÑĐ¼","upload":"ĐĐ°Đ´Ñ–ÑĐ»Đ°Ñ‚Đ¸","urlMissing":"Đ’ĐºĐ°Đ¶Ñ–Ñ‚ÑŒ URL Đ·Đ¾Đ±Ñ€Đ°Đ¶ĐµĐ½Đ½Ñ.","vSpace":"Đ’ĐµÑ€Ñ‚. Đ²Ñ–Đ´ÑÑ‚ÑƒĐ¿","validateBorder":"Đ¨Đ¸Ñ€Đ¸Đ½Đ° Ñ€Đ°Đ¼ĐºĐ¸ Đ¿Đ¾Đ²Đ¸Đ½Đ½Đ° Đ±ÑƒÑ‚Đ¸ Ñ†Ñ–Đ»Đ¸Đ¼ Ñ‡Đ¸ÑĐ»Đ¾Đ¼.","validateHSpace":"Đ“Đ¾Ñ€Đ¸Đ·. Đ²Ñ–Đ´ÑÑ‚ÑƒĐ¿ Đ¿Đ¾Đ²Đ¸Đ½ĐµĐ½ Đ±ÑƒÑ‚Đ¸ Ñ†Ñ–Đ»Đ¸Đ¼ Ñ‡Đ¸ÑĐ»Đ¾Đ¼.","validateVSpace":"Đ’ĐµÑ€Ñ‚. Đ²Ñ–Đ´ÑÑ‚ÑƒĐ¿ Đ¿Đ¾Đ²Đ¸Đ½ĐµĐ½ Đ±ÑƒÑ‚Đ¸ Ñ†Ñ–Đ»Đ¸Đ¼ Ñ‡Đ¸ÑĐ»Đ¾Đ¼."},"indent":{"indent":"Đ—Đ±Ñ–Đ»ÑŒÑˆĐ¸Ñ‚Đ¸ Đ²Ñ–Đ´ÑÑ‚ÑƒĐ¿","outdent":"Đ—Đ¼ĐµĐ½ÑˆĐ¸Ñ‚Đ¸ Đ²Ñ–Đ´ÑÑ‚ÑƒĐ¿"},"fakeobjects":{"anchor":"Đ¯ĐºÑ–Ñ€","flash":"Flash-Đ°Đ½Ñ–Đ¼Đ°Ñ†Ñ–Ñ","hiddenfield":"ĐŸÑ€Đ¸Ñ…Đ¾Đ²Đ°Đ½Ñ– ĐŸĐ¾Đ»Ñ","iframe":"IFrame","unknown":"ĐĐµĐ²Ñ–Đ´Đ¾Đ¼Đ¸Đ¹ Đ¾Đ±'Ñ”ĐºÑ‚"},"link":{"acccessKey":"Đ“Đ°Ñ€ÑÑ‡Đ° ĐºĐ»Đ°Đ²Ñ–ÑˆĐ°","advanced":"Đ”Đ¾Đ´Đ°Ñ‚ĐºĐ¾Đ²Đµ","advisoryContentType":"Đ¢Đ¸Đ¿ Đ²Đ¼Ñ–Ñту","advisoryTitle":"Đ—Đ°Đ³Đ¾Đ»Đ¾Đ²Đ¾Đº","anchor":{"toolbar":"Đ’ÑÑ‚Đ°Đ²Đ¸Ñ‚Đ¸/Đ ĐµĐ´Đ°Đ³ÑƒĐ²Đ°Ñ‚Đ¸ ÑĐºÑ–Ñ€","menu":"ВлаÑÑ‚Đ¸Đ²Đ¾ÑÑ‚Ñ– ÑĐºĐ¾Ñ€Ñ","title":"ВлаÑÑ‚Đ¸Đ²Đ¾ÑÑ‚Ñ– ÑĐºĐ¾Ñ€Ñ","name":"Đ†Đ¼'Ñ ÑĐºĐ¾Ñ€Ñ","errorName":"Đ‘ÑƒĐ´ÑŒ лаÑĐºĐ°, Đ²ĐºĐ°Đ¶Ñ–Ñ‚ÑŒ Ñ–Đ¼'Ñ ÑĐºĐ¾Ñ€Ñ","remove":"ĐŸÑ€Đ¸Đ±Ñ€Đ°Ñ‚Đ¸ ÑĐºÑ–Ñ€"},"anchorId":"Đ—Đ° Ñ–Đ´ĐµĐ½Ñ‚Đ¸Ñ„Ñ–ĐºĐ°Ñ‚Đ¾Ñ€Đ¾Đ¼ ĐµĐ»ĐµĐ¼ĐµĐ½Ñ‚Ñƒ","anchorName":"Đ—Đ° Ñ–Đ¼'ÑĐ¼ ĐµĐ»ĐµĐ¼ĐµĐ½Ñ‚Ñƒ","charset":"ĐĐ¾Đ´ÑƒĐ²Đ°Đ½Đ½Ñ","cssClasses":"ĐĐ»Đ°Ñ CSS","emailAddress":"ĐĐ´Ñ€ĐµÑĐ° ел. Đ¿Đ¾ÑˆÑ‚Đ¸","emailBody":"Đ¢Ñ–Đ»Đ¾ Đ¿Đ¾Đ²Ñ–Đ´Đ¾Đ¼Đ»ĐµĐ½Đ½Ñ","emailSubject":"Đ¢ĐµĐ¼Đ° лиÑÑ‚Đ°","id":"Đ†Đ´ĐµĐ½Ñ‚Đ¸Ñ„Ñ–ĐºĐ°Ñ‚Đ¾Ñ€","info":"Đ†Đ½Ñ„Đ¾Ñ€Đ¼Đ°Ñ†Ñ–Ñ Đ¿Đ¾ÑĐ¸Đ»Đ°Đ½Đ½Ñ","langCode":"ĐĐ¾Đ´ Đ¼Đ¾Đ²Đ¸","langDir":"ĐĐ°Đ¿Ñ€ÑĐ¼Đ¾Đº Đ¼Đ¾Đ²Đ¸","langDirLTR":"Đ—Đ»Ñ–Đ²Đ° Đ½Đ°Đ¿Ñ€Đ°Đ²Đ¾ (LTR)","langDirRTL":"Đ¡Đ¿Ñ€Đ°Đ²Đ° Đ½Đ°Đ»Ñ–Đ²Đ¾ (RTL)","menu":"Đ’ÑÑ‚Đ°Đ²Đ¸Ñ‚Đ¸ Đ¿Đ¾ÑĐ¸Đ»Đ°Đ½Đ½Ñ","name":"Đ†Đ¼'Ñ","noAnchors":"(Đ’ Ñ†ÑŒĐ¾Đ¼Ñƒ Đ´Đ¾ĐºÑƒĐ¼ĐµĐ½Ñ‚Ñ– Đ½ĐµĐ¼Đ°Ñ” ÑĐºĐ¾Ñ€Ñ–Đ²)","noEmail":"Đ‘ÑƒĐ´ÑŒ лаÑĐºĐ°, Đ²ĐºĐ°Đ¶Ñ–Ñ‚ÑŒ Đ°Đ´Ñ€ĐµÑ ĐµĐ». Đ¿Đ¾ÑˆÑ‚Đ¸","noUrl":"Đ‘ÑƒĐ´ÑŒ лаÑĐºĐ°, Đ²ĐºĐ°Đ¶Ñ–Ñ‚ÑŒ URL Đ¿Đ¾ÑĐ¸Đ»Đ°Đ½Đ½Ñ","other":"<Ñ–Đ½ÑˆĐ¸Đ¹>","popupDependent":"Đ—Đ°Đ»ĐµĐ¶Đ½Đ¸Đ¹ (Netscape)","popupFeatures":"ВлаÑÑ‚Đ¸Đ²Đ¾ÑÑ‚Ñ– Đ²Đ¸Đ¿Đ»Đ¸Đ²Đ°ÑÑ‡Đ¾Đ³Đ¾ Đ²Ñ–ĐºĐ½Đ°","popupFullScreen":"ĐŸĐ¾Đ²Đ½Đ¸Đ¹ ĐµĐºÑ€Đ°Đ½ (IE)","popupLeft":"ĐŸĐ¾Đ·Đ¸Ñ†Ñ–Ñ Đ·Đ»Ñ–Đ²Đ°","popupLocationBar":"ĐŸĐ°Đ½ĐµĐ»ÑŒ Đ»Đ¾ĐºĐ°Ñ†Ñ–Ñ—","popupMenuBar":"ĐŸĐ°Đ½ĐµĐ»ÑŒ Đ¼ĐµĐ½Ñ","popupResizable":"ĐœĐ°ÑÑˆÑ‚Đ°Đ±Đ¾Đ²Đ°Đ½Đµ","popupScrollBars":"Đ¡Ñ‚Ñ€Ñ–Ñ‡ĐºĐ¸ Đ¿Ñ€Đ¾ĐºÑ€ÑƒÑ‚ĐºĐ¸","popupStatusBar":"Đ ÑĐ´Đ¾Đº ÑÑ‚Đ°Ñ‚ÑƒÑу","popupToolbar":"ĐŸĐ°Đ½ĐµĐ»ÑŒ Ñ–Đ½ÑÑ‚Ñ€ÑƒĐ¼ĐµĐ½Ñ‚Ñ–Đ²","popupTop":"ĐŸĐ¾Đ·Đ¸Ñ†Ñ–Ñ Đ·Đ²ĐµÑ€Ñ…Ñƒ","rel":"Đ—Đ²'ÑĐ·Đ¾Đº","selectAnchor":"ĐĐ±ĐµÑ€Ñ–Ñ‚ÑŒ ÑĐºÑ–Ñ€","styles":"Đ¡Ñ‚Đ¸Đ»ÑŒ CSS","tabIndex":"ĐŸĐ¾ÑĐ»Ñ–Đ´Đ¾Đ²Đ½Ñ–ÑÑ‚ÑŒ Đ¿ĐµÑ€ĐµÑ…Đ¾Đ´Ñƒ","target":"Đ¦Ñ–Đ»ÑŒ","targetFrame":"<Ñ„Ñ€ĐµĐ¹Đ¼>","targetFrameName":"Đ†Đ¼'Ñ Ñ†Ñ–Đ»ÑŒĐ¾Đ²Đ¾Đ³Đ¾ Ñ„Ñ€ĐµĐ¹Đ¼Ñƒ","targetPopup":"<Đ²Đ¸Đ¿Đ»Đ¸Đ²Đ°ÑÑ‡Đµ Đ²Ñ–ĐºĐ½Đ¾>","targetPopupName":"Đ†Đ¼'Ñ Đ²Đ¸Đ¿Đ»Đ¸Đ²Đ°ÑÑ‡Đ¾Đ³Đ¾ Đ²Ñ–ĐºĐ½Đ°","title":"ĐŸĐ¾ÑĐ¸Đ»Đ°Đ½Đ½Ñ","toAnchor":"Đ¯ĐºÑ–Ñ€ Đ½Đ° Ñ†Ñ ÑÑ‚Đ¾Ñ€Ñ–Đ½ĐºÑƒ","toEmail":"Đ•Đ». Đ¿Đ¾ÑˆÑ‚Đ°","toUrl":"URL","toolbar":"Đ’ÑÑ‚Đ°Đ²Đ¸Ñ‚Đ¸/Đ ĐµĐ´Đ°Đ³ÑƒĐ²Đ°Ñ‚Đ¸ Đ¿Đ¾ÑĐ¸Đ»Đ°Đ½Đ½Ñ","type":"Đ¢Đ¸Đ¿ Đ¿Đ¾ÑĐ¸Đ»Đ°Đ½Đ½Ñ","unlink":"Đ’Đ¸Đ´Đ°Đ»Đ¸Ñ‚Đ¸ Đ¿Đ¾ÑĐ¸Đ»Đ°Đ½Đ½Ñ","upload":"ĐĐ°Đ´Ñ–ÑĐ»Đ°Ñ‚Đ¸"},"list":{"bulletedlist":"ĐœĐ°Ñ€ĐºÑ–Ñ€Đ¾Đ²Đ°Đ½Đ¸Đ¹ ÑĐ¿Đ¸ÑĐ¾Đº","numberedlist":"ĐÑƒĐ¼ĐµÑ€Đ¾Đ²Đ°Đ½Đ¸Đ¹ ÑĐ¿Đ¸ÑĐ¾Đº"},"magicline":{"title":"Đ’ÑÑ‚Đ°Đ²Đ¸Ñ‚Đ¸ Đ°Đ±Đ·Đ°Ñ†"},"maximize":{"maximize":"ĐœĐ°ĐºÑĐ¸Đ¼Ñ–Đ·ÑƒĐ²Đ°Ñ‚Đ¸","minimize":"ĐœÑ–Đ½Ñ–Đ¼Ñ–Đ·ÑƒĐ²Đ°Ñ‚Đ¸"},"pastetext":{"button":"Đ’ÑÑ‚Đ°Đ²Đ¸Ñ‚Đ¸ Ñ‚Ñ–Đ»ÑŒĐºĐ¸ Ñ‚ĐµĐºÑÑ‚","title":"Đ’ÑÑ‚Đ°Đ²Đ¸Ñ‚Đ¸ Ñ‚Ñ–Đ»ÑŒĐºĐ¸ Ñ‚ĐµĐºÑÑ‚"},"pastefromword":{"confirmCleanup":"Đ¢ĐµĐºÑÑ‚, Ñ‰Đ¾ Ви Đ½Đ°Đ¼Đ°Đ³Đ°Ñ”Ñ‚ĐµÑÑŒ Đ²ÑÑ‚Đ°Đ²Đ¸Ñ‚Đ¸, ÑÑ…Đ¾Đ¶Đ¸Đ¹ Đ½Đ° ÑĐºĐ¾Đ¿Ñ–Đ¹Đ¾Đ²Đ°Đ½Đ¸Đ¹ Đ· Word. Đ‘Đ°Đ¶Đ°Ñ”Ñ‚Đµ Đ¾Ñ‡Đ¸ÑÑ‚Đ¸Ñ‚Đ¸ Đ¹Đ¾Đ³Đ¾ Ñ„Đ¾Ñ€Đ¼Đ°Ñ‚ÑƒĐ²Đ°Đ½Đ½Ñ Đ¿ĐµÑ€ĐµĐ´ Đ²ÑÑ‚Đ°Đ²Đ»ÑĐ½Đ½ÑĐ¼?","error":"ĐĐµĐ¼Đ¾Đ¶Đ»Đ¸Đ²Đ¾ Đ¾Ñ‡Đ¸ÑÑ‚Đ¸Ñ‚Đ¸ Ñ„Đ¾Ñ€Đ¼Đ°Ñ‚ÑƒĐ²Đ°Đ½Đ½Ñ Ñ‡ĐµÑ€ĐµĐ· Đ²Đ½ÑƒÑ‚Ñ€Ñ–ÑˆĐ½Ñ Đ¿Đ¾Đ¼Đ¸Đ»ĐºÑƒ.","title":"Đ’ÑÑ‚Đ°Đ²Đ¸Ñ‚Đ¸ Đ· Word","toolbar":"Đ’ÑÑ‚Đ°Đ²Đ¸Ñ‚Đ¸ Đ· Word"},"removeformat":{"toolbar":"ĐÑ‡Đ¸ÑÑ‚Đ¸Ñ‚Đ¸ Ñ„Đ¾Ñ€Đ¼Đ°Ñ‚ÑƒĐ²Đ°Đ½Đ½Ñ"},"sourcearea":{"toolbar":"Đ”Đ¶ĐµÑ€ĐµĐ»Đ¾"},"specialchar":{"options":"ĐĐ¿Ñ†Ñ–Ñ—","title":"ĐĐ±ĐµÑ€Ñ–Ñ‚ÑŒ ÑĐ¿ĐµÑ†Ñ–Đ°Đ»ÑŒĐ½Đ¸Đ¹ ÑĐ¸Đ¼Đ²Đ¾Đ»","toolbar":"Đ¡Đ¿ĐµÑ†Ñ–Đ°Đ»ÑŒĐ½Đ¸Đ¹ ÑĐ¸Đ¼Đ²Đ¾Đ»"},"scayt":{"btn_about":"ĐŸÑ€Đ¾ SCAYT","btn_dictionaries":"Đ¡Đ»Đ¾Đ²Đ½Đ¸ĐºĐ¸","btn_disable":"Đ’Đ¸Đ¼ĐºĐ½ÑƒÑ‚Đ¸ SCAYT","btn_enable":"Đ’Đ²Ñ–Đ¼ĐºĐ½ÑƒÑ‚Đ¸ SCAYT","btn_langs":"ĐœĐ¾Đ²Đ¸","btn_options":"ĐĐ¿Ñ†Ñ–Ñ—","text_title":"ĐŸĐµÑ€ĐµÑ„Ñ–Ñ€ĐºĐ° Đ¾Ñ€Ñ„Đ¾Đ³Ñ€Đ°Ñ„Ñ–Ñ— Đ¿Đ¾ Đ¼Ñ–Ñ€Ñ– Đ½Đ°Đ±Đ¾Ñ€Ñƒ"},"stylescombo":{"label":"Đ¡Ñ‚Đ¸Đ»ÑŒ","panelTitle":"Đ¡Ñ‚Đ¸Đ»Ñ– Ñ„Đ¾Ñ€Đ¼Đ°Ñ‚ÑƒĐ²Đ°Đ½Đ½Ñ","panelTitle1":"Đ‘Đ»Đ¾Ñ‡Đ½Ñ– ÑÑ‚Đ¸Đ»Ñ–","panelTitle2":"Đ ÑĐ´ĐºĐ¾Đ²Ñ– ÑÑ‚Đ¸Đ»Ñ–","panelTitle3":"Đб'Ñ”ĐºÑ‚Đ½Ñ– ÑÑ‚Đ¸Đ»Ñ–"},"table":{"border":"Đ Đ¾Đ·Đ¼Ñ–Ñ€ Ñ€Đ°Đ¼ĐºĐ¸","caption":"Đ—Đ°Đ³Đ¾Đ»Đ¾Đ²Đ¾Đº Ñ‚Đ°Đ±Đ»Đ¸Ñ†Ñ–","cell":{"menu":"ĐĐ¾Đ¼Ñ–Ñ€ĐºĐ¸","insertBefore":"Đ’ÑÑ‚Đ°Đ²Đ¸Ñ‚Đ¸ ĐºĐ¾Đ¼Ñ–Ñ€ĐºÑƒ Đ¿ĐµÑ€ĐµĐ´","insertAfter":"Đ’ÑÑ‚Đ°Đ²Đ¸Ñ‚Đ¸ ĐºĐ¾Đ¼Ñ–Ñ€ĐºÑƒ Đ¿Ñ–ÑĐ»Ñ","deleteCell":"Đ’Đ¸Đ´Đ°Đ»Đ¸Ñ‚Đ¸ ĐºĐ¾Đ¼Ñ–Ñ€ĐºĐ¸","merge":"Đб'Ñ”Đ´Đ½Đ°Ñ‚Đ¸ ĐºĐ¾Đ¼Ñ–Ñ€ĐºĐ¸","mergeRight":"Đб'Ñ”Đ´Đ½Đ°Ñ‚Đ¸ ÑĐ¿Ñ€Đ°Đ²Đ°","mergeDown":"Đб'Ñ”Đ´Đ½Đ°Ñ‚Đ¸ Đ´Đ¾Đ½Đ¸Đ·Ñƒ","splitHorizontal":"Đ Đ¾Đ·Đ´Ñ–Đ»Đ¸Ñ‚Đ¸ ĐºĐ¾Đ¼Ñ–Ñ€ĐºÑƒ Đ¿Đ¾ Đ³Đ¾Ñ€Đ¸Đ·Đ¾Đ½Ñ‚Đ°Đ»Ñ–","splitVertical":"Đ Đ¾Đ·Đ´Ñ–Đ»Đ¸Ñ‚Đ¸ ĐºĐ¾Đ¼Ñ–Ñ€ĐºÑƒ Đ¿Đ¾ Đ²ĐµÑ€Ñ‚Đ¸ĐºĐ°Đ»Ñ–","title":"ВлаÑÑ‚Đ¸Đ²Đ¾ÑÑ‚Ñ– ĐºĐ¾Đ¼Ñ–Ñ€ĐºĐ¸","cellType":"Đ¢Đ¸Đ¿ ĐºĐ¾Đ¼Ñ–Ñ€ĐºĐ¸","rowSpan":"Đб'Ñ”Đ´Đ½Đ°Đ½Đ½Ñ Ñ€ÑĐ´ĐºÑ–Đ²","colSpan":"Đб'Ñ”Đ´Đ½Đ°Đ½Đ½Ñ ÑÑ‚Đ¾Đ²Đ¿Ñ†Ñ–Đ²","wordWrap":"ĐĐ²Ñ‚Đ¾Đ¿ĐµÑ€ĐµĐ½ĐµÑĐµĐ½Đ½Ñ Ñ‚ĐµĐºÑту","hAlign":"Đ“Đ¾Ñ€Đ¸Đ·. Đ²Đ¸Ñ€Ñ–Đ²Đ½ÑĐ²Đ°Đ½Đ½Ñ","vAlign":"Đ’ĐµÑ€Ñ‚. Đ²Đ¸Ñ€Ñ–Đ²Đ½ÑĐ²Đ°Đ½Đ½Ñ","alignBaseline":"ĐŸĐ¾ Đ±Đ°Đ·Đ¾Đ²Ñ–Đ¹ Đ»Ñ–Đ½Ñ–Ñ—","bgColor":"ĐĐ¾Đ»Ñ–Ñ€ Ñ„Đ¾Đ½Ñƒ","borderColor":"ĐĐ¾Đ»Ñ–Ñ€ Ñ€Đ°Đ¼ĐºĐ¸","data":"Đ”Đ°Đ½Ñ–","header":"Đ—Đ°Đ³Đ¾Đ»Đ¾Đ²Đ¾Đº","yes":"Đ¢Đ°Đº","no":"ĐÑ–","invalidWidth":"Đ¨Đ¸Ñ€Đ¸Đ½Đ° ĐºĐ¾Đ¼Ñ–Ñ€ĐºĐ¸ Đ¿Đ¾Đ²Đ¸Đ½Đ½Đ° Đ±ÑƒÑ‚Đ¸ Ñ†Ñ–Đ»Đ¸Đ¼ Ñ‡Đ¸ÑĐ»Đ¾Đ¼.","invalidHeight":"ВиÑĐ¾Ñ‚Đ° ĐºĐ¾Đ¼Ñ–Ñ€ĐºĐ¸ Đ¿Đ¾Đ²Đ¸Đ½Đ½Đ° Đ±ÑƒÑ‚Đ¸ Ñ†Ñ–Đ»Đ¸Đ¼ Ñ‡Đ¸ÑĐ»Đ¾Đ¼.","invalidRowSpan":"ĐÑ–Đ»ÑŒĐºÑ–ÑÑ‚ÑŒ Đ¾Đ±'Ñ”Đ´Đ½ÑƒĐ²Đ°Đ½Đ¸Ñ… Ñ€ÑĐ´ĐºÑ–Đ² Đ¿Đ¾Đ²Đ¸Đ½Đ½Đ° Đ±ÑƒÑ‚Đ¸ Ñ†Ñ–Đ»Đ¸Đ¼ Ñ‡Đ¸ÑĐ»Đ¾Đ¼.","invalidColSpan":"ĐÑ–Đ»ÑŒĐºÑ–ÑÑ‚ÑŒ Đ¾Đ±'Ñ”Đ´Đ½ÑƒĐ²Đ°Đ½Đ¸Ñ… ÑÑ‚Đ¾Đ²Đ±Ñ†Ñ–Đ² Đ¿Đ¾Đ²Đ¸Đ½Đ½Đ° Đ±ÑƒÑ‚Đ¸ Ñ†Ñ–Đ»Đ¸Đ¼ Ñ‡Đ¸ÑĐ»Đ¾Đ¼.","chooseColor":"ĐĐ±Ñ€Đ°Ñ‚Đ¸"},"cellPad":"Đ’Đ½ÑƒÑ‚Ñ€. Đ²Ñ–Đ´ÑÑ‚ÑƒĐ¿","cellSpace":"ĐŸÑ€Đ¾Đ¼Ñ–Đ¶Đ¾Đº","column":{"menu":"Đ¡Ñ‚Đ¾Đ²Đ±Ñ†Ñ–","insertBefore":"Đ’ÑÑ‚Đ°Đ²Đ¸Ñ‚Đ¸ ÑÑ‚Đ¾Đ²Đ±ĐµÑ†ÑŒ Đ¿ĐµÑ€ĐµĐ´","insertAfter":"Đ’ÑÑ‚Đ°Đ²Đ¸Ñ‚Đ¸ ÑÑ‚Đ¾Đ²Đ±ĐµÑ†ÑŒ Đ¿Ñ–ÑĐ»Ñ","deleteColumn":"Đ’Đ¸Đ´Đ°Đ»Đ¸Ñ‚Đ¸ ÑÑ‚Đ¾Đ²Đ±Ñ†Ñ–"},"columns":"Đ¡Ñ‚Đ¾Đ²Đ±Ñ†Ñ–","deleteTable":"Đ’Đ¸Đ´Đ°Đ»Đ¸Ñ‚Đ¸ Ñ‚Đ°Đ±Đ»Đ¸Ñ†Ñ","headers":"Đ—Đ°Đ³Đ¾Đ»Đ¾Đ²ĐºĐ¸ ÑÑ‚Đ¾Đ²Đ±Ñ†Ñ–Đ²/Ñ€ÑĐ´ĐºÑ–Đ²","headersBoth":"Đ¡Ñ‚Đ¾Đ²Đ±Ñ†Ñ– Ñ– Ñ€ÑĐ´ĐºĐ¸","headersColumn":"Đ¡Ñ‚Đ¾Đ²Đ±Ñ†Ñ–","headersNone":"Без Đ·Đ°Đ³Đ¾Đ»Đ¾Đ²ĐºÑ–Đ²","headersRow":"Đ ÑĐ´ĐºĐ¸","invalidBorder":"Đ Đ¾Đ·Đ¼Ñ–Ñ€ Ñ€Đ°Đ¼ĐºĐ¸ Đ¿Đ¾Đ²Đ¸Đ½ĐµĐ½ Đ±ÑƒÑ‚Đ¸ Ñ†Ñ–Đ»Đ¸Đ¼ Ñ‡Đ¸ÑĐ»Đ¾Đ¼.","invalidCellPadding":"Đ’Đ½ÑƒÑ‚Ñ€. Đ²Ñ–Đ´ÑÑ‚ÑƒĐ¿ ĐºĐ¾Đ¼Ñ–Ñ€ĐºĐ¸ Đ¿Đ¾Đ²Đ¸Đ½ĐµĐ½ Đ±ÑƒÑ‚Đ¸ Ñ†Ñ–Đ»Đ¸Đ¼ Ñ‡Đ¸ÑĐ»Đ¾Đ¼.","invalidCellSpacing":"ĐŸÑ€Đ¾Đ¼Ñ–Đ¶Đ¾Đº Đ¼Ñ–Đ¶ ĐºĐ¾Đ¼Ñ–Ñ€ĐºĐ°Đ¼Đ¸ Đ¿Đ¾Đ²Đ¸Đ½ĐµĐ½ Đ±ÑƒÑ‚Đ¸ Ñ†Ñ–Đ»Đ¸Đ¼ Ñ‡Đ¸ÑĐ»Đ¾Đ¼.","invalidCols":"ĐÑ–Đ»ÑŒĐºÑ–ÑÑ‚ÑŒ ÑÑ‚Đ¾Đ²Đ±Ñ†Ñ–Đ² Đ¿Đ¾Đ²Đ¸Đ½Đ½Đ° Đ±ÑƒÑ‚Đ¸ Đ±Ñ–Đ»ÑŒÑˆĐ¾Ñ 0.","invalidHeight":"ВиÑĐ¾Ñ‚Đ° Ñ‚Đ°Đ±Đ»Đ¸Ñ†Ñ– Đ¿Đ¾Đ²Đ¸Đ½Đ½Đ° Đ±ÑƒÑ‚Đ¸ Ñ†Ñ–Đ»Đ¸Đ¼ Ñ‡Đ¸ÑĐ»Đ¾Đ¼.","invalidRows":"ĐÑ–Đ»ÑŒĐºÑ–ÑÑ‚ÑŒ Ñ€ÑĐ´ĐºÑ–Đ² Đ¿Đ¾Đ²Đ¸Đ½Đ½Đ° Đ±ÑƒÑ‚Đ¸ Đ±Ñ–Đ»ÑŒÑˆĐ¾Ñ 0.","invalidWidth":"Đ¨Đ¸Ñ€Đ¸Đ½Đ° Ñ‚Đ°Đ±Đ»Đ¸Ñ†Ñ– Đ¿Đ¾Đ²Đ¸Đ½Đ½Đ° Đ±ÑƒÑ‚Đ¸ Ñ†Ñ–Đ»Đ¸Đ¼ Ñ‡Đ¸ÑĐ»Đ¾Đ¼.","menu":"ВлаÑÑ‚Đ¸Đ²Đ¾ÑÑ‚Ñ– Ñ‚Đ°Đ±Đ»Đ¸Ñ†Ñ–","row":{"menu":"Đ ÑĐ´ĐºĐ¸","insertBefore":"Đ’ÑÑ‚Đ°Đ²Đ¸Ñ‚Đ¸ Ñ€ÑĐ´Đ¾Đº Đ¿ĐµÑ€ĐµĐ´","insertAfter":"Đ’ÑÑ‚Đ°Đ²Đ¸Ñ‚Đ¸ Ñ€ÑĐ´Đ¾Đº Đ¿Ñ–ÑĐ»Ñ","deleteRow":"Đ’Đ¸Đ´Đ°Đ»Đ¸Ñ‚Đ¸ Ñ€ÑĐ´ĐºĐ¸"},"rows":"Đ ÑĐ´ĐºĐ¸","summary":"Đ”ĐµÑ‚Đ°Đ»ÑŒĐ½Đ¸Đ¹ Đ¾Đ¿Đ¸Ñ Đ·Đ°Đ³Đ¾Đ»Đ¾Đ²ĐºÑƒ Ñ‚Đ°Đ±Đ»Đ¸Ñ†Ñ–","title":"ВлаÑÑ‚Đ¸Đ²Đ¾ÑÑ‚Ñ– Ñ‚Đ°Đ±Đ»Đ¸Ñ†Ñ–","toolbar":"Đ¢Đ°Đ±Đ»Đ¸Ñ†Ñ","widthPc":"Đ²Ñ–Đ´ÑĐ¾Ñ‚ĐºÑ–Đ²","widthPx":"Đ¿Ñ–ĐºÑĐµĐ»Ñ–Đ²","widthUnit":"ĐĐ´Đ¸Đ½Đ¸Ñ†Ñ– Đ²Đ¸Đ¼Ñ–Ñ€."},"undo":{"redo":"ĐŸĐ¾Đ²Ñ‚Đ¾Ñ€Đ¸Ñ‚Đ¸","undo":"ĐŸĐ¾Đ²ĐµÑ€Đ½ÑƒÑ‚Đ¸"},"wsc":{"btnIgnore":"ĐŸÑ€Đ¾Đ¿ÑƒÑÑ‚Đ¸Ñ‚Đ¸","btnIgnoreAll":"ĐŸÑ€Đ¾Đ¿ÑƒÑÑ‚Đ¸Ñ‚Đ¸ Đ²Ñе","btnReplace":"Đ—Đ°Đ¼Ñ–Đ½Đ¸Ñ‚Đ¸","btnReplaceAll":"Đ—Đ°Đ¼Ñ–Đ½Đ¸Ñ‚Đ¸ Đ²Ñе","btnUndo":"ĐĐ°Đ·Đ°Đ´","changeTo":"Đ—Đ°Đ¼Ñ–Đ½Đ¸Ñ‚Đ¸ Đ½Đ°","errorLoading":"ĐŸĐ¾Đ¼Đ¸Đ»ĐºĐ° Đ·Đ°Đ²Đ°Đ½Ñ‚Đ°Đ¶ĐµĐ½Đ½Ñ : %s.","ieSpellDownload":"ĐœĐ¾Đ´ÑƒĐ»ÑŒ Đ¿ĐµÑ€ĐµĐ²Ñ–Ñ€ĐºĐ¸ Đ¾Ñ€Ñ„Đ¾Đ³Ñ€Đ°Ñ„Ñ–Ñ— Đ½Đµ Đ²ÑÑ‚Đ°Đ½Đ¾Đ²Đ»ĐµĐ½Đ¾. Đ‘Đ°Đ¶Đ°Ñ”Ñ‚Đµ Đ·Đ°Đ²Đ°Đ½Ñ‚Đ°Đ¶Đ¸Ñ‚Đ¸ Đ¹Đ¾Đ³Đ¾ Đ·Đ°Ñ€Đ°Đ·?","manyChanges":"ĐŸĐµÑ€ĐµĐ²Ñ–Ñ€ĐºÑƒ Đ¾Ñ€Ñ„Đ¾Đ³Ñ€Đ°Ñ„Ñ–Ñ— Đ·Đ°Đ²ĐµÑ€ÑˆĐµĐ½Đ¾: 1% ÑĐ»Ñ–Đ²(Đ¾Đ²Đ°) Đ·Đ¼Ñ–Đ½ĐµĐ½Đ¾","noChanges":"ĐŸĐµÑ€ĐµĐ²Ñ–Ñ€ĐºÑƒ Đ¾Ñ€Ñ„Đ¾Đ³Ñ€Đ°Ñ„Ñ–Ñ— Đ·Đ°Đ²ĐµÑ€ÑˆĐµĐ½Đ¾: Đ¶Đ¾Đ´Đ½Đµ ÑĐ»Đ¾Đ²Đ¾ Đ½Đµ Đ·Đ¼Ñ–Đ½ĐµĐ½Đ¾","noMispell":"ĐŸĐµÑ€ĐµĐ²Ñ–Ñ€ĐºÑƒ Đ¾Ñ€Ñ„Đ¾Đ³Ñ€Đ°Ñ„Ñ–Ñ— Đ·Đ°Đ²ĐµÑ€ÑˆĐµĐ½Đ¾: Đ¿Đ¾Đ¼Đ¸Đ»Đ¾Đº Đ½Đµ Đ·Đ½Đ°Đ¹Đ´ĐµĐ½Đ¾","noSuggestions":"- Đ½ĐµĐ¼Đ°Ñ” Đ²Đ°Ñ€Ñ–Đ°Đ½Ñ‚Ñ–Đ² -","notAvailable":"Đ’Đ¸Đ±Đ°Ñ‡Ñ‚Đµ, але ÑĐµÑ€Đ²Ñ–Ñ Đ½Đ°Ñ€Đ°Đ·Ñ– Đ½ĐµĐ´Đ¾ÑÑ‚ÑƒĐ¿Đ½Đ¸Đ¹.","notInDic":"ĐĐµĐ¼Đ°Ñ” Đ² ÑĐ»Đ¾Đ²Đ½Đ¸ĐºÑƒ","oneChange":"ĐŸĐµÑ€ĐµĐ²Ñ–Ñ€ĐºÑƒ Đ¾Ñ€Ñ„Đ¾Đ³Ñ€Đ°Ñ„Ñ–Ñ— Đ·Đ°Đ²ĐµÑ€ÑˆĐµĐ½Đ¾: Đ·Đ¼Ñ–Đ½ĐµĐ½Đ¾ Đ¾Đ´Đ½Đµ ÑĐ»Đ¾Đ²Đ¾","progress":"Đ’Đ¸ĐºĐ¾Đ½ÑƒÑ”Ñ‚ÑŒÑÑ Đ¿ĐµÑ€ĐµĐ²Ñ–Ñ€ĐºĐ° Đ¾Ñ€Ñ„Đ¾Đ³Ñ€Đ°Ñ„Ñ–Ñ—...","title":"ĐŸĐµÑ€ĐµĐ²Ñ–Ñ€ĐºĐ° Đ¾Ñ€Ñ„Đ¾Đ³Ñ€Đ°Ñ„Ñ–Ñ—","toolbar":"ĐŸĐµÑ€ĐµĐ²Ñ–Ñ€Đ¸Ñ‚Đ¸ Đ¾Ñ€Ñ„Đ¾Đ³Ñ€Đ°Ñ„Ñ–Ñ"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/vi.js b/js/ckeditor/lang/vi.js
new file mode 100644
index 0000000..5c73358
--- /dev/null
+++ b/js/ckeditor/lang/vi.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['vi']={"editor":"Bá»™ soạn thảo văn bản cĂ³ định dạng","editorPanel":"Bảng Ä‘iá»u khiển Rich Text Editor","common":{"editorHelp":"Nhấn ALT + 0 để được giĂºp đỡ","browseServer":"Duyệt mĂ¡y chủ","url":"URL","protocol":"Giao thức","upload":"Tải lĂªn","uploadSubmit":"Tải lĂªn mĂ¡y chủ","image":"Hình ảnh","flash":"Flash","form":"Biểu mẫu","checkbox":"NĂºt kiểm","radio":"NĂºt chá»n","textField":"TrÆ°á»ng văn bản","textarea":"VĂ¹ng văn bản","hiddenField":"TrÆ°á»ng ẩn","button":"NĂºt","select":"Ă” chá»n","imageButton":"NĂºt hình ảnh","notSet":"<khĂ´ng thiết lập>","id":"Äịnh danh","name":"TĂªn","langDir":"HÆ°á»›ng ngĂ´n ngữ","langDirLtr":"TrĂ¡i sang phải (LTR)","langDirRtl":"Phải sang trĂ¡i (RTL)","langCode":"MĂ£ ngĂ´n ngữ","longDescr":"MĂ´ tả URL","cssClass":"Lá»›p Stylesheet","advisoryTitle":"Nhan Ä‘á» hÆ°á»›ng dẫn","cssStyle":"Kiểu ","ok":"Äồng Ă½","cancel":"Bá» qua","close":"ÄĂ³ng","preview":"Xem trÆ°á»›c","resize":"KĂ©o rĂª để thay đổi kĂ­ch cỡ","generalTab":"Tab chung","advancedTab":"Tab mở rá»™ng","validateNumberFailed":"GiĂ¡ trị nĂ y khĂ´ng phải lĂ  số.","confirmNewPage":"Má»i thay đổi khĂ´ng được lÆ°u lại, ná»™i dung nĂ y sẽ bị mất. Bạn cĂ³ chắc chắn muốn tải má»™t trang má»›i?","confirmCancel":"Má»™t vĂ i tĂ¹y chá»n Ä‘Ă£ bị thay đổi. Bạn cĂ³ chắc chắn muốn Ä‘Ă³ng há»™p thoại?","options":"TĂ¹y chá»n","target":"ÄĂ­ch đến","targetNew":"Cá»­a sổ má»›i (_blank)","targetTop":"Cá»­a sổ trĂªn cĂ¹ng (_top)","targetSelf":"Tại trang (_self)","targetParent":"Cá»­a sổ cha (_parent)","langDirLTR":"TrĂ¡i sang phải (LTR)","langDirRTL":"Phải sang trĂ¡i (RTL)","styles":"Kiểu","cssClasses":"Lá»›p CSS","width":"Chiá»u rá»™ng","height":"Chiá»u cao","align":"Vị trĂ­","alignLeft":"TrĂ¡i","alignRight":"Phải","alignCenter":"Giữa","alignJustify":"Sắp chữ","alignTop":"TrĂªn","alignMiddle":"Giữa","alignBottom":"DÆ°á»›i","alignNone":"KhĂ´ng","invalidValue":"GiĂ¡ trị khĂ´ng hợp lệ.","invalidHeight":"Chiá»u cao phải lĂ  số nguyĂªn.","invalidWidth":"Chiá»u rá»™ng phải lĂ  số nguyĂªn.","invalidCssLength":"GiĂ¡ trị quy định cho trÆ°á»ng \"%1\" phải lĂ  má»™t số dÆ°Æ¡ng cĂ³ hoặc khĂ´ng cĂ³ má»™t Ä‘Æ¡n vị Ä‘o CSS hợp lệ (px, %, in, cm, mm, em, ex, pt, hoặc pc).","invalidHtmlLength":"GiĂ¡ trị quy định cho trÆ°á»ng \"%1\" phải lĂ  má»™t số dÆ°Æ¡ng cĂ³ hoặc khĂ´ng cĂ³ má»™t Ä‘Æ¡n vị Ä‘o HTML hợp lệ (px hoặc %).","invalidInlineStyle":"GiĂ¡ trị quy định cho kiểu ná»™i tuyến phải bao gồm má»™t hoặc nhiá»u dữ liệu vá»›i định dạng \"tĂªn:giĂ¡ trị\", cĂ¡ch nhau bằng dấu chấm phẩy.","cssLengthTooltip":"Nhập má»™t giĂ¡ trị theo pixel hoặc má»™t số vá»›i má»™t Ä‘Æ¡n vị CSS hợp lệ (px, %, in, cm, mm, em, ex, pt, hoặc pc).","unavailable":"%1<span class=\"cke_accessibility\">, khĂ´ng cĂ³</span>"},"about":{"copy":"Bản quyá»n &copy; $1. Giữ toĂ n quyá»n.","dlgTitle":"ThĂ´ng tin vá» CKEditor","help":"Kiểm tra $1 để được giĂºp đỡ.","moreInfo":"Vui lĂ²ng ghĂ© thăm trang web của chĂºng tĂ´i để cĂ³ thĂ´ng tin vá» giấy phĂ©p:","title":"ThĂ´ng tin vá» CKEditor","userGuide":"HÆ°á»›ng dẫn sá»­ dụng CKEditor"},"basicstyles":{"bold":"Äậm","italic":"NghiĂªng","strike":"Gạch xuyĂªn ngang","subscript":"Chỉ số dÆ°á»›i","superscript":"Chỉ số trĂªn","underline":"Gạch chĂ¢n"},"blockquote":{"toolbar":"Khối trĂ­ch dẫn"},"clipboard":{"copy":"Sao chĂ©p","copyError":"CĂ¡c thiết lập bảo mật của trình duyệt khĂ´ng cho phĂ©p trình biĂªn tập tá»± Ä‘á»™ng thá»±c thi lệnh sao chĂ©p. HĂ£y sá»­ dụng bĂ n phĂ­m cho lệnh nĂ y (Ctrl/Cmd+C).","cut":"Cắt","cutError":"CĂ¡c thiết lập bảo mật của trình duyệt khĂ´ng cho phĂ©p trình biĂªn tập tá»± Ä‘á»™ng thá»±c thi lệnh cắt. HĂ£y sá»­ dụng bĂ n phĂ­m cho lệnh nĂ y (Ctrl/Cmd+X).","paste":"DĂ¡n","pasteArea":"Khu vá»±c dĂ¡n","pasteMsg":"HĂ£y dĂ¡n ná»™i dung vĂ o trong khung bĂªn dÆ°á»›i, sá»­ dụng tổ hợp phĂ­m (<STRONG>Ctrl/Cmd+V</STRONG>) vĂ  nhấn vĂ o nĂºt <STRONG>Äồng Ă½</STRONG>.","securityMsg":"Do thiết lập bảo mật của trình duyệt nĂªn trình biĂªn tập khĂ´ng thể truy cập trá»±c tiếp vĂ o ná»™i dung Ä‘Ă£ sao chĂ©p. Bạn cần phải dĂ¡n lại ná»™i dung vĂ o cá»­a sổ nĂ y.","title":"DĂ¡n"},"contextmenu":{"options":"TĂ¹y chá»n menu bổ xung"},"button":{"selectedLabel":"%1 (ÄĂ£ chá»n)"},"toolbar":{"toolbarCollapse":"Thu gá»n thanh cĂ´ng cụ","toolbarExpand":"Mở rá»™ng thnah cĂ´ng cụ","toolbarGroups":{"document":"TĂ i liệu","clipboard":"Clipboard/Undo","editing":"Chỉnh sá»­a","forms":"Bảng biểu","basicstyles":"Kiểu cÆ¡ bản","paragraph":"Äoạn","links":"LiĂªn kết","insert":"Chèn","styles":"Kiểu","colors":"MĂ u sắc","tools":"CĂ´ng cụ"},"toolbars":"Thanh cĂ´ng cụ"},"elementspath":{"eleLabel":"NhĂ£n thĂ nh phần","eleTitle":"%1 thĂ nh phần"},"format":{"label":"Äịnh dạng","panelTitle":"Äịnh dạng","tag_address":"Address","tag_div":"Bình thÆ°á»ng (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":"Bình thÆ°á»ng (P)","tag_pre":"ÄĂ£ thiết lập"},"horizontalrule":{"toolbar":"Chèn Ä‘Æ°á»ng phĂ¢n cĂ¡ch ngang"},"image":{"alertUrl":"HĂ£y Ä‘Æ°a vĂ o Ä‘Æ°á»ng dẫn của ảnh","alt":"ChĂº thĂ­ch ảnh","border":"ÄÆ°á»ng viá»n","btnUpload":"Tải lĂªn mĂ¡y chủ","button2Img":"Bạn cĂ³ muốn chuyển nĂºt bấm bằng ảnh được chá»n thĂ nh ảnh?","hSpace":"Khoảng đệm ngang","img2Button":"Bạn cĂ³ muốn chuyển đổi ảnh được chá»n thĂ nh nĂºt bấm bằng ảnh?","infoTab":"ThĂ´ng tin của ảnh","linkTab":"Tab liĂªn kết","lockRatio":"Giữ nguyĂªn tá»· lệ","menu":"Thuá»™c tĂ­nh của ảnh","resetSize":"KĂ­ch thÆ°á»›c gốc","title":"Thuá»™c tĂ­nh của ảnh","titleButton":"Thuá»™c tĂ­nh nĂºt của ảnh","upload":"Tải lĂªn","urlMissing":"Thiếu Ä‘Æ°á»ng dẫn hình ảnh","vSpace":"Khoảng đệm dá»c","validateBorder":"Chiá»u rá»™ng của Ä‘Æ°á»ng viá»n phải lĂ  má»™t số nguyĂªn dÆ°Æ¡ng","validateHSpace":"Khoảng đệm ngang phải lĂ  má»™t số nguyĂªn dÆ°Æ¡ng","validateVSpace":"Khoảng đệm dá»c phải lĂ  má»™t số nguyĂªn dÆ°Æ¡ng"},"indent":{"indent":"Dịch vĂ o trong","outdent":"Dịch ra ngoĂ i"},"fakeobjects":{"anchor":"Äiểm neo","flash":"Flash","hiddenfield":"TrÆ°á»ng ẩn","iframe":"IFrame","unknown":"Äối tượng khĂ´ng rõ rĂ ng"},"link":{"acccessKey":"PhĂ­m há»— trợ truy cập","advanced":"Mở rá»™ng","advisoryContentType":"Ná»™i dung hÆ°á»›ng dẫn","advisoryTitle":"Nhan Ä‘á» hÆ°á»›ng dẫn","anchor":{"toolbar":"Chèn/Sá»­a Ä‘iểm neo","menu":"Thuá»™c tĂ­nh Ä‘iểm neo","title":"Thuá»™c tĂ­nh Ä‘iểm neo","name":"TĂªn của Ä‘iểm neo","errorName":"HĂ£y nhập vĂ o tĂªn của Ä‘iểm neo","remove":"XĂ³a neo"},"anchorId":"Theo định danh thĂ nh phần","anchorName":"Theo tĂªn Ä‘iểm neo","charset":"Bảng mĂ£ của tĂ i nguyĂªn được liĂªn kết đến","cssClasses":"Lá»›p Stylesheet","emailAddress":"ThÆ° Ä‘iện tá»­","emailBody":"Ná»™i dung thĂ´ng Ä‘iệp","emailSubject":"TiĂªu Ä‘á» thĂ´ng Ä‘iệp","id":"Äịnh danh","info":"ThĂ´ng tin liĂªn kết","langCode":"MĂ£ ngĂ´n ngữ","langDir":"HÆ°á»›ng ngĂ´n ngữ","langDirLTR":"TrĂ¡i sang phải (LTR)","langDirRTL":"Phải sang trĂ¡i (RTL)","menu":"Sá»­a liĂªn kết","name":"TĂªn","noAnchors":"(KhĂ´ng cĂ³ Ä‘iểm neo nĂ o trong tĂ i liệu)","noEmail":"HĂ£y Ä‘Æ°a vĂ o địa chỉ thÆ° Ä‘iện tá»­","noUrl":"HĂ£y Ä‘Æ°a vĂ o Ä‘Æ°á»ng dẫn liĂªn kết (URL)","other":"<khĂ¡c>","popupDependent":"Phụ thuá»™c (Netscape)","popupFeatures":"Äặc Ä‘iểm của cá»­a sổ Popup","popupFullScreen":"ToĂ n mĂ n hình (IE)","popupLeft":"Vị trĂ­ bĂªn trĂ¡i","popupLocationBar":"Thanh vị trĂ­","popupMenuBar":"Thanh Menu","popupResizable":"CĂ³ thể thay đổi kĂ­ch cỡ","popupScrollBars":"Thanh cuá»™n","popupStatusBar":"Thanh trạng thĂ¡i","popupToolbar":"Thanh cĂ´ng cụ","popupTop":"Vị trĂ­ phĂ­a trĂªn","rel":"Quan hệ","selectAnchor":"Chá»n má»™t Ä‘iểm neo","styles":"Kiểu (style)","tabIndex":"Chỉ số của Tab","target":"ÄĂ­ch","targetFrame":"<khung>","targetFrameName":"TĂªn khung Ä‘Ă­ch","targetPopup":"<cá»­a sổ popup>","targetPopupName":"TĂªn cá»­a sổ Popup","title":"LiĂªn kết","toAnchor":"Neo trong trang nĂ y","toEmail":"ThÆ° Ä‘iện tá»­","toUrl":"URL","toolbar":"Chèn/Sá»­a liĂªn kết","type":"Kiểu liĂªn kết","unlink":"XoĂ¡ liĂªn kết","upload":"Tải lĂªn"},"list":{"bulletedlist":"Chèn/XoĂ¡ Danh sĂ¡ch khĂ´ng thứ tá»±","numberedlist":"Chèn/XoĂ¡ Danh sĂ¡ch cĂ³ thứ tá»±"},"magicline":{"title":"Chèn Ä‘oạn vĂ o Ä‘Ă¢y"},"maximize":{"maximize":"PhĂ³ng to tối Ä‘a","minimize":"Thu nhá»"},"pastetext":{"button":"DĂ¡n theo định dạng văn bản thuần","title":"DĂ¡n theo định dạng văn bản thuần"},"pastefromword":{"confirmCleanup":"Văn bản bạn muốn dĂ¡n cĂ³ kèm định dạng của Word. Bạn cĂ³ muốn loại bỠđịnh dạng Word trÆ°á»›c khi dĂ¡n?","error":"KhĂ´ng thể để lĂ m sạch cĂ¡c dữ liệu dĂ¡n do má»™t lá»—i ná»™i bá»™","title":"DĂ¡n vá»›i định dạng Word","toolbar":"DĂ¡n vá»›i định dạng Word"},"removeformat":{"toolbar":"XoĂ¡ định dạng"},"sourcearea":{"toolbar":"MĂ£ HTML"},"specialchar":{"options":"TĂ¹y chá»n cĂ¡c kĂ½ tá»± đặc biệt","title":"HĂ£y chá»n kĂ½ tá»± đặc biệt","toolbar":"Chèn kĂ½ tá»± đặc biệt"},"scayt":{"btn_about":"ThĂ´ng tin vá» SCAYT","btn_dictionaries":"Từ Ä‘iển","btn_disable":"Tắt SCAYT","btn_enable":"Bật SCAYT","btn_langs":"NgĂ´n ngữ","btn_options":"TĂ¹y chá»n","text_title":"Kiểm tra chĂ­nh tả ngay khi gõ chữ (SCAYT)"},"stylescombo":{"label":"Kiểu","panelTitle":"Phong cĂ¡ch định dạng","panelTitle1":"Kiểu khối","panelTitle2":"Kiểu trá»±c tiếp","panelTitle3":"Kiểu đối tượng"},"table":{"border":"KĂ­ch thÆ°á»›c Ä‘Æ°á»ng viá»n","caption":"Äầu Ä‘á»","cell":{"menu":"Ă”","insertBefore":"Chèn Ă´ PhĂ­a trÆ°á»›c","insertAfter":"Chèn Ă´ PhĂ­a sau","deleteCell":"XoĂ¡ Ă´","merge":"Kết hợp Ă´","mergeRight":"Kết hợp sang phải","mergeDown":"Kết hợp xuống dÆ°á»›i","splitHorizontal":"PhĂ¢n tĂ¡ch Ă´ theo chiá»u ngang","splitVertical":"PhĂ¢n tĂ¡ch Ă´ theo chiá»u dá»c","title":"Thuá»™c tĂ­nh của Ă´","cellType":"Kiểu của Ă´","rowSpan":"Kết hợp hĂ ng","colSpan":"Kết hợp cá»™t","wordWrap":"Chữ liá»n hĂ ng","hAlign":"Canh lá» ngang","vAlign":"Canh lá» dá»c","alignBaseline":"ÄÆ°á»ng cÆ¡ sở","bgColor":"MĂ u ná»n","borderColor":"MĂ u viá»n","data":"Dữ liệu","header":"Äầu Ä‘á»","yes":"CĂ³","no":"KhĂ´ng","invalidWidth":"Chiá»u rá»™ng của Ă´ phải lĂ  má»™t số nguyĂªn.","invalidHeight":"Chiá»u cao của Ă´ phải lĂ  má»™t số nguyĂªn.","invalidRowSpan":"Số hĂ ng kết hợp phải lĂ  má»™t số nguyĂªn.","invalidColSpan":"Số cá»™t kết hợp phải lĂ  má»™t số nguyĂªn.","chooseColor":"Chá»n mĂ u"},"cellPad":"Khoảng đệm giữ Ă´ vĂ  ná»™i dung","cellSpace":"Khoảng cĂ¡ch giữa cĂ¡c Ă´","column":{"menu":"Cá»™t","insertBefore":"Chèn cá»™t phĂ­a trÆ°á»›c","insertAfter":"Chèn cá»™t phĂ­a sau","deleteColumn":"XoĂ¡ cá»™t"},"columns":"Số cá»™t","deleteTable":"XĂ³a bảng","headers":"Äầu Ä‘á»","headersBoth":"Cả hai","headersColumn":"Cá»™t đầu tiĂªn","headersNone":"KhĂ´ng cĂ³","headersRow":"HĂ ng đầu tiĂªn","invalidBorder":"KĂ­ch cỡ của Ä‘Æ°á»ng biĂªn phải lĂ  má»™t số nguyĂªn.","invalidCellPadding":"Khoảng đệm giữa Ă´ vĂ  ná»™i dung phải lĂ  má»™t số nguyĂªn.","invalidCellSpacing":"Khoảng cĂ¡ch giữa cĂ¡c Ă´ phải lĂ  má»™t số nguyĂªn.","invalidCols":"Số lượng cá»™t phải lĂ  má»™t số lá»›n hÆ¡n 0.","invalidHeight":"Chiá»u cao của bảng phải lĂ  má»™t số nguyĂªn.","invalidRows":"Số lượng hĂ ng phải lĂ  má»™t số lá»›n hÆ¡n 0.","invalidWidth":"Chiá»u rá»™ng của bảng phải lĂ  má»™t số nguyĂªn.","menu":"Thuá»™c tĂ­nh bảng","row":{"menu":"HĂ ng","insertBefore":"Chèn hĂ ng phĂ­a trÆ°á»›c","insertAfter":"Chèn hĂ ng phĂ­a sau","deleteRow":"XoĂ¡ hĂ ng"},"rows":"Số hĂ ng","summary":"TĂ³m lược","title":"Thuá»™c tĂ­nh bảng","toolbar":"Bảng","widthPc":"Phần trăm (%)","widthPx":"Äiểm ảnh (px)","widthUnit":"ÄÆ¡n vị"},"undo":{"redo":"LĂ m lại thao tĂ¡c","undo":"KhĂ´i phục thao tĂ¡c"},"wsc":{"btnIgnore":"Bá» qua","btnIgnoreAll":"Bá» qua tất cả","btnReplace":"Thay thế","btnReplaceAll":"Thay thế tất cả","btnUndo":"Phục hồi lại","changeTo":"Chuyển thĂ nh","errorLoading":"Lá»—i khi Ä‘ang nạp dịch vụ ứng dụng: %s.","ieSpellDownload":"Chức năng kiểm tra chĂ­nh tả chÆ°a được cĂ i đặt. Bạn cĂ³ muốn tải vá» ngay bĂ¢y giá»?","manyChanges":"HoĂ n tất kiểm tra chĂ­nh tả: %1 từ Ä‘Ă£ được thay đổi","noChanges":"HoĂ n tất kiểm tra chĂ­nh tả: KhĂ´ng cĂ³ từ nĂ o được thay đổi","noMispell":"HoĂ n tất kiểm tra chĂ­nh tả: KhĂ´ng cĂ³ lá»—i chĂ­nh tả","noSuggestions":"- KhĂ´ng Ä‘Æ°a ra gợi Ă½ vá» từ -","notAvailable":"Xin lá»—i, dịch vụ nĂ y hiện tại khĂ´ng cĂ³.","notInDic":"KhĂ´ng cĂ³ trong từ Ä‘iển","oneChange":"HoĂ n tất kiểm tra chĂ­nh tả: Má»™t từ Ä‘Ă£ được thay đổi","progress":"Äang tiến hĂ nh kiểm tra chĂ­nh tả...","title":"Kiểm tra chĂ­nh tả","toolbar":"Kiểm tra chĂ­nh tả"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/zh-cn.js b/js/ckeditor/lang/zh-cn.js
new file mode 100644
index 0000000..12809e1
--- /dev/null
+++ b/js/ckeditor/lang/zh-cn.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['zh-cn']={"editor":"所è§å³æ‰€å¾—编辑器","editorPanel":"所è§å³æ‰€å¾—编辑器é¢æ¿","common":{"editorHelp":"按 ALT+0 è·å¾—帮å©","browseServer":"æµè§ˆæœå¡å™¨","url":"URL","protocol":"åè®®","upload":"ä¸ä¼ ","uploadSubmit":"ä¸ä¼ åˆ°æœå¡å™¨","image":"图åƒ","flash":"Flash","form":"表å•","checkbox":"å¤é€‰æ¡†","radio":"å•é€‰æŒ‰é’®","textField":"å•è¡Œæ–‡æœ¬","textarea":"å¤è¡Œæ–‡æœ¬","hiddenField":"éè—域","button":"按钮","select":"列表/èœå•","imageButton":"图åƒæŒ‰é’®","notSet":"<没有设置>","id":"ID","name":"å称","langDir":"语言方å‘","langDirLtr":"ä»å·¦åˆ°å³ (LTR)","langDirRtl":"ä»å³åˆ°å·¦ (RTL)","langCode":"语言代ç ","longDescr":"è¯¦ç»†è¯´æ˜ URL","cssClass":"æ ·å¼ç±»å称","advisoryTitle":"标题","cssStyle":"行内样å¼","ok":"ç¡®å®","cancel":"å–消","close":"关闭","preview":"预览","resize":"拖拽以改å˜å¤§å°","generalTab":"常规","advancedTab":"高级","validateNumberFailed":"需è¦è¾“入数字格å¼","confirmNewPage":"当å‰æ–‡æ¡£å†…容未ä¿å­˜ï¼Œæ˜¯å¦ç¡®è®¤æ–°å»ºæ–‡æ¡£ï¼Ÿ","confirmCancel":"部分修改å°æœªä¿å­˜ï¼Œæ˜¯å¦ç¡®è®¤å…³é—­å¯¹è¯æ¡†ï¼Ÿ","options":"选项","target":"目标窗å£","targetNew":"æ–°çª—å£ (_blank)","targetTop":"整页 (_top)","targetSelf":"æœ¬çª—å£ (_self)","targetParent":"çˆ¶çª—å£ (_parent)","langDirLTR":"ä»å·¦åˆ°å³ (LTR)","langDirRTL":"ä»å³åˆ°å·¦ (RTL)","styles":"æ ·å¼","cssClasses":"æ ·å¼ç±»","width":"宽度","height":"高度","align":"对é½æ–¹å¼","alignLeft":"左对é½","alignRight":"å³å¯¹é½","alignCenter":"居中","alignJustify":"两端对é½","alignTop":"顶端","alignMiddle":"居中","alignBottom":"底部","alignNone":"æ— ","invalidValue":"无效ç„å€¼ă€‚","invalidHeight":"高度必须为数字格å¼","invalidWidth":"宽度必须为数字格å¼","invalidCssLength":"此“%1â€å­—段ç„值必须为正数,å¯ä»¥åŒ…å«æˆ–ä¸åŒ…å«ä¸€ä¸ªæœ‰æ•ˆç„ CSS 长度å•ä½(px, %, in, cm, mm, em, ex, pt 或 pc)","invalidHtmlLength":"此“%1â€å­—段ç„值必须为正数,å¯ä»¥åŒ…å«æˆ–ä¸åŒ…å«ä¸€ä¸ªæœ‰æ•ˆç„ HTML 长度å•ä½(px 或 %)","invalidInlineStyle":"内è”æ ·å¼å¿…须为格å¼æ˜¯ä»¥åˆ†å·åˆ†é”ç„一个或å¤ä¸ªâ€œå±æ€§å : å±æ€§å€¼â€ă€‚","cssLengthTooltip":"输入一个表示åƒç´ å€¼ç„数字,或å ä¸ä¸€ä¸ªæœ‰æ•ˆç„ CSS 长度å•ä½(px, %, in, cm, mm, em, ex, pt 或 pc)。","unavailable":"%1<span class=\"cke_accessibility\">,ä¸å¯ç”¨</span>"},"about":{"copy":"版æƒæ‰€æœ‰ &copy; $1。<br />ä¿ç•™æ‰€æœ‰æƒåˆ©ă€‚","dlgTitle":"å…³äº CKEditor","help":"访问 $1 以è·å–帮å©ă€‚","moreInfo":"相关æˆæƒè®¸å¯ä¿¡æ¯è¯·è®¿é—®æˆ‘们ç„网站ï¼","title":"å…³äº CKEditor","userGuide":"CKEditor 用户å‘导"},"basicstyles":{"bold":"å ç²—","italic":"倾斜","strike":"删除线","subscript":"下标","superscript":"ä¸æ ‡","underline":"下划线"},"blockquote":{"toolbar":"å—引用"},"clipboard":{"copy":"å¤åˆ¶","copyError":"您ç„æµè§ˆå™¨å®‰å…¨è®¾ç½®ä¸å…许编辑器自å¨æ‰§è¡Œå¤åˆ¶æ“作,请使用键盘快æ·é”®(Ctrl/Cmd+C)æ¥å®Œæˆă€‚","cut":"剪切","cutError":"您ç„æµè§ˆå™¨å®‰å…¨è®¾ç½®ä¸å…许编辑器自å¨æ‰§è¡Œå‰ªåˆ‡æ“作,请使用键盘快æ·é”®(Ctrl/Cmd+X)æ¥å®Œæˆă€‚","paste":"粘贴","pasteArea":"粘贴区域","pasteMsg":"请使用键盘快æ·é”®(<STRONG>Ctrl/Cmd+V</STRONG>)æ内容粘贴到下é¢ç„方框里,å†æŒ‰ <STRONG>ç¡®å®</STRONG>","securityMsg":"因为您ç„æµè§ˆå™¨ç„安全设置åŸå› ï¼Œæœ¬ç¼–辑器ä¸èƒ½ç›´æ¥è®¿é—®æ‚¨ç„剪贴æ¿å†…容,你需è¦åœ¨æœ¬çª—å£é‡æ–°ç²˜è´´ä¸€æ¬¡ă€‚","title":"粘贴"},"contextmenu":{"options":"å¿«æ·èœå•é€‰é¡¹"},"button":{"selectedLabel":"已选中 %1 项"},"toolbar":{"toolbarCollapse":"æ˜å å·¥å…·æ ","toolbarExpand":"展开工具æ ","toolbarGroups":{"document":"文档","clipboard":"剪贴æ¿/撤销","editing":"编辑","forms":"表å•","basicstyles":"基本格å¼","paragraph":"段è½","links":"链æ¥","insert":"æ’å…¥","styles":"æ ·å¼","colors":"颜色","tools":"工具"},"toolbars":"工具æ "},"elementspath":{"eleLabel":"元素路径","eleTitle":"%1 元素"},"format":{"label":"æ ¼å¼","panelTitle":"æ ¼å¼","tag_address":"地å€","tag_div":"段è½(DIV)","tag_h1":"标题 1","tag_h2":"标题 2","tag_h3":"标题 3","tag_h4":"标题 4","tag_h5":"标题 5","tag_h6":"标题 6","tag_p":"æ™®é€","tag_pre":"已编æ’æ ¼å¼"},"horizontalrule":{"toolbar":"æ’入水平线"},"image":{"alertUrl":"请输入图åƒåœ°å€","alt":"替æ¢æ–‡æœ¬","border":"边框大å°","btnUpload":"ä¸ä¼ åˆ°æœå¡å™¨","button2Img":"ç¡®å®è¦æ当å‰å›¾åƒæŒ‰é’®è½¬æ¢ä¸ºæ™®é€å›¾åƒå—?","hSpace":"水平间è·","img2Button":"ç¡®å®è¦æ当å‰å›¾åƒæ”¹å˜ä¸ºå›¾åƒæŒ‰é’®å—?","infoTab":"图åƒä¿¡æ¯","linkTab":"链æ¥","lockRatio":"é”å®æ¯”例","menu":"图åƒå±æ€§","resetSize":"åŸå§‹å°ºå¯¸","title":"图åƒå±æ€§","titleButton":"图åƒåŸŸå±æ€§","upload":"ä¸ä¼ ","urlMissing":"缺少图åƒæºæ–‡ä»¶åœ°å€","vSpace":"å‚ç›´é—´è·","validateBorder":"边框大å°å¿…须为整数格å¼","validateHSpace":"水平间è·å¿…须为整数格å¼","validateVSpace":"å‚ç›´é—´è·å¿…须为整数格å¼"},"indent":{"indent":"å¢å ç¼©è¿›é‡","outdent":"å‡å°‘缩进é‡"},"fakeobjects":{"anchor":"é”点","flash":"Flash å¨ç”»","hiddenfield":"éè—域","iframe":"IFrame","unknown":"未知对象"},"link":{"acccessKey":"访问键","advanced":"高级","advisoryContentType":"内容类å‹","advisoryTitle":"标题","anchor":{"toolbar":"æ’å…¥/编辑é”点链æ¥","menu":"é”点链æ¥å±æ€§","title":"é”点链æ¥å±æ€§","name":"é”点å称","errorName":"请输入é”点å称","remove":"删除é”点"},"anchorId":"按é”点 ID","anchorName":"按é”点å称","charset":"字符编ç ","cssClasses":"æ ·å¼ç±»å称","emailAddress":"地å€","emailBody":"内容","emailSubject":"主题","id":"ID","info":"超链æ¥ä¿¡æ¯","langCode":"语言代ç ","langDir":"语言方å‘","langDirLTR":"ä»å·¦åˆ°å³ (LTR)","langDirRTL":"ä»å³åˆ°å·¦ (RTL)","menu":"编辑超链æ¥","name":"å称","noAnchors":"(此文档没有å¯ç”¨ç„é”点)","noEmail":"请输入电å­é‚®ä»¶åœ°å€","noUrl":"请输入超链æ¥åœ°å€","other":"<其他>","popupDependent":"ä¾é™„ (NS)","popupFeatures":"弹出窗å£å±æ€§","popupFullScreen":"å…¨å± (IE)","popupLeft":"å·¦","popupLocationBar":"地å€æ ","popupMenuBar":"èœå•æ ","popupResizable":"å¯ç¼©æ”¾","popupScrollBars":"æ»å¨æ¡","popupStatusBar":"ç¶æ€æ ","popupToolbar":"工具æ ","popupTop":"å³","rel":"å…³è”","selectAnchor":"选择一个é”点","styles":"行内样å¼","tabIndex":"Tab 键次åº","target":"目标","targetFrame":"<框æ¶>","targetFrameName":"目标框æ¶å称","targetPopup":"<弹出窗å£>","targetPopupName":"弹出窗å£å称","title":"超链æ¥","toAnchor":"页内é”点链æ¥","toEmail":"电å­é‚®ä»¶","toUrl":"地å€","toolbar":"æ’å…¥/编辑超链æ¥","type":"超链æ¥ç±»å‹","unlink":"å–消超链æ¥","upload":"ä¸ä¼ "},"list":{"bulletedlist":"项目列表","numberedlist":"ç¼–å·åˆ—表"},"magicline":{"title":"在这æ’入段è½"},"maximize":{"maximize":"å…¨å±","minimize":"最å°åŒ–"},"pastetext":{"button":"粘贴为无格å¼æ–‡æœ¬","title":"粘贴为无格å¼æ–‡æœ¬"},"pastefromword":{"confirmCleanup":"您è¦ç²˜è´´ç„内容好åƒæ˜¯æ¥è‡ª MS Word,是å¦è¦æ¸…除 MS Word æ ¼å¼åå†ç²˜è´´ï¼Ÿ","error":"ç”±äºå†…部错误无法清ç†è¦ç²˜è´´ç„æ•°æ®","title":"ä» MS Word 粘贴","toolbar":"ä» MS Word 粘贴"},"removeformat":{"toolbar":"清除格å¼"},"sourcearea":{"toolbar":"æºç "},"specialchar":{"options":"特æ®ç¬¦å·é€‰é¡¹","title":"选择特æ®ç¬¦å·","toolbar":"æ’入特æ®ç¬¦å·"},"scayt":{"btn_about":"å…³äºå³æ—¶æ‹¼å†™æ£€æŸ¥","btn_dictionaries":"å­—å…¸","btn_disable":"ç¦ç”¨å³æ—¶æ‹¼å†™æ£€æŸ¥","btn_enable":"å¯ç”¨å³æ—¶æ‹¼å†™æ£€æŸ¥","btn_langs":"语言","btn_options":"选项","text_title":"å³æ—¶æ‹¼å†™æ£€æŸ¥"},"stylescombo":{"label":"æ ·å¼","panelTitle":"æ ·å¼","panelTitle1":"å—级元素样å¼","panelTitle2":"内è”元素样å¼","panelTitle3":"对象元素样å¼"},"table":{"border":"边框","caption":"标题","cell":{"menu":"å•å…ƒæ ¼","insertBefore":"在左侧æ’å…¥å•å…ƒæ ¼","insertAfter":"在å³ä¾§æ’å…¥å•å…ƒæ ¼","deleteCell":"删除å•å…ƒæ ¼","merge":"åˆå¹¶å•å…ƒæ ¼","mergeRight":"å‘å³åˆå¹¶å•å…ƒæ ¼","mergeDown":"å‘下åˆå¹¶å•å…ƒæ ¼","splitHorizontal":"水平拆分å•å…ƒæ ¼","splitVertical":"å‚直拆分å•å…ƒæ ¼","title":"å•å…ƒæ ¼å±æ€§","cellType":"å•å…ƒæ ¼ç±»å‹","rowSpan":"纵跨行数","colSpan":"横跨列数","wordWrap":"自å¨æ¢è¡Œ","hAlign":"水平对é½","vAlign":"å‚直对é½","alignBaseline":"基线","bgColor":"背景颜色","borderColor":"边框颜色","data":"æ•°æ®","header":"表头","yes":"是","no":"å¦","invalidWidth":"å•å…ƒæ ¼å®½åº¦å¿…须为数字格å¼","invalidHeight":"å•å…ƒæ ¼é«˜åº¦å¿…须为数字格å¼","invalidRowSpan":"行跨度必须为整数格å¼","invalidColSpan":"列跨度必须为整数格å¼","chooseColor":"选择"},"cellPad":"è¾¹è·","cellSpace":"é—´è·","column":{"menu":"列","insertBefore":"在左侧æ’入列","insertAfter":"在å³ä¾§æ’入列","deleteColumn":"删除列"},"columns":"列数","deleteTable":"删除表格","headers":"标题å•å…ƒæ ¼","headersBoth":"第一列和第一行","headersColumn":"第一列","headersNone":"æ— ","headersRow":"第一行","invalidBorder":"边框粗细必须为数字格å¼","invalidCellPadding":"å•å…ƒæ ¼å¡«å……必须为数字格å¼","invalidCellSpacing":"å•å…ƒæ ¼é—´è·å¿…须为数字格å¼","invalidCols":"指å®ç„行数必须大äºé›¶","invalidHeight":"表格高度必须为数字格å¼","invalidRows":"指å®ç„列数必须大äºé›¶","invalidWidth":"表格宽度必须为数字格å¼","menu":"表格å±æ€§","row":{"menu":"è¡Œ","insertBefore":"在ä¸æ–¹æ’入行","insertAfter":"在下方æ’入行","deleteRow":"删除行"},"rows":"行数","summary":"摘è¦","title":"表格å±æ€§","toolbar":"表格","widthPc":"百分比","widthPx":"åƒç´ ","widthUnit":"宽度å•ä½"},"undo":{"redo":"é‡å","undo":"撤消"},"wsc":{"btnIgnore":"忽略","btnIgnoreAll":"全部忽略","btnReplace":"替æ¢","btnReplaceAll":"全部替æ¢","btnUndo":"撤消","changeTo":"更改为","errorLoading":"å è½½åº”该æœå¡ä¸»æœºæ—¶å‡ºé”™: %s.","ieSpellDownload":"拼写检查æ’件还没安装, 您是å¦æƒ³ç°åœ¨å°±ä¸‹è½½?","manyChanges":"拼写检查完æˆ: 更改了 %1 个å•è¯","noChanges":"拼写检查完æˆ: 没有更改任何å•è¯","noMispell":"拼写检查完æˆ: 没有å‘ç°æ‹¼å†™é”™è¯¯","noSuggestions":"- 没有建议 -","notAvailable":"æ±æ­‰, æœå¡ç›®å‰æ‚ä¸å¯ç”¨","notInDic":"没有在字典里","oneChange":"拼写检查完æˆ: 更改了一个å•è¯","progress":"正在进行拼写检查...","title":"拼写检查","toolbar":"拼写检查"}}; \ No newline at end of file
diff --git a/js/ckeditor/lang/zh.js b/js/ckeditor/lang/zh.js
new file mode 100644
index 0000000..20ce3d1
--- /dev/null
+++ b/js/ckeditor/lang/zh.js
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.lang['zh']={"editor":"RTF 編輯器","editorPanel":"RTF 編輯器é¢æ¿","common":{"editorHelp":"按下 ALT 0 å–得說æ˜ă€‚","browseServer":"ç€è¦½ä¼ºæœå™¨","url":"URL","protocol":"é€è¨å”å®","upload":"ä¸å‚³","uploadSubmit":"傳é€è‡³ä¼ºæœå™¨","image":"圖åƒ","flash":"Flash","form":"表格","checkbox":"æ ¸å–æ–¹å¡","radio":"é¸é …按鈕","textField":"文字欄ä½","textarea":"文字å€åŸŸ","hiddenField":"é±è—欄ä½","button":"按鈕","select":"é¸å–欄ä½","imageButton":"å½±åƒæŒ‰éˆ•","notSet":"<未設å®>","id":"ID","name":"å稱","langDir":"èªè¨€æ–¹å‘","langDirLtr":"ç”±å·¦è‡³å³ (LTR)","langDirRtl":"ç”±å³è‡³å·¦ (RTL)","langCode":"èªè¨€ä»£ç¢¼","longDescr":"完整æè¿° URL","cssClass":"樣å¼è¡¨é¡åˆ¥","advisoryTitle":"標題","cssStyle":"樣å¼","ok":"確å®","cancel":"å–消","close":"關閉","preview":"é è¦½","resize":"調整大å°","generalTab":"一般","advancedTab":"進é","validateNumberFailed":"此值ä¸æ˜¯æ•¸å€¼ă€‚","confirmNewPage":"ç¾å­˜ç„修改å°æœªå„²å­˜ï¼Œè¦é–‹æ–°æª”案?","confirmCancel":"部份é¸é …å°æœªå„²å­˜ï¼Œè¦é—œé–‰å°è©±æ¡†ï¼Ÿ","options":"é¸é …","target":"目標","targetNew":"開新視窗 (_blank)","targetTop":"最ä¸å±¤è¦–窗 (_top)","targetSelf":"相åŒè¦–窗 (_self)","targetParent":"父視窗 (_parent)","langDirLTR":"ç”±å·¦è‡³å³ (LTR)","langDirRTL":"ç”±å³è‡³å·¦ (RTL)","styles":"樣å¼","cssClasses":"樣å¼è¡¨é¡åˆ¥","width":"寬度","height":"高度","align":"å°é½æ–¹å¼","alignLeft":"é å·¦å°é½","alignRight":"é å³å°é½","alignCenter":"置中å°é½","alignJustify":"å·¦å³å°é½","alignTop":"頂端","alignMiddle":"中間å°é½","alignBottom":"底端","alignNone":"ç„¡","invalidValue":"ç„¡æ•ˆå€¼ă€‚","invalidHeight":"é«˜åº¦å¿…é ˆç‚ºæ•¸å­—ă€‚","invalidWidth":"å¯¬åº¦å¿…é ˆç‚ºæ•¸å­—ă€‚","invalidCssLength":"ă€Œ%1ă€ç„值應為正數,並å¯åŒ…å«æœ‰æ•ˆç„ CSS å–®ä½ (px, %, in, cm, mm, em, ex, pt, 或 pc)。","invalidHtmlLength":"ă€Œ%1ă€ç„值應為正數,並å¯åŒ…å«æœ‰æ•ˆç„ HTML å–®ä½ (px 或 %)。","invalidInlineStyle":"行內樣å¼ç„值應包å«ä¸€å€‹ä»¥ä¸ç„è®æ•¸å€¼çµ„,其格å¼å¦‚ă€Œå稱:值ă€ï¼Œä¸¦ä»¥åˆ†è™Ÿå€é”ä¹‹ă€‚","cssLengthTooltip":"請輸入數值,單ä½æ˜¯åƒç´ æˆ–æœ‰æ•ˆç„ CSS å–®ä½ (px, %, in, cm, mm, em, ex, pt, 或 pc)。","unavailable":"%1<span class=\"cke_accessibility\">,無法使用</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"關於 CKEditor","help":"檢閱 $1 尋求幫å©ă€‚","moreInfo":"關於æˆæ¬è³‡è¨ï¼Œè«‹åƒé–±æˆ‘們ç„網站ï¼","title":"關於 CKEditor","userGuide":"CKEditor 使用者手å†"},"basicstyles":{"bold":"ç²—é«”","italic":"斜體","strike":"刪除ç·","subscript":"下標","superscript":"ä¸æ¨™","underline":"底ç·"},"blockquote":{"toolbar":"引用段è½"},"clipboard":{"copy":"複製","copyError":"ç€è¦½å™¨ç„安全性設å®ä¸å…è¨±ç·¨è¼¯å™¨è‡ªå‹•åŸ·è¡Œè¤‡è£½å‹•ä½œă€‚è«‹ä½¿ç”¨éµç›¤å¿«æ·éµ (Ctrl/Cmd+C) è¤‡è£½ă€‚","cut":"剪下","cutError":"ç€è¦½å™¨ç„安全性設å®ä¸å…è¨±ç·¨è¼¯å™¨è‡ªå‹•åŸ·è¡Œå‰ªä¸‹å‹•ä½œă€‚è«‹ä½¿ç”¨é盤快æ·éµ (Ctrl/Cmd+X) å‰ªä¸‹ă€‚","paste":"è²¼ä¸","pasteArea":"è²¼ä¸å€","pasteMsg":"請使用éµç›¤å¿«æ·éµ (<strong>Ctrl/Cmd+V</strong>) 貼到下方å€åŸŸä¸­ä¸¦æŒ‰ä¸‹ă€Œç¢ºå®ă€ă€‚","securityMsg":"因為ç€è¦½å™¨ç„安全性設å®ï¼Œæœ¬ç·¨è¼¯å™¨ç„¡æ³•ç›´æ¥å­˜å–您ç„剪貼簿資料,請您自行在本視窗進行貼ä¸å‹•ä½œă€‚","title":"è²¼ä¸"},"contextmenu":{"options":"內容åŸèƒ½è¡¨é¸é …"},"button":{"selectedLabel":"%1 (å·²é¸å–)"},"toolbar":{"toolbarCollapse":"摺ç–工具列","toolbarExpand":"展開工具列","toolbarGroups":{"document":"文件","clipboard":"剪貼簿/復åŸ","editing":"編輯é¸é …","forms":"æ ¼å¼","basicstyles":"基本樣å¼","paragraph":"段è½","links":"連çµ","insert":"æ’å…¥","styles":"樣å¼","colors":"é¡è‰²","tools":"工具"},"toolbars":"編輯器工具列"},"elementspath":{"eleLabel":"元件路徑","eleTitle":"%1 個元件"},"format":{"label":"æ ¼å¼","panelTitle":"段è½æ ¼å¼","tag_address":"地å€","tag_div":"標準 (DIV)","tag_h1":"標題 1","tag_h2":"標題 2","tag_h3":"標題 3","tag_h4":"標題 4","tag_h5":"標題 5","tag_h6":"標題 6","tag_p":"標準","tag_pre":"æ ¼å¼è¨­å®"},"horizontalrule":{"toolbar":"æ’入水平ç·"},"image":{"alertUrl":"請輸入圖片 URL","alt":"替代文字","border":"框ç·","btnUpload":"傳é€åˆ°ä¼ºæœå™¨","button2Img":"è«‹å•æ‚¨ç¢ºå®è¦å°‡ă€Œåœ–片按鈕ă€è½‰æ›æˆă€Œåœ–片ă€å—?","hSpace":"HSpace","img2Button":"è«‹å•æ‚¨ç¢ºå®è¦å°‡ă€Œåœ–片ă€è½‰æ›æˆă€Œåœ–片按鈕ă€å—?","infoTab":"å½±åƒè³‡è¨","linkTab":"連çµ","lockRatio":"固å®æ¯”例","menu":"å½±åƒå±¬æ€§","resetSize":"é‡è¨­å¤§å°","title":"å½±åƒå±¬æ€§","titleButton":"å½±åƒæŒ‰éˆ•å±¬æ€§","upload":"ä¸å‚³","urlMissing":"éºå¤±åœ–片來æºä¹‹ URL ","vSpace":"VSpace","validateBorder":"框ç·å¿…é ˆæ˜¯æ•´æ•¸ă€‚","validateHSpace":"HSpace å¿…é ˆæ˜¯æ•´æ•¸ă€‚","validateVSpace":"VSpace å¿…é ˆæ˜¯æ•´æ•¸ă€‚"},"indent":{"indent":"å¢å ç¸®æ’","outdent":"減少縮æ’"},"fakeobjects":{"anchor":"錨é»","flash":"Flash å‹•ç•«","hiddenfield":"é±è—欄ä½","iframe":"IFrame","unknown":"無法辨識ç„物件"},"link":{"acccessKey":"便æ·éµ","advanced":"進é","advisoryContentType":"建議內容é¡å‹","advisoryTitle":"標題","anchor":{"toolbar":"錨é»","menu":"編輯錨é»","title":"錨é»å…§å®¹","name":"錨é»å稱","errorName":"請輸入錨é»å稱","remove":"移除錨é»"},"anchorId":"ä¾å…ƒä»¶ç·¨è™Ÿ","anchorName":"ä¾éŒ¨é»å稱","charset":"連çµè³‡æºç„字元集","cssClasses":"樣å¼è¡¨é¡åˆ¥","emailAddress":"é›»å­éƒµä»¶åœ°å€","emailBody":"郵件本文","emailSubject":"郵件主旨","id":"ID","info":"連çµè³‡è¨","langCode":"èªè¨€ç¢¼","langDir":"èªè¨€æ–¹å‘","langDirLTR":"ç”±å·¦è‡³å³ (LTR)","langDirRTL":"ç”±å³è‡³å·¦ (RTL)","menu":"編輯連çµ","name":"å稱","noAnchors":"(本文件中無å¯ç”¨ä¹‹éŒ¨é»)","noEmail":"請輸入電å­éƒµä»¶","noUrl":"è«‹è¼¸å…¥é€£çµ URL","other":"<其他>","popupDependent":"ç¨ç«‹ (Netscape)","popupFeatures":"快顯視窗åŸèƒ½","popupFullScreen":"å…¨è¢å¹• (IE)","popupLeft":"å·¦å´ä½ç½®","popupLocationBar":"ä½ç½®åˆ—","popupMenuBar":"åŸèƒ½è¡¨åˆ—","popupResizable":"å¯èª¿å¤§å°","popupScrollBars":"æ²è»¸","popupStatusBar":"狀態列","popupToolbar":"工具列","popupTop":"頂端ä½ç½®","rel":"關係","selectAnchor":"é¸å–一個錨é»","styles":"樣å¼","tabIndex":"å®ä½é †åº","target":"目標","targetFrame":"<框æ¶>","targetFrameName":"目標框æ¶å稱","targetPopup":"<快顯視窗>","targetPopupName":"快顯視窗å稱","title":"連çµ","toAnchor":"文字中ç„錨é»é€£çµ","toEmail":"é›»å­éƒµä»¶","toUrl":"網å€","toolbar":"連çµ","type":"連çµé¡å‹","unlink":"å–消連çµ","upload":"ä¸å‚³"},"list":{"bulletedlist":"æ’å…¥/移除項目符號清單","numberedlist":"æ’å…¥/移除編號清單清單"},"magicline":{"title":"在此æ’入段è½"},"maximize":{"maximize":"最大化","minimize":"最å°åŒ–"},"pastetext":{"button":"è²¼æˆç´”文字","title":"è²¼æˆç´”文字"},"pastefromword":{"confirmCleanup":"您想貼ä¸ç„文字似ä¹æ˜¯è‡ª Word 複製而來,請å•æ‚¨æ˜¯å¦è¦å…ˆæ¸…除 Word ç„æ ¼å¼å¾Œå†è¡Œè²¼ä¸ï¼Ÿ","error":"由於發生內部錯誤,無法清除清除 Word ç„æ ¼å¼ă€‚","title":"自 Word è²¼ä¸","toolbar":"自 Word è²¼ä¸"},"removeformat":{"toolbar":"移除格å¼"},"sourcearea":{"toolbar":"åŸå§‹ç¢¼"},"specialchar":{"options":"特æ®å­—å…ƒé¸é …","title":"é¸å–特æ®å­—å…ƒ","toolbar":"æ’入特æ®å­—å…ƒ"},"scayt":{"btn_about":"關於å³æ™‚拼寫檢查","btn_dictionaries":"å­—å…¸","btn_disable":"關閉å³æ™‚拼寫檢查","btn_enable":"啟用å³æ™‚拼寫檢查","btn_langs":"èªè¨€","btn_options":"é¸é …","text_title":"å³æ™‚拼寫檢查"},"stylescombo":{"label":"樣å¼","panelTitle":"Formatting Styles","panelTitle1":"å€å¡æ¨£å¼","panelTitle2":"內嵌樣å¼","panelTitle3":"物件樣å¼"},"table":{"border":"框ç·å¤§å°","caption":"標題","cell":{"menu":"儲存格","insertBefore":"å‰æ–¹æ’入儲存格","insertAfter":"後方æ’入儲存格","deleteCell":"刪除儲存格","merge":"åˆä½µå„²å­˜æ ¼","mergeRight":"å‘å³åˆä½µ","mergeDown":"å‘下åˆä½µ","splitHorizontal":"水平分割儲存格","splitVertical":"å‚直分割儲存格","title":"儲存格屬性","cellType":"儲存格é¡å‹","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"自動斷行","hAlign":"æ°´å¹³å°é½","vAlign":"å‚ç›´å°é½","alignBaseline":"基準ç·","bgColor":"背景é¡è‰²","borderColor":"框ç·é¡è‰²","data":"資料","header":"Header","yes":"是","no":"å¦","invalidWidth":"å„²å­˜æ ¼å¯¬åº¦å¿…é ˆç‚ºæ•¸å­—ă€‚","invalidHeight":"å„²å­˜æ ¼é«˜åº¦å¿…é ˆç‚ºæ•¸å­—ă€‚","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"é¸æ“‡"},"cellPad":"Cell padding","cellSpace":"Cell spacing","column":{"menu":"è¡Œ","insertBefore":"Insert Column Before","insertAfter":"Insert Column After","deleteColumn":"Delete Columns"},"columns":"è¡Œ","deleteTable":"Delete Table","headers":"Headers","headersBoth":"Both","headersColumn":"First column","headersNone":"ç„¡","headersRow":"First Row","invalidBorder":"框ç·å¤§å°å¿…é ˆæ˜¯æ•´æ•¸ă€‚","invalidCellPadding":"Cell padding must be a positive number.","invalidCellSpacing":"Cell spacing must be a positive number.","invalidCols":"行數須為大於 0 ç„æ­£æ•´æ•¸ă€‚","invalidHeight":"è¡¨æ ¼é«˜åº¦å¿…é ˆç‚ºæ•¸å­—ă€‚","invalidRows":"Number of rows must be a number greater than 0.","invalidWidth":"è¡¨æ ¼å¯¬åº¦å¿…é ˆç‚ºæ•¸å­—ă€‚","menu":"表格屬性","row":{"menu":"列","insertBefore":"Insert Row Before","insertAfter":"Insert Row After","deleteRow":"Delete Rows"},"rows":"列","summary":"Summary","title":"表格屬性","toolbar":"表格","widthPc":"百分比","widthPx":"åƒç´ ","widthUnit":"寬度單ä½"},"undo":{"redo":"å–消復åŸ","undo":"復åŸ"},"wsc":{"btnIgnore":"忽略","btnIgnoreAll":"全部忽略","btnReplace":"å–代","btnReplaceAll":"全部å–代","btnUndo":"復åŸ","changeTo":"更改為","errorLoading":"無法è¯ç³»ä¾æœå™¨: %s.","ieSpellDownload":"å°æœªå®‰è£æ‹¼å­—æª¢æŸ¥å…ƒä»¶ă€‚æ‚¨æ˜¯å¦æƒ³è¦ç¾åœ¨ä¸‹è¼‰ï¼Ÿ","manyChanges":"拼字檢查完æˆï¼æ›´æ”¹äº† %1 個單字","noChanges":"拼字檢查完æˆï¼æœªæ›´æ”¹ä»»ä½•å–®å­—","noMispell":"拼字檢查完æˆï¼æœªç™¼ç¾æ‹¼å­—錯誤","noSuggestions":"- 無建議值 -","notAvailable":"æ±æ­‰ï¼Œæœå‹™ç›®å‰æ«ä¸å¯ç”¨","notInDic":"ä¸åœ¨å­—典中","oneChange":"拼字檢查完æˆï¼æ›´æ”¹äº† 1 個單字","progress":"進行拼字檢查中…","title":"拼字檢查","toolbar":"拼字檢查"}}; \ No newline at end of file
diff --git a/js/ckeditor/plugins/a11yhelp/dialogs/a11yhelp.js b/js/ckeditor/plugins/a11yhelp/dialogs/a11yhelp.js
new file mode 100644
index 0000000..09e51d2
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/a11yhelp.js
@@ -0,0 +1,10 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.dialog.add("a11yHelp",function(j){var a=j.lang.a11yhelp,l=CKEDITOR.tools.getNextId(),e={8:a.backspace,9:a.tab,13:a.enter,16:a.shift,17:a.ctrl,18:a.alt,19:a.pause,20:a.capslock,27:a.escape,33:a.pageUp,34:a.pageDown,35:a.end,36:a.home,37:a.leftArrow,38:a.upArrow,39:a.rightArrow,40:a.downArrow,45:a.insert,46:a["delete"],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]=a.alt;e[CKEDITOR.SHIFT]=a.shift;e[CKEDITOR.CTRL]=a.ctrl;var f=[CKEDITOR.ALT,CKEDITOR.SHIFT,
+CKEDITOR.CTRL],m=/\$\{(.*?)\}/g,p=function(){var a=j.keystrokeHandler.keystrokes,g={},c;for(c in a)g[a[c]]=c;return function(a,c){var b;if(g[c]){b=g[c];for(var h,i,k=[],d=0;d<f.length;d++)i=f[d],h=b/f[d],1<h&&2>=h&&(b-=i,k.push(e[i]));k.push(e[b]||String.fromCharCode(b));b=k.join("+")}else b=a;return b}}();return{title:a.title,minWidth:600,minHeight:400,contents:[{id:"info",label:j.lang.common.generalTab,expand:!0,elements:[{type:"html",id:"legends",style:"white-space:normal;",focus:function(){this.getElement().focus()},
+html:function(){for(var e='<div class="cke_accessibility_legend" role="document" aria-labelledby="'+l+'_arialbl" tabIndex="-1">%1</div><span id="'+l+'_arialbl" class="cke_voice_label">'+a.contents+" </span>",g=[],c=a.legend,j=c.length,f=0;f<j;f++){for(var b=c[f],h=[],i=b.items,k=i.length,d=0;d<k;d++){var n=i[d],o=n.legend.replace(m,p);o.match(m)||h.push("<dt>%1</dt><dd>%2</dd>".replace("%1",n.name).replace("%2",o))}g.push("<h1>%1</h1><dl>%2</dl>".replace("%1",b.name).replace("%2",h.join("")))}return e.replace("%1",
+g.join(""))}()+'<style type="text/css">.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}</style>'}]}],
+buttons:[CKEDITOR.dialog.cancelButton]}}); \ No newline at end of file
diff --git a/js/ckeditor/plugins/a11yhelp/dialogs/lang/_translationstatus.txt b/js/ckeditor/plugins/a11yhelp/dialogs/lang/_translationstatus.txt
new file mode 100644
index 0000000..871e717
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/_translationstatus.txt
@@ -0,0 +1,25 @@
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/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/js/ckeditor/plugins/a11yhelp/dialogs/lang/af.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/af.js
new file mode 100644
index 0000000..bbda109
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/af.js
@@ -0,0 +1,11 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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:"In 'n dialoog, druk TAB vir die volgende dialoog veld, SHIFT + TAB vir die vorige dialoog veld, ENTER om te bevestig enESC om die dialoog af te breek. Vir 'n dialoog met meer as een leisie, druk ALT + F10 om die leisielys te wys. Beweeg dan met TAB of Regter pyl na die volgende leise of SHIFT + TAB of Linker pyl na die voorige leisie. Druk SPACE of ENTER om na die leisie bladsy toe te gaan."},
+{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}"}]}],backspace:"Backspace",tab:"Tab",enter:"Enter",shift:"Shift",ctrl:"Ctrl",alt:"Alt",pause:"Pouse",capslock:"Hoofletterslot",escape:"Ontsnap",pageUp:"Blaaiop",pageDown:"Blaaiaf",end:"Einde",home:"Tuis",leftArrow:"Linkspyl",upArrow:"Oppyl",rightArrow:"Regterpyl",downArrow:"Afpyl",insert:"Toevoeg","delete":"Verwyder",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/js/ckeditor/plugins/a11yhelp/dialogs/lang/ar.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/ar.js
new file mode 100644
index 0000000..2e902ae
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/ar.js
@@ -0,0 +1,11 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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 next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
+{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}"}]}],backspace:"Backspace",tab:"Tab",enter:"Enter",shift:"Shift",ctrl:"Ctrl",alt:"Alt",pause:"Pause",capslock:"Caps Lock",escape:"Escape",pageUp:"Page Up",pageDown:"Page Down",end:"End",home:"Home",leftArrow:"Left Arrow",upArrow:"Up Arrow",rightArrow:"Right Arrow",downArrow:"Down Arrow",insert:"Insert","delete":"Delete",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/js/ckeditor/plugins/a11yhelp/dialogs/lang/bg.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/bg.js
new file mode 100644
index 0000000..44134d6
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/bg.js
@@ -0,0 +1,11 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","bg",{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 next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
+{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}"}]}],backspace:"Backspace",tab:"Tab",enter:"Enter",shift:"Shift",ctrl:"Ctrl",alt:"Alt",pause:"Pause",capslock:"Caps Lock",escape:"Escape",pageUp:"Page Up",pageDown:"Page Down",end:"End",home:"Home",leftArrow:"Left Arrow",upArrow:"Up Arrow",rightArrow:"Right Arrow",downArrow:"Down Arrow",insert:"Insert","delete":"Delete",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/js/ckeditor/plugins/a11yhelp/dialogs/lang/ca.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/ca.js
new file mode 100644
index 0000000..7c168d4
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/ca.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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 al segĂ¼ent camp del quadre de diĂ leg, premi SHIFT + TAB per desplaçar-se a l'anterior camp, premi ENTER per acceptar el quadre de diĂ leg, premi ESC per cancel·lar el quadre de diĂ leg. Per els quadres de diĂ leg que tenen diverses pestanyes, premi ALT + F10 per anar a la llista de pestanyes. DesprĂ©s podrĂ  desplaçar-se a la segĂ¼ent pestanya amb TAB o RIGHT ARROW. Anar a la pestanya anterior amb SHIFT + TAB o LEFT ARROW. Premi SPACE o ENTER per seleccionar la pestanya."},
+{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}"}]}],backspace:"RetrocĂ©s",tab:"TabulaciĂ³",enter:"Intro",shift:"MajĂºscules",ctrl:"Ctrl",alt:"Alt",pause:"Pausa",capslock:"Bloqueig de majĂºscules",escape:"Escape",pageUp:"PĂ gina Amunt",pageDown:"PĂ gina Avall",
+end:"Fi",home:"Inici",leftArrow:"Fletxa Esquerra",upArrow:"Fletxa Amunt",rightArrow:"Fletxa Dreta",downArrow:"Fletxa Avall",insert:"Inserir","delete":"Eliminar",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/js/ckeditor/plugins/a11yhelp/dialogs/lang/cs.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/cs.js
new file mode 100644
index 0000000..2284c7e
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/cs.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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Å¡Ă­ pole, stisknÄ›te SHIFT + TAB pro pÅ™esun na pÅ™edchozĂ­ pole, 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 pr oprochĂ¡zenĂ­ seznamu karet. Pak se pÅ™esuňte na dalÅ¡Ă­ kartu pomocĂ­ TAB nebo Å IPKA VPRAVO. Pro pÅ™esun na pÅ™edchozĂ­ stisknÄ›te SHIFT + TAB nebo Å IPKA VLEVO. StisknÄ›te MEZERNĂK nebo ENTER pro vybrĂ¡nĂ­ strĂ¡nky karet."},{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Ă­ položku 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}"}]}],backspace:"Backspace",tab:"TabulĂ¡tor",enter:"Enter",shift:"Shift",ctrl:"Ctrl",alt:"Alt",pause:"Pauza",capslock:"Caps lock",escape:"Escape",pageUp:"StrĂ¡nka nahoru",pageDown:"StrĂ¡nka dolů",end:"Konec",home:"Domů",leftArrow:"Å ipka vlevo",
+upArrow:"Å ipka nahoru",rightArrow:"Å ipka vpravo",downArrow:"Å ipka dolů",insert:"Vložit","delete":"Smazat",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/js/ckeditor/plugins/a11yhelp/dialogs/lang/cy.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/cy.js
new file mode 100644
index 0000000..2b040a1
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/cy.js
@@ -0,0 +1,11 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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:"Tu mewn i'r deialog, pwyswch TAB i fynd i'r maes nesaf ar y deialog, pwyswch SHIFT + TAB i symud i faes blaenorol, pwyswch ENTER i gyflwyno'r deialog, pwyswch ESC i ddiddymu'r deialog. Ar gyfer deialogau sydd Ă¢ thudalennau aml-tab, pwyswch ALT + F10 i lywio'r tab-restr. Yna symudwch i'r tab nesaf gyda TAB neu SAETH DDE. Symudwch i dab blaenorol gyda SHIFT + TAB neu'r SAETH CHWITH. Pwyswch SPACE neu ENTER i ddewis y dudalen tab."},
+{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}"}]}],backspace:"Backspace",tab:"Tab",enter:"Enter",shift:"Shift",ctrl:"Ctrl",alt:"Alt",pause:"Pause",capslock:"Caps Lock",escape:"Escape",pageUp:"Page Up",pageDown:"Page Down",
+end:"End",home:"Home",leftArrow:"Left Arrow",upArrow:"Up Arrow",rightArrow:"Right Arrow",downArrow:"Down Arrow",insert:"Insert","delete":"Delete",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/js/ckeditor/plugins/a11yhelp/dialogs/lang/da.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/da.js
new file mode 100644
index 0000000..f0dfe0f
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/da.js
@@ -0,0 +1,11 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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:"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 next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
+{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:"Kommandoer",items:[{name:"Fortryd kommando",legend:"Klik pĂ¥ ${undo}"},{name:"Gentag kommando",legend:"Klik ${redo}"},{name:" Bold command",legend:"Klik ${bold}"},{name:" Italic command",legend:"Klik ${italic}"},{name:" Underline command",
+legend:"Klik ${underline}"},{name:" Link command",legend:"Klik ${link}"},{name:" Toolbar Collapse command",legend:"Klik ${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:"Kilk ${a11yHelp}"}]}],backspace:"Backspace",tab:"Tab",enter:"Enter",shift:"Shift",ctrl:"Ctrl",alt:"Alt",pause:"Pause",capslock:"Caps Lock",escape:"Escape",pageUp:"Page Up",pageDown:"Page Down",end:"End",home:"Home",leftArrow:"Venstre pil",upArrow:"Pil op",rightArrow:"Højre pil",downArrow:"Pil ned",insert:"Insert","delete":"Delete",leftWindowKey:"Venstre Windows tast",rightWindowKey:"Højre Windows tast",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:"Gange",add:"Plus",subtract:"Minus",decimalPoint:"Decimal Point",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:"Grave Accent",openBracket:"Start klamme",backSlash:"Omvendt skrĂ¥streg",closeBracket:"Slut klamme",singleQuote:"Enkelt citationstegn"}); \ No newline at end of file
diff --git a/js/ckeditor/plugins/a11yhelp/dialogs/lang/de.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/de.js
new file mode 100644
index 0000000..a35e480
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/de.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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:"Editor Symbolleiste",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:"Editor Dialog",legend:"Innerhalb des Dialogs drĂ¼cken Sie TAB um zum nächsten Dialogfeld zu gelangen, drĂ¼cken Sie SHIFT-TAG um zum vorherigen Feld zu wechseln, drĂ¼cken Sie ENTER um den Dialog abzusenden und ESC um den Dialog zu abzubrechen. Um zwischen den Reitern innerhalb eines Dialogs zu wechseln drĂ¼cken sie ALT-F10. Um zum nächsten Reiter zu gelangen können Sie TAB oder die rechte Pfeiltaste. ZurĂ¼ck gelangt man mit SHIFT-TAB oder der linken Pfeiltaste. Mit der Leertaste oder Enter kann man den Reiter auswählen."},
+{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 Listen",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:"Wiederholen Befehl",legend:"DrĂ¼cken Sie ${undo}"},{name:"RĂ¼ckgängig Befehl",legend:"DrĂ¼cken Sie ${redo}"},{name:"Fettschrift Befehl",
+legend:"DrĂ¼cken Sie ${bold}"},{name:"Italic Befehl",legend:"DrĂ¼cken Sie ${italic}"},{name:"Unterstreichung Befehl",legend:"DrĂ¼cken Sie ${underline}"},{name:"Link Befehl",legend:"DrĂ¼cken Sie ${link}"},{name:"Symbolleiste zuammenklappen 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}"}]}],backspace:"RĂ¼cklöschtaste",tab:"Tab",enter:"Eingabe",shift:"Umschalt",ctrl:"Strg",alt:"Alt",pause:"Pause",capslock:"Feststell",escape:"Escape",pageUp:"Bild auf",
+pageDown:"Bild ab",end:"Ende",home:"Pos1",leftArrow:"Linke Pfeiltaste",upArrow:"Obere Pfeiltaste",rightArrow:"Rechte Pfeiltaste",downArrow:"Untere Pfeiltaste",insert:"EinfĂ¼gen","delete":"Entfernen",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/js/ckeditor/plugins/a11yhelp/dialogs/lang/el.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/el.js
new file mode 100644
index 0000000..c066d66
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/el.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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 ή το ΔΕÎΙ ΒΕΛΑÎΙ. ΜποÏείτε να μεταβείτε στην Ï€ÏοηγοÏμενη καÏτέλα πατÏντας SHIFT + TAB ή το ΑΡΙΣΤΕΡΟ ΒΕΛΑÎΙ. Πατήστε ΔΙΑΣΤΗΜΑ ή ENTER για να επιλέξτε την καÏτέλα για Ï€Ïοβολή."},
+{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}"}]}],backspace:"Backspace",tab:"Tab",enter:"Enter",shift:"Shift",ctrl:"Ctrl",alt:"Alt",pause:"Pause",capslock:"Caps Lock",escape:"Escape",pageUp:"Page Up",pageDown:"Page Down",
+end:"End",home:"Home",leftArrow:"ΑÏιστεÏÏŒ Βέλος",upArrow:"Πάνω Βέλος",rightArrow:"Δεξί Βέλος",downArrow:"Îάτω Βέλος",insert:"Insert ","delete":"Delete",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/js/ckeditor/plugins/a11yhelp/dialogs/lang/en-gb.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/en-gb.js
new file mode 100644
index 0000000..2d158a0
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/en-gb.js
@@ -0,0 +1,11 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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 next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
+{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}"}]}],backspace:"Backspace",tab:"Tab",enter:"Enter",shift:"Shift",ctrl:"Ctrl",alt:"Alt",pause:"Pause",capslock:"Caps Lock",escape:"Escape",pageUp:"Page Up",pageDown:"Page Down",end:"End",home:"Home",leftArrow:"Left Arrow",upArrow:"Up Arrow",rightArrow:"Right Arrow",downArrow:"Down Arrow",insert:"Insert","delete":"Delete",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/js/ckeditor/plugins/a11yhelp/dialogs/lang/en.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/en.js
new file mode 100644
index 0000000..a68b39c
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/en.js
@@ -0,0 +1,11 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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 next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
+{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}"}]}],backspace:"Backspace",tab:"Tab",enter:"Enter",shift:"Shift",ctrl:"Ctrl",alt:"Alt",pause:"Pause",capslock:"Caps Lock",escape:"Escape",pageUp:"Page Up",pageDown:"Page Down",end:"End",home:"Home",leftArrow:"Left Arrow",upArrow:"Up Arrow",rightArrow:"Right Arrow",downArrow:"Down Arrow",insert:"Insert","delete":"Delete",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/js/ckeditor/plugins/a11yhelp/dialogs/lang/eo.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/eo.js
new file mode 100644
index 0000000..0b0b933
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/eo.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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 dialogkampo, premu la MAJUSKLIGAN + TABAN klavojn por reveni al la antaÅ­a kampo, premu la ENENklavon por sendi la dialogon, premu la ESKAPAN klavon por nuligi la dialogon. Por dialogoj kun pluraj retpaÄoj sub langetoj, premu ALT + F10 por navigi al la langetlisto. Poste moviÄu al la sekva langeto per la klavo TABA aÅ­ SAGO DEKSTREN. MoviÄu al la antaÅ­a langeto per la klavoj MAJUSKLIGA + TABA aÅ­ SAGO MALDEKSTREN. Premu la SPACETklavon aÅ­ la ENENklavon por selekti la langetretpaÄon."},
+{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}"}]}],backspace:"RetropaÅo",tab:"Tabo",enter:"Enigi",shift:"Registrumo",ctrl:"Stirklavo",alt:"Alt-klavo",pause:"PaÅ­zo",capslock:"Majuskla baskulo",escape:"Eskapa klavo",pageUp:"AntaÅ­a PaÄo",
+pageDown:"Sekva PaÄo",end:"Fino",home:"Hejmo",leftArrow:"Sago Maldekstren",upArrow:"Sago Supren",rightArrow:"Sago Dekstren",downArrow:"Sago Suben",insert:"Enmeti","delete":"Forigi",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/js/ckeditor/plugins/a11yhelp/dialogs/lang/es.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/es.js
new file mode 100644
index 0000000..507da4f
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/es.js
@@ -0,0 +1,12 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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 de un cuadro de diĂ¡logo, presione la tecla TAB para desplazarse al campo siguiente del cuadro de diĂ¡logo, pulse SHIFT + TAB para desplazarse al campo anterior, pulse ENTER para presentar cuadro de diĂ¡logo, pulse la tecla ESC para cancelar el diĂ¡logo. Para los diĂ¡logos que tienen varias pĂ¡ginas, presione ALT + F10 para navegar a la pestaña de la lista. Luego pasar a la siguiente pestaña con TAB o FLECHA DERECHA. Para ir a la ficha anterior con SHIFT + TAB o FLECHA IZQUIERDA. Presione ESPACIO o ENTRAR para seleccionar la pĂ¡gina de ficha."},
+{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}"}]}],backspace:"Backspace",tab:"Tab",enter:"Enter",shift:"MayĂºs.",ctrl:"Ctrl",alt:"Alt",pause:"Pausa",capslock:"Bloq. MayĂºs.",escape:"Escape",pageUp:"Page Up",
+pageDown:"Page Down",end:"End",home:"Home",leftArrow:"Left Arrow",upArrow:"Up Arrow",rightArrow:"Right Arrow",downArrow:"Down Arrow",insert:"Insert","delete":"Delete",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:"Abrir llave",backSlash:"Backslash",closeBracket:"Cerrar llave",singleQuote:"Comillas simples"}); \ No newline at end of file
diff --git a/js/ckeditor/plugins/a11yhelp/dialogs/lang/et.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/et.js
new file mode 100644
index 0000000..2dc5697
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/et.js
@@ -0,0 +1,11 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","et",{title:"Accessibility Instructions",contents:"Abi sisu. Selle dialoogi sulgemiseks vajuta ESC klahvi.",legend:[{name:"Ăœldine",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 next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
+{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}"}]}],backspace:"Backspace",tab:"Tab",enter:"Enter",shift:"Shift",ctrl:"Ctrl",alt:"Alt",pause:"Pause",capslock:"Caps Lock",escape:"Escape",pageUp:"Page Up",pageDown:"Page Down",end:"End",home:"Home",leftArrow:"Left Arrow",upArrow:"Up Arrow",rightArrow:"Right Arrow",downArrow:"Down Arrow",insert:"Insert","delete":"Delete",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/js/ckeditor/plugins/a11yhelp/dialogs/lang/fa.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/fa.js
new file mode 100644
index 0000000..81b3e79
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/fa.js
@@ -0,0 +1,11 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","fa",{title:"دستورالعمل‌های دسترسی",contents:"راهنمای Ùهرست مطالب. برای بستن این کادر محاوره‌ای ESC را Ùشار دهید.",legend:[{name:"عمومی",items:[{name:"نوار ابزار ویرایشگر",legend:"${toolbarFocus} را برای باز کردن نوار ابزار بÙشارید. با کلید Tab Ùˆ Shif-Tab در مجموعه نوار ابزار بعدی Ùˆ قبلی حرکت کنید. برای حرکت در کلید نوار ابزار قبلی Ùˆ بعدی با کلید جهت‌نمای راست Ùˆ Ú†Ù¾ جابجا شوید. کلید Space یا Enter را برای Ùعال کردن کلید نوار ابزار بÙشارید."},{name:"پنجره محاورهای ویرایشگر",
+legend:"در داخل یک پنجره محاورهای، کلید Tab را بÙشارید تا به پنجرهی بعدی بروید، Shift+Tab برای حرکت به Ùیلد قبلی، Ùشردن Enter برای ثبت اطلاعات پنجره، Ùشردن Esc برای لغو پنجره محاورهای Ùˆ برای پنجرههایی Ú©Ù‡ چندین برگه دارند، Ùشردن Alt+F10 جهت رÙتن به Tab-List. در نهایت حرکت به برگه بعدی با Tab یا کلید جهتنمای راست. حرکت به برگه قبلی با Shift+Tab یا کلید جهتنمای Ú†Ù¾. Ùشردن Space یا Enter برای انتخاب یک برگه."},{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}"}]}],backspace:"عقبگرد",tab:"برگه",enter:"ورود",shift:"تعویض",ctrl:"کنترل",alt:"دگرساز",pause:"توقÙ",capslock:"Caps Lock",escape:"گریز",pageUp:"صÙحه به بالا",pageDown:"صÙحه به پایین",end:"پایان",home:"خانه",leftArrow:"پیکان Ú†Ù¾",
+upArrow:"پیکان بالا",rightArrow:"پیکان راست",downArrow:"پیکان پایین",insert:"Insert","delete":"Delete",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:"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/js/ckeditor/plugins/a11yhelp/dialogs/lang/fi.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/fi.js
new file mode 100644
index 0000000..cc73490
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/fi.js
@@ -0,0 +1,12 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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:"Dialogin sisällä, painamalla TAB siirryt seuraavaan dialogin kenttään, painamalla SHIFT+TAB siirryt aiempaan kenttään, painamalla ENTER lähetät dialogin, painamalla ESC peruutat dialogin. Dialogeille joissa on useita välilehtiä, paina ALT+F10 siirtyäksesi välillehtilistaan. Siirtyäksesi seuraavaan välilehteen paina TAB tai NUOLI OIKEALLE. Siirry edelliseen välilehteen painamalla SHIFT+TAB tai nuoli vasemmalle. Paina VÄLILYÖNTI tai ENTER valitaksesi välilehden."},{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}"}]}],backspace:"Backspace",tab:"Tab",enter:"Enter",shift:"Shift",ctrl:"Ctrl",alt:"Alt",pause:"Pause",capslock:"Caps Lock",escape:"Escape",pageUp:"Page Up",pageDown:"Page Down",
+end:"End",home:"Home",leftArrow:"Left Arrow",upArrow:"Up Arrow",rightArrow:"Right Arrow",downArrow:"Down Arrow",insert:"Insert","delete":"Delete",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/js/ckeditor/plugins/a11yhelp/dialogs/lang/fr-ca.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/fr-ca.js
new file mode 100644
index 0000000..5d7061b
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/fr-ca.js
@@ -0,0 +1,12 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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:"A l'intérieur d'un dialogue, appuyer sur la touche TAB pour naviguer jusqu'au champ de dalogue suivant, appuyez sur les touches SHIFT + TAB pour revenir au champ précédent, appuyez sur la touche ENTRER pour soumettre le dialogue, appuyer sur la touche ESC pour annuler le dialogue. Pour les dialogues avec plusieurs pages d'onglets, appuyer sur ALT + F10 pour naviguer jusqu'à la liste des onglets. Puis se déplacer vers l'onglet suivant avec la touche TAB ou FLECHE DROITE. Se déplacer vers l'onglet précédent avec les touches SHIFT + TAB ou FLECHE GAUCHE. Appuyer sur la barre d'espace ou la touche ENTRER pour sélectionner la page de l'onglet."},
+{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}"}]}],backspace:"Backspace",tab:"Tab",enter:"Enter",shift:"Shift",ctrl:"Ctrl",alt:"Alt",pause:"Pause",capslock:"Caps Lock",escape:"Escape",pageUp:"Page Up",pageDown:"Page Down",end:"End",home:"Home",
+leftArrow:"Left Arrow",upArrow:"Up Arrow",rightArrow:"Right Arrow",downArrow:"Down Arrow",insert:"Insert","delete":"Delete",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/js/ckeditor/plugins/a11yhelp/dialogs/lang/fr.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/fr.js
new file mode 100644
index 0000000..e65d98f
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/fr.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","fr",{title:"Instructions d'accessibilité",contents:"Contenu de l'aide. Pour fermer ce dialogue, appuyez sur la touche Ech (Echappement).",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 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:"A l'intérieur d'un dialogue, appuyer sur la touche TAB pour naviguer jusqu'au champ de dalogue suivant, appuyez sur les touches SHIFT + TAB pour revenir au champ précédent, appuyez sur la touche ENTRER pour soumettre le dialogue, appuyer sur la touche ESC pour annuler le dialogue. Pour les dialogues avec plusieurs pages d'onglets, appuyer sur ALT + F10 pour naviguer jusqu'à la liste des onglets. Puis se déplacer vers l'onglet suivant avec la touche TAB ou FLECHE DROITE. Se déplacer vers l'onglet précédent avec les touches SHIFT + TAB ou FLECHE GAUCHE. Appuyer sur la barre d'espace ou la touche ENTRER pour sélectionner la page de l'onglet."},
+{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 Ech ou FLECHE GAUCHE. Fermer le menu contextuel avec Ech."},
+{name:"Zone de liste de l'éditeur",legend:"Dans la 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 MAJ + 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 MAJ+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 la commande",legend:"Appuyer sur ${undo}"},{name:"Refaire la commande",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:"Accéder à la précédente commande d'espace de mise au point",
+legend:"Appuyez sur ${accessPreviousSpace} pour accéder à l'espace hors d'atteinte le plus proche avant le caret, par exemple: deux éléments HR adjacents. Répétez la combinaison de touches pour atteindre les espaces de mise au point distants."},{name:"Accès à la prochaine commande de l'espace de mise au point",legend:"Appuyez sur ${accessNextSpace} pour accéder au plus proche espace de mise au point hors d'atteinte après le caret, par exemple: deux éléments HR adjacents. répétez la combinaison de touches pour atteindre les espace de mise au point distants."},
+{name:" Aide Accessibilité",legend:"Appuyer sur ${a11yHelp}"}]}],backspace:"Retour arrière",tab:"Tabulation",enter:"Entrée",shift:"Majuscule",ctrl:"Ctrl",alt:"Alt",pause:"Pause",capslock:"Verr. Maj.",escape:"Echap",pageUp:"Page supérieure",pageDown:"Page inférieure",end:"Fin",home:"Retour",leftArrow:"Flèche gauche",upArrow:"Flèche haute",rightArrow:"Flèche droite",downArrow:"Flèche basse",insert:"Insertion","delete":"Supprimer",leftWindowKey:"Touche Windows gauche",rightWindowKey:"Touche Windows droite",
+selectKey:"Touche menu",numpad0:"Pavé numérique 0",numpad1:"Pavé numérique 1",numpad2:"Pavé numérique 2",numpad3:"Pavé numérique 3",numpad4:"Pavé numérique 4",numpad5:"Pavé numérique 5",numpad6:"Pavé numérique 6",numpad7:"Pavé numérique 7",numpad8:"Pavé numérique 8",numpad9:"Pavé numérique 9",multiply:"Multiplier",add:"Addition",subtract:"Soustraire",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:"Verrouillage numĂ©rique",scrollLock:"ArrĂªt dĂ©filement",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/js/ckeditor/plugins/a11yhelp/dialogs/lang/gl.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/gl.js
new file mode 100644
index 0000000..5fb9a0b
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/gl.js
@@ -0,0 +1,12 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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 dun cadro de diĂ¡logo, prema a tecla TAB para desprazarse ao campo seguinte do cadro de diĂ¡logo, prema MAIĂS + TAB para desprazarse ao campo anterior, prema INTRO para presentar o cadro de diĂ¡logo, prema a tecla ESC para cancelar o diĂ¡logo. Para os diĂ¡logos que teñen varias pĂ¡xinas, prema ALT + F10 para navegar Ă¡ lapela da lista. Despois pasar Ă¡ seguinte lapela con TAB ou FRECHA DEREITA. Para ir Ă¡ lapela anterior con SHIFT + TAB ou FRECHA ESQUERDA. Prema ESPAZO ou INTRO para seleccionar a lapela da pĂ¡xina."},
+{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}"}]}],backspace:"Ir atrĂ¡s",tab:"Tabulador",enter:"Intro",shift:"MaiĂºs",ctrl:"Ctrl",alt:"Alt",pause:"Pausa",capslock:"Bloq. MaiĂºs",escape:"Escape",pageUp:"PĂ¡xina arriba",pageDown:"PĂ¡xina abaixo",end:"Fin",home:"Inicio",
+leftArrow:"Frecha esquerda",upArrow:"Frecha arriba",rightArrow:"Frecha dereita",downArrow:"Frecha abaixo",insert:"Inserir","delete":"Supr",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/js/ckeditor/plugins/a11yhelp/dialogs/lang/gu.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/gu.js
new file mode 100644
index 0000000..b731a88
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/gu.js
@@ -0,0 +1,11 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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 next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
+{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}"}]}],backspace:"Backspace",tab:"Tab",enter:"Enter",shift:"Shift",ctrl:"Ctrl",alt:"Alt",pause:"Pause",capslock:"Caps Lock",escape:"Escape",pageUp:"Page Up",pageDown:"Page Down",end:"End",home:"Home",leftArrow:"Left Arrow",upArrow:"Up Arrow",rightArrow:"Right Arrow",downArrow:"Down Arrow",insert:"Insert","delete":"Delete",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/js/ckeditor/plugins/a11yhelp/dialogs/lang/he.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/he.js
new file mode 100644
index 0000000..5f87d21
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/he.js
@@ -0,0 +1,11 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","he",{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:"תפריט ההקשר (Context Menu)",legend:"לחץ ${contextMenu} ×ו APPLICATION KEYכדי לפתוח ×ת תפריט ההקשר. עבור ל×פשרות הב××” ×¢× ×˜×ב (TAB) ×ו ×—×¥ ל×טה. עבור ל×פשרות הקוד×ת ×¢× ×©×™×¤×˜ (SHIFT) + ט×ב (TAB) ×ו ×—×¥ ל×עלה. לחץ רווח ×ו ×נטר (ENTER) כדי לבחור ×ת ×”×פשרות. פתח ×ת תת התפריט (Sub-menu) של ×”×פשרות הנוכחית ×¢× ×¨×•×•×— ×ו ×נטר (ENTER) ×ו ×—×¥ ש××לי. חזור לתפריט ×”×ב ×¢× ×סקייפ (ESC) ×ו ×—×¥ ש××לי. סגור ×ת תפריט ההקשר ×¢× ×סקייפ (ESC)."},{name:"×ª×¤×¨×™×˜×™× ×¦×¤×™× (List boxes)",legend:"×‘×ª×•× ×ª×¤×¨×™×˜ צף, עבור לפריט ×”×‘× ×¢× ×˜×ב (TAB) ×ו ×—×¥ ל×טה. עבור לתפריט ×”×§×•×“× ×¢× ×©×™×¤×˜ (SHIFT) + ט×ב (TAB) or ×—×¥ עליון. 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}"}]}],backspace:"Backspace",tab:"Tab",enter:"Enter",shift:"Shift",ctrl:"Ctrl",alt:"Alt",pause:"Pause",capslock:"Caps Lock",escape:"Escape",pageUp:"Page Up",pageDown:"Page Down",end:"End",home:"Home",leftArrow:"×—×¥ ש××לה",upArrow:"×—×¥ ל×עלה",rightArrow:"×—×¥ ×™××™× ×”",downArrow:"×—×¥ ל×טה",insert:"הכנס","delete":"×חק",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/js/ckeditor/plugins/a11yhelp/dialogs/lang/hi.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/hi.js
new file mode 100644
index 0000000..ef50a4b
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/hi.js
@@ -0,0 +1,11 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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 next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
+{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}"}]}],backspace:"Backspace",tab:"Tab",enter:"Enter",shift:"Shift",ctrl:"Ctrl",alt:"Alt",pause:"Pause",capslock:"Caps Lock",escape:"Escape",pageUp:"Page Up",pageDown:"Page Down",end:"End",home:"Home",leftArrow:"Left Arrow",upArrow:"Up Arrow",rightArrow:"Right Arrow",downArrow:"Down Arrow",insert:"Insert","delete":"Delete",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/js/ckeditor/plugins/a11yhelp/dialogs/lang/hr.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/hr.js
new file mode 100644
index 0000000..5c8954f
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/hr.js
@@ -0,0 +1,11 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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 za navigaciju do sljedećeg polja, pritisnite SHIFT + TAB za vraćanje na prethodno polje, pritisnite ENTER za slanje dijaloga ili ESC za zatvaranje dijaloga. Za dijaloge koji imaju višestruke kartice, pritisnite ALT + F10 za na navigaciju i zatim TAB ili lijeva strelica kursora ili SHIFT + TAB i desna strelica kursora. SPACE ili ENTER odabiru karticu."},{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:"Access previous focus space naredba",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:"Access next focus space naredba",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}"}]}],backspace:"Backspace",tab:"Tab",enter:"Enter",shift:"Shift",ctrl:"Ctrl",alt:"Alt",pause:"Pause",capslock:"Caps Lock",escape:"Escape",pageUp:"Page Up",pageDown:"Page Down",end:"End",home:"Home",leftArrow:"Left Arrow",
+upArrow:"Up Arrow",rightArrow:"Right Arrow",downArrow:"Down Arrow",insert:"Insert","delete":"Delete",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/js/ckeditor/plugins/a11yhelp/dialogs/lang/hu.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/hu.js
new file mode 100644
index 0000000..5cda07c
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/hu.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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 hogy a fĂ¼lekre ugorjon. EzutĂ¡n a TAB-al vagy a JOBB NYĂLLAL a következÅ‘ fĂ¼lre ugorhat. Az elÅ‘zÅ‘ fĂ¼lre ugrĂ¡shoz hasznĂ¡lja a SHIFT + TAB-ot vagy a BAL NYILAT. Nyomjon SPACE-t vagy ENTER-t hogy kijelölje a fĂ¼let."},
+{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}"}]}],backspace:"Backspace",tab:"Tab",enter:"Enter",shift:"Shift",ctrl:"Ctrl",alt:"Alt",pause:"Pause",capslock:"Caps Lock",escape:"Escape",pageUp:"Page Up",pageDown:"Page Down",
+end:"End",home:"Home",leftArrow:"balra nyĂ­l",upArrow:"felfelĂ© nyĂ­l",rightArrow:"jobbra nyĂ­l",downArrow:"lefelĂ© nyĂ­l",insert:"Insert","delete":"Delete",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/js/ckeditor/plugins/a11yhelp/dialogs/lang/id.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/id.js
new file mode 100644
index 0000000..d0b62f4
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/id.js
@@ -0,0 +1,11 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","id",{title:"Accessibility Instructions",contents:"Bantuan. Tekan ESC untuk menutup dialog ini.",legend:[{name:"Umum",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 next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
+{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}"}]}],backspace:"Backspace",tab:"Tab",enter:"Enter",shift:"Shift",ctrl:"Ctrl",alt:"Alt",pause:"Pause",capslock:"Caps Lock",escape:"Escape",pageUp:"Page Up",pageDown:"Page Down",end:"End",home:"Home",leftArrow:"Left Arrow",upArrow:"Up Arrow",rightArrow:"Right Arrow",downArrow:"Down Arrow",insert:"Insert","delete":"Delete",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/js/ckeditor/plugins/a11yhelp/dialogs/lang/it.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/it.js
new file mode 100644
index 0000000..c542d15
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/it.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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:"Premi ${toolbarFocus} per navigare fino alla barra degli strumenti. Muoviti tra i gruppi della barra degli strumenti con i tasti Tab e Maiusc-Tab. Spostati tra il successivo ed il precedente pulsante della barra degli strumenti usando le frecce direzionali Destra e Sinistra. Premi Spazio o Invio per attivare il pulsante della barra degli strumenti."},
+{name:"Finestra Editor",legend:"All'interno di una finestra di dialogo, premi Tab per navigare fino al campo successivo della finestra di dialogo, premi Maiusc-Tab per tornare al campo precedente, premi Invio per inviare la finestra di dialogo, premi Esc per uscire. Per le finestre che hanno schede multiple, premi Alt+F10 per navigare nella lista delle schede. Quindi spostati alla scheda successiva con il tasto Tab oppure con la Freccia Destra. Torna alla scheda precedente con Maiusc+Tab oppure con la Freccia Sinistra. Premi Spazio o Invio per scegliere la scheda."},
+{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:"Dentro un box-lista, muoviti al prossimo elemento della lista con TAB o con la Freccia direzionale giĂ¹. Spostati all'elemento precedente con MAIUSC+TAB oppure con Freccia direzionale sopra. Premi SPAZIO o INVIO per scegliere l'opzione della lista. Premi ESC per chiudere il box-lista."},{name:"Barra percorso elementi editor",legend:"Premi ${elementsPathFocus} per navigare tra gli elementi della barra percorso. Muoviti al prossimo pulsante di elemento con TAB o la Freccia direzionale destra. Muoviti al pulsante precedente con MAIUSC+TAB o la Freccia Direzionale Sinistra. Premi SPAZIO o INVIO per scegliere 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}"}]}],backspace:"Backspace",tab:"Tab",enter:"Invio",shift:"Maiusc",ctrl:"Ctrl",alt:"Alt",pause:"Pausa",capslock:"Bloc Maiusc",escape:"Esc",pageUp:"Pagina sĂ¹",pageDown:"Pagina giĂ¹",
+end:"Fine",home:"Inizio",leftArrow:"Freccia sinistra",upArrow:"Freccia su",rightArrow:"Freccia destra",downArrow:"Freccia giĂ¹",insert:"Ins","delete":"Canc",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/js/ckeditor/plugins/a11yhelp/dialogs/lang/ja.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/ja.js
new file mode 100644
index 0000000..8114784
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/ja.js
@@ -0,0 +1,9 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","ja",{title:"ăƒ¦ăƒ¼ă‚¶ăƒ¼è£œå©ă®èª¬æ˜",contents:"ăƒ˜ăƒ«ăƒ—ă€€ă“ă®ăƒ€ă‚¤ă‚¢ăƒ­ă‚°ă‚’é–‰ă˜ă‚‹ă«ă¯ ESCă‚’æ¼ă—ă¦ăă ă•ă„。",legend:[{name:"全般",items:[{name:"ă‚¨ăƒ‡ă‚£ă‚¿ăƒ¼ăƒ„ăƒ¼ăƒ«ăƒăƒ¼",legend:"${toolbarFocus} ă‚’æ¼ă™ă¨ăƒ„ăƒ¼ăƒ«ăƒăƒ¼ă®ă‚ªăƒ³/ă‚ªăƒ•æ“作ăŒă§ăă¾ă™ă€‚ă‚«ăƒ¼ă‚½ăƒ«ă‚’ăƒ„ăƒ¼ăƒ«ăƒăƒ¼ă®ă‚°ăƒ«ăƒ¼ăƒ—ă§ç§»å‹•ă•ă›ă‚‹ă«ă¯Tabă‹SHIFT+Tabă‚’æ¼ă—ă¾ă™ă€‚ă‚°ăƒ«ăƒ¼ăƒ—å†…ă§ă‚«ăƒ¼ă‚½ăƒ«ă‚’移動ă•ă›ă‚‹ă«ă¯ă€å³ă‚«ăƒ¼ă‚½ăƒ«ă‹å·¦ă‚«ăƒ¼ă‚½ăƒ«ă‚’æ¼ă—ă¾ă™ă€‚ă‚¹ăƒăƒ¼ă‚¹ă‚­ăƒ¼ă‚„ă‚¨ăƒ³ă‚¿ăƒ¼ă‚’æ¼ă™ă¨ăƒœă‚¿ăƒ³ă‚’有å¹/ç„¡å¹ă«ă™ă‚‹ă“ă¨ăŒă§ăă¾ă™ă€‚"},{name:"ç·¨é›†ăƒ€ă‚¤ă‚¢ăƒ­ă‚°",legend:"ăƒ€ă‚¤ăƒ¤ăƒ­ă‚°å†…ă§ă¯ă€ăƒ€ă‚¤ă‚¢ăƒ­ă‚°ă®æ¬¡ă®é¸æè‚¢ă«ç§»å‹•ă™ă‚‹ă«ă¯Tabă‚’æ¼ă—ă¾ă™ă€‚å‰ă®é¸æè‚¢ă«ç§»å‹•ă™ă‚‹ă«ă¯ă€SHIFT+Tabă‚’æ¼ă—ă¾ă™ă€‚ăƒ€ă‚¤ă‚¢ăƒ­ă‚°ă‚’æ±ºå®ă™ă‚‹ă«ă¯ă€ENTERă‚’æ¼ă—ă¾ă™ă€‚ESCă§ăƒ€ă‚¤ă‚¢ăƒ­ă‚°ă‚’ă‚­ăƒ£ăƒ³ă‚»ăƒ«ă§ăă¾ă™ă€‚複数ă®ă‚¿ăƒ–ăŒă‚ă‚‹ăƒ€ă‚¤ă‚¢ăƒ­ă‚°ă§ă¯ă‚¿ăƒ–ăƒªă‚¹ăƒˆă‚’æ“作ă™ă‚‹ă«ă¯ALT+F10ă‚’æ¼ă—ă¾ă™ă€‚次ă®ă‚¿ăƒ–ă«ç§»å‹•ă™ă‚‹ă«ă¯Tabă‹å³ă‚«ăƒ¼ă‚½ăƒ«ă€å‰ă®ă‚¿ăƒ–ă«æˆ»ă‚‹ă«ă¯SHIFT+Tabă‹å·¦ă‚«ăƒ¼ă‚½ăƒ«ă§ă™ă€‚ă‚¿ăƒ–ăƒăƒ¼ă‚¸ă‚’決å®ă™ă‚‹ă«ă¯ă‚¹ăƒăƒ¼ă‚¹ă‚‚ă—ăă¯ă€ENTERă‚­ăƒ¼ă‚’æ¼ă—ă¦ăă ă•ă„。"},
+{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} ă‚’ă‚¯ăƒªăƒƒă‚¯"}]}],backspace:"Backspace",tab:"Tab",enter:"Enter",shift:"Shift",ctrl:"Ctrl",alt:"Alt",pause:"Pause",capslock:"Caps Lock",escape:"Escape",pageUp:"Page Up",pageDown:"Page Down",end:"End",home:"Home",leftArrow:"左矢å°",upArrow:"ä¸çŸ¢å°",rightArrow:"å³çŸ¢å°",downArrow:"下矢å°",insert:"Insert","delete":"Delete",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/js/ckeditor/plugins/a11yhelp/dialogs/lang/km.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/km.js
new file mode 100644
index 0000000..1b32ae4
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/km.js
@@ -0,0 +1,11 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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 next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
+{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}"}]}],backspace:"á›á»á”áá™á€áŸ’áោá™",tab:"Tab",enter:"Enter",shift:"Shift",ctrl:"Ctrl",alt:"Alt",pause:"á•áŸ’á¢á¶á€",capslock:"Caps Lock",escape:"á…á¶á€á…áŸá‰",pageUp:"á‘ំá–áŸá​á›á¾",pageDown:"á‘ំá–áŸá​á€áŸ’áោá˜",end:"á…á»á„",home:"á•áŸ’á‘ះ",leftArrow:"á–្áá½á‰â€‹á†áŸ’áœáŸá„",upArrow:"á–្áá½á‰â€‹á›á¾",rightArrow:"á–្áá½á‰â€‹áŸáŸ’áá¶áŸ†",downArrow:"á–្áá½á‰â€‹á€áŸ’áោá˜",insert:"á”á‰áŸ’á…á¼á›","delete":"á›á»á”",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/js/ckeditor/plugins/a11yhelp/dialogs/lang/ko.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/ko.js
new file mode 100644
index 0000000..9dbb19f
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/ko.js
@@ -0,0 +1,11 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","ko",{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:"í¸́§‘기 다́´́–¼ë¡œê·¸",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
+{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:" 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}"}]}],backspace:"Backspace",tab:"Tab",enter:"Enter",shift:"Shift",ctrl:"Ctrl",alt:"Alt",pause:"Pause",capslock:"Caps Lock",escape:"Escape",pageUp:"Page Up",pageDown:"Page Down",end:"End",home:"Home",leftArrow:"Left Arrow",upArrow:"Up Arrow",rightArrow:"Right Arrow",downArrow:"Down Arrow",insert:"Insert","delete":"Delete",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/js/ckeditor/plugins/a11yhelp/dialogs/lang/ku.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/ku.js
new file mode 100644
index 0000000..d3729c9
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/ku.js
@@ -0,0 +1,12 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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 یان کلیلی تیری دەستی ڕاست. بۆچوونە بازدەری تابی Ù¾Ûشوو داگرتنی کلیلی SHIFT + TAB یان کلیلی تیری دەستی Ú†Û•Ù¾. کلیی کلیلی SPACE یان ENTER بۆ هه‌ڵبژاردنی بازدەر (تاب)."},
+{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}"}]}],backspace:"Backspace",tab:"Tab",enter:"Enter",shift:"Shift",ctrl:"Ctrl",alt:"Alt",pause:"Pause",capslock:"Caps Lock",escape:"Escape",pageUp:"Page Up",pageDown:"Page Down",end:"End",home:"Home",leftArrow:"Left Arrow",
+upArrow:"Up Arrow",rightArrow:"Right Arrow",downArrow:"Down Arrow",insert:"Insert","delete":"Delete",leftWindowKey:"پەنجەرەی چەپ",rightWindowKey:"پەنجەرەی ڕاست",selectKey:"Select",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:"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/js/ckeditor/plugins/a11yhelp/dialogs/lang/lt.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/lt.js
new file mode 100644
index 0000000..18f95be
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/lt.js
@@ -0,0 +1,11 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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 next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
+{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}"}]}],backspace:"Backspace",tab:"Tab",enter:"Enter",shift:"Shift",ctrl:"Ctrl",alt:"Alt",pause:"Pause",capslock:"Caps Lock",escape:"Escape",pageUp:"Page Up",pageDown:"Page Down",end:"End",home:"Home",leftArrow:"Left Arrow",upArrow:"Up Arrow",rightArrow:"Right Arrow",downArrow:"Down Arrow",insert:"Insert","delete":"Delete",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/js/ckeditor/plugins/a11yhelp/dialogs/lang/lv.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/lv.js
new file mode 100644
index 0000000..faa05a2
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/lv.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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:"Dialoga logÄ nospiediet pogu TAB lai pÄrvietotos uz nÄkoÅ¡o dialoga loga lauku, nospiediet SHIFT+TAB lai atgrieztos iepriekÅ¡Ä“jÄ laukÄ, nospiediet ENTER lai apstiprinÄtu dialoga datus, nospiediet ESC lai aizvÄ“rtu Å¡o dialogu. Dialogam kuram ir vairÄkas cilnes, nospiediet ALT+F10 lai pÄrvietotos uz nepiecieÅ¡amo cilni. Lai pÄrvietotos uz nÄkoÅ¡o cilni izmantojiet pogu TAB vai Labo bultiņu. Lai pÄrvietotos uz iepriekÅ¡Ä“jo cilni nospiediet SHIFT+TAB vai kreiso bultiņu. Nospiediet SPACE vai ENTER lai izvÄ“lÄ“tos lapas cilni."},
+{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}"}]}],backspace:"Backspace",tab:"Tab",enter:"Enter",shift:"Shift",ctrl:"Ctrl",alt:"Alt",pause:"Pause",capslock:"Caps Lock",escape:"Escape",pageUp:"Page Up",pageDown:"Page Down",end:"End",home:"Home",leftArrow:"Left Arrow",upArrow:"Up Arrow",rightArrow:"Right Arrow",downArrow:"Down Arrow",insert:"Insert","delete":"Delete",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/js/ckeditor/plugins/a11yhelp/dialogs/lang/mk.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/mk.js
new file mode 100644
index 0000000..19eeec7
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/mk.js
@@ -0,0 +1,11 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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 next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},{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}"}]}],backspace:"Backspace",tab:"Tab",enter:"Enter",shift:"Shift",ctrl:"Ctrl",alt:"Alt",pause:"Pause",capslock:"Caps Lock",escape:"Escape",pageUp:"Page Up",pageDown:"Page Down",end:"End",home:"Home",leftArrow:"Left Arrow",
+upArrow:"Up Arrow",rightArrow:"Right Arrow",downArrow:"Down Arrow",insert:"Insert","delete":"Delete",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/js/ckeditor/plugins/a11yhelp/dialogs/lang/mn.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/mn.js
new file mode 100644
index 0000000..8be11f8
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/mn.js
@@ -0,0 +1,11 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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 next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
+{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}"}]}],backspace:"Backspace",tab:"Tab",enter:"Enter",shift:"Shift",ctrl:"Ctrl",alt:"Alt",pause:"Pause",capslock:"Caps Lock",escape:"Escape",pageUp:"Page Up",pageDown:"Page Down",end:"End",home:"Home",leftArrow:"Left Arrow",upArrow:"Up Arrow",rightArrow:"Right Arrow",downArrow:"Down Arrow",insert:"Insert","delete":"Delete",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/js/ckeditor/plugins/a11yhelp/dialogs/lang/nb.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/nb.js
new file mode 100644
index 0000000..575362e
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/nb.js
@@ -0,0 +1,12 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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 dialogfelt, press SHIFT + TAB for Ă¥ flytte til forrige felt, trykk ENTER for Ă¥ akseptere dialogen, trykk ESC for Ă¥ avbryte dialogen. For dialoger med flere faner, trykk ALT + F10 for Ă¥ navigere til listen over faner. GĂ¥ til neste fane med TAB eller HĂ˜YRE PILTAST. GĂ¥ til forrige fane med SHIFT + TAB eller VENSTRE PILTAST. Trykk MELLOMROM eller ENTER for Ă¥ velge fanen."},{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}"}]}],backspace:"Backspace",tab:"Tabulator",enter:"Enter",shift:"Shift",ctrl:"Ctrl",alt:"Alt",pause:"Pause",capslock:"Caps Lock",escape:"Escape",pageUp:"Page Up",
+pageDown:"Page Down",end:"End",home:"Home",leftArrow:"Venstre piltast",upArrow:"Opp-piltast",rightArrow:"Høyre piltast",downArrow:"Ned-piltast",insert:"Insert","delete":"Delete",leftWindowKey:"Venstre Windows-tast",rightWindowKey:"Høyre Windows-tast",selectKey:"Select key",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:"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:"Semikolon",equalSign:"Likhetstegn",comma:"Komma",dash:"Bindestrek",period:"Punktum",forwardSlash:"Forover skrĂ¥strek",graveAccent:"Grave Accent",openBracket:"Open Bracket",backSlash:"Bakover skrĂ¥strek",
+closeBracket:"Close Bracket",singleQuote:"Single Quote"}); \ No newline at end of file
diff --git a/js/ckeditor/plugins/a11yhelp/dialogs/lang/nl.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/nl.js
new file mode 100644
index 0000000..31cb631
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/nl.js
@@ -0,0 +1,12 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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. Voor dialoogvensters met meerdere tabbladen, druk op ALT+F10 om naar de tabset te navigeren. Schakel naar het volgende tabblad met TAB of PIJL RECHTS. Schakel naar het vorige tabblad met SHIFT+TAB of PIJL LINKS. Druk op SPATIE of ENTER om het tabblad te selecteren."},
+{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}"}]}],backspace:"Backspace",tab:"Tab",enter:"Enter",shift:"Shift",ctrl:"Ctrl",alt:"Alt",pause:"Pause",capslock:"Caps Lock",escape:"Escape",pageUp:"Page Up",pageDown:"Page Down",
+end:"End",home:"Home",leftArrow:"Pijl naar links",upArrow:"Pijl omhoog",rightArrow:"Pijl naar rechts",downArrow:"Pijl naar beneden",insert:"Invoegen","delete":"Verwijderen",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/js/ckeditor/plugins/a11yhelp/dialogs/lang/no.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/no.js
new file mode 100644
index 0000000..f3451ed
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/no.js
@@ -0,0 +1,11 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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:"Mens du er i en dialog, trykk TAB for Ă¥ navigere til neste dialogfelt, press SHIFT + TAB for Ă¥ flytte til forrige felt, trykk ENTER for Ă¥ akseptere dialogen, trykk ESC for Ă¥ avbryte dialogen. For dialoger med flere faner, trykk ALT + F10 for Ă¥ navigere til listen over faner. GĂ¥ til neste fane med TAB eller HĂ˜YRE PILTAST. GĂ¥ til forrige fane med SHIFT + TAB eller VENSTRE PILTAST. Trykk MELLOMROM eller ENTER for Ă¥ velge fanen."},{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}"}]}],backspace:"Backspace",tab:"Tab",enter:"Enter",shift:"Shift",ctrl:"Ctrl",alt:"Alt",pause:"Pause",capslock:"Caps Lock",escape:"Escape",pageUp:"Page Up",pageDown:"Page Down",
+end:"End",home:"Home",leftArrow:"Left Arrow",upArrow:"Up Arrow",rightArrow:"Right Arrow",downArrow:"Down Arrow",insert:"Insert","delete":"Delete",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/js/ckeditor/plugins/a11yhelp/dialogs/lang/pl.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/pl.js
new file mode 100644
index 0000000..723eaf7
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/pl.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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:"WciÅ›nij ${toolbarFocus} aby 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 narzÄ™dzia używajÄ…c STRZAÅKI W PRAWO lub STRZAÅKI W LEWO. WciÅ›nij SPACJĘ lub ENTER, aby aktywować zaznaczone narzÄ™dzie."},
+{name:"Okno dialogowe edytora",legend:"BÄ™dÄ…c w oknie dialogowym wciÅ›nij TAB aby przejść do nastÄ™pnego pola dialogowego, wciÅ›nij SHIFT + TAB aby przejść do poprzedniego pola, wciÅ›nij ENTER aby wysÅ‚ać dialog, wciÅ›nij ESC aby anulować dialog. Dla okien dialogowych z wieloma zakÅ‚adkami, wciÅ›nij ALT + F10 aby przejść do listy zakÅ‚adek. Gdy to zrobisz przejdź do nastÄ™pnej zakÅ‚adki wciskajÄ…c TAB lub STRZAÅKĘ W PRAWO. Przejdź do poprzedniej zakÅ‚adki wciskajÄ…c SHIFT + TAB lub STRZAÅKĘ W LEWO. WciÅ›nij SPACJĘ lub ENTER aby wybrać zakÅ‚adkÄ™."},
+{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:"W polu listy możesz przechodzić do nastÄ™pnego elementu za pomocÄ… klawisza TAB lub STRZAÅKI W DĂ“Å. Poprzedni element osiÄ…gniesz za pomocÄ… SHIFT+TAB lub STRZAÅKI W GĂ“RĘ. Za pomocÄ… SPACJI lub ENTERA wybierzesz danÄ… opcjÄ™ z listy, a za pomocÄ… klawisza ESC opuÅ›cisz 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:" 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:"Pomoc dotycząca dostępności",legend:"Naciśnij ${a11yHelp}"}]}],backspace:"Backspace",tab:"Tab",enter:"Enter",shift:"Shift",ctrl:"Ctrl",alt:"Alt",pause:"Pause",capslock:"Caps Lock",escape:"Escape",pageUp:"Page Up",pageDown:"Page Down",end:"End",home:"Home",leftArrow:"Strzałka w lewo",
+upArrow:"StrzaÅ‚ka w gĂ³rÄ™",rightArrow:"StrzaÅ‚ka w prawo",downArrow:"StrzaÅ‚ka w dĂ³Å‚",insert:"Insert","delete":"Delete",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/js/ckeditor/plugins/a11yhelp/dialogs/lang/pt-br.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/pt-br.js
new file mode 100644
index 0000000..5647002
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/pt-br.js
@@ -0,0 +1,12 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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 campo, pressione SHIFT + TAB para mover para o campo anterior, pressione ENTER para enviar o diĂ¡logo, pressione ESC para cancelar o diĂ¡logo. Para diĂ¡logos que tem mĂºltiplas abas, pressione ALT + F10 para navegar para a lista de abas, entĂ£o mova para a prĂ³xima aba com SHIFT + TAB ou SETA PARA ESQUERDA. Pressione ESPAÇO ou ENTER para selecionar a aba."},{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}"}]}],backspace:"Tecla Backspace",tab:"Tecla Tab",enter:"Enter",shift:"Shift",ctrl:"Ctrl",alt:"Alt",pause:"Pause",capslock:"Caps Lock",escape:"Escape",pageUp:"Page Up",
+pageDown:"Page Down",end:"End",home:"Home",leftArrow:"Seta à Esquerda",upArrow:"Seta à Cima",rightArrow:"Seta à Direita",downArrow:"Seta à Baixo",insert:"Insert","delete":"Delete",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/js/ckeditor/plugins/a11yhelp/dialogs/lang/pt.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/pt.js
new file mode 100644
index 0000000..810a854
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/pt.js
@@ -0,0 +1,12 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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 para a barra de ferramentas. VĂ¡ para o grupo da barra de ferramentas anterior e seguinte com TAB e SHIFT+TAB. VĂ¡ para o botĂ£o da barra de ferramentas anterior com a SETA DIREITA ou ESQUERDA. Pressione ESPAÇO ou ENTER para ativar o botĂ£o da barra de ferramentas."},
+{name:"Janela do Editor",legend:"Dentro de uma janela, pressione TAB para navigar para o campo da janela seguinte, pressione SHIFT + TAB para mover para o campo anterior, pressione ENTER para submeter a janela, pressione ESC para cancelar a janela. Para as janelas que tĂªm mĂºltiplos pĂ¡ginas com separadores, pressione ALT + F10 para navegar para a lista do separador. Depois mova para o seguinte separador com TAB ou SETA DIREITA. Mover para o separador anterior com SHIFT + TAB ou SETA ESQUERDA. Pressione ESPAÇO ou ENTER para selecionar o separador da pĂ¡gina."},
+{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. GVĂ¡ para o item do menu parente com ESC ou SETA ESQUERDA. Feche o menu de contexto com ESC."},{name:"Editor de caixa em lista",legend:"Dentro da caixa da lista, vĂ¡ para o itemda lista seguinte com TAB ou SETA PARA BAIXO. Move VĂ¡ parao item da lista anterior com SHIFT+TAB ou SETA PARA BAIXO. Pressione ESPAÇO ou ENTER para selecionar a opĂ§Ă£o da lista. Pressione ESC para fechar a caisa da lista."},
+{name:"Caminho Barra Elemento Editor",legend:"Clique em ${elementsPathFocus} para navegar para a barra do caminho dos elementos. VĂ¡ para o botĂ£o do elemento seguinte com TAB ou SETA DIREITA. VĂ¡ para o botĂ£o anterior com SHIFT+TAB ou SETA ESQUERDA. Pressione 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:"Pressione ${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:"Acesso comando do espaço focus 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}"}]}],backspace:"Backspace",tab:"Tab",enter:"Enter",shift:"Shift",ctrl:"Ctrl",alt:"Alt",pause:"Pausa",capslock:"MaiĂºsculas",escape:"Esc",pageUp:"Page Up",
+pageDown:"Page Down",end:"Fim",home:"Entrada",leftArrow:"Seta esquerda",upArrow:"Seta para cima",rightArrow:"Seta direita",downArrow:"Seta para baixo",insert:"Inserir","delete":"Eliminar",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:"Multiplicar",add:"Adicionar",
+subtract:"Subtrair",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:"VĂ­rgula",dash:"Dash",period:"Period",forwardSlash:"Forward Slash",graveAccent:"Acento grave",openBracket:"Open Bracket",backSlash:"Backslash",closeBracket:"Close Bracket",singleQuote:"Single Quote"}); \ No newline at end of file
diff --git a/js/ckeditor/plugins/a11yhelp/dialogs/lang/ro.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/ro.js
new file mode 100644
index 0000000..5a86ee2
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/ro.js
@@ -0,0 +1,12 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","ro",{title:"InstrucÈ›iuni de accesibilitate",contents:"Cuprins. Pentru a Ă®nchide acest dialog, apăsaÈ›i tasta ESC.",legend:[{name:"General",items:[{name:"Editează bara instrumente.",legend:"Apasă ${toolbarFocus} pentru a naviga prin bara de instrumente. Pentru a te miÈ™ca prin grupurile de instrumente foloseÈ™te tastele TAB È™i SHIFT-TAB. Pentru a te miÈ™ca intre diverse instrumente foloseÈ™te tastele SÄ‚GEATÄ‚ DREAPTA sau SÄ‚GEATÄ‚ STĂ‚NGA. Apasă butonul SPAÈIU sau ENTER pentru activarea instrumentului."},
+{name:"Dialog editor",legend:"Ăntr-un dialog, apasă TAB pentru a naviga spre cĂ¢mpul următor de dialog, apasă SHIFT + TAB pentru a te duce la cĂ¢mpul anterior, apasă ENTER pentru a trimite dialogul, apasă ESC pentru a anula dialogul. Pentru dialoguri care au mai multe subferestre, apasă ALT + F10 pentr a naviga Ă®n lista de subferestre. Treci la subferestrea următoare cu TAB sau SÄ‚GEATÄ‚ DREAPTA. Treci la subfereastra anterioară cu SHIFT + TAB sau SÄ‚GEATÄ‚ STĂ‚NGA. Apasă SPAÈIU sau ENTER pentru a selecta subfereastra."},
+{name:"Editor meniu contextual",legend:"Apasă ${contextMenu} sau TASTA MENIU pentru a deschide meniul contextual. Treci la următoarea opÈ›iune din meniu cu TAB sau SÄ‚GEATÄ‚ JOS. Treci la opÈ›iunea anterioară cu SHIFT+TAB sau SÄ‚GEATÄ‚ SUS. Apasă SPAÈIU sau ENTER pentru a selecta opÈ›iunea din meniu. Deschide sub-meniul opÈ›iunii curente cu SPAÈIU sau ENTER sau SÄ‚GEATÄ‚ DREAPTA. Revino la elementul din meniul părinte cu ESC sau SÄ‚GEATÄ‚ STĂ‚NGA. Ănchide meniul de context cu ESC."},{name:"Editor Casetă Listă",
+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:"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:"Comenzi",items:[{name:" Undo command",legend:"Apasă ${undo}"},{name:"Comanda precedentă",legend:"Apasă ${redo}"},{name:"Comanda ĂngroÈ™at",legend:"Apasă ${bold}"},{name:"Comanda Inclinat",legend:"Apasă ${italic}"},{name:"Comanda Subliniere",legend:"Apasă ${underline}"},{name:"Comanda Legatură",legend:"Apasă ${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}"}]}],backspace:"Backspace",tab:"Tab",enter:"Enter",shift:"Shift",ctrl:"Ctrl",alt:"Alt",pause:"Pause",capslock:"Caps Lock",escape:"Escape",pageUp:"Page Up",pageDown:"Page Down",end:"End",home:"Home",leftArrow:"Left Arrow",
+upArrow:"Up Arrow",rightArrow:"Right Arrow",downArrow:"Down Arrow",insert:"Insert","delete":"Delete",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/js/ckeditor/plugins/a11yhelp/dialogs/lang/ru.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/ru.js
new file mode 100644
index 0000000..414caa1
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/ru.js
@@ -0,0 +1,11 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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 Đ˜Đ›Đ˜ ĐŸĐ ĐĐ’Đ£Đ® Đ¡Đ¢Đ Đ•Đ›ĐĐ£. ĐŸĐµÑ€ĐµÑ…Đ¾Đ´ Đº Đ¿Ñ€ĐµĐ´Ñ‹Đ´ÑƒÑ‰ĐµĐ¹ Đ²ĐºĐ»Đ°Đ´ĐºĐµ Ñ Đ¿Đ¾Đ¼Đ¾Ñ‰ÑŒÑ SHIFT + TAB или ЛЕВĐĐ¯ Đ¡Đ¢Đ Đ•Đ›ĐĐ. ĐĐ°Đ¶Đ¼Đ¸Ñ‚Đµ ĐŸĐ ĐĐ‘Đ•Đ› или ENTER, Ñ‡Ñ‚Đ¾Đ±Ñ‹ Đ²Ñ‹Đ±Ñ€Đ°Ñ‚ÑŒ Đ²ĐºĐ»Đ°Đ´ĐºÑƒ."},
+{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}"}]}],backspace:"Backspace",tab:"Tab",enter:"Enter",shift:"Shift",ctrl:"Ctrl",alt:"Alt",pause:"Pause",capslock:"Caps Lock",escape:"Esc",pageUp:"Page Up",pageDown:"Page Down",end:"End",
+home:"Home",leftArrow:"Đ¡Ñ‚Ñ€ĐµĐ»ĐºĐ° Đ²Đ»ĐµĐ²Đ¾",upArrow:"Đ¡Ñ‚Ñ€ĐµĐ»ĐºĐ° Đ²Đ²ĐµÑ€Ñ…",rightArrow:"Đ¡Ñ‚Ñ€ĐµĐ»ĐºĐ° Đ²Đ¿Ñ€Đ°Đ²Đ¾",downArrow:"Đ¡Ñ‚Ñ€ĐµĐ»ĐºĐ° Đ²Đ½Đ¸Đ·",insert:"Insert","delete":"Delete",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/js/ckeditor/plugins/a11yhelp/dialogs/lang/si.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/si.js
new file mode 100644
index 0000000..07d567a
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/si.js
@@ -0,0 +1,10 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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:"දෙබසà¶à· තුළ, à¶à·…ඟ දෙබස෠පෙදෙසට යෑමට TAB බොතà·à¶­à¶¸ ඔබනà·à¶±, à¶à¶½à·’න෠පෙදෙසට යෑමට SHIFT + TAB බොතà·à¶­à¶¸ ද, දෙබස෠ඉදිරිපත෠à¶à·’රීමට ENTER බොතà·à¶­à¶¸ ද, දෙබස෠නà·à·€à¶­à·“මට ESCබොතà·à¶­à¶¸ ද, දෙබස෠සහිත ගොනු, පිටු à·€à·à¶©à·’ සංà¶à·â€à¶ºà¶ºà·à·€à¶à· ලබ෠ගෙනිමට,ගොනු තුළ එහà·à¶¸à·™à·„෠යෑමට ALT + F10 බොතà·à¶­à¶¸à· ද, à¶à·…ඟ ගොනුවට යෑමට TAB à·„à· RIGTH ARROW බොතà·à¶­à¶¸ ඔබනà·à¶±. පෙර ගොනුවට යෑමට SHIFT + TAB à·„à· LEFT ARROW බොතà·à¶­à¶¸à· ද ,ගොනු පිටු තà·à¶»à·“මට SPACE à·„à· ENTER බොතà·à¶­à¶¸à· ද ඔබනà·à¶±."},
+{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 }"}]}],backspace:"Backspace",tab:"Tab",enter:"Enter",shift:"Shift",ctrl:"Ctrl",
+alt:"Alt",pause:"Pause",capslock:"Caps Lock",escape:"Escape",pageUp:"Page Up",pageDown:"Page Down",end:"End",home:"Home",leftArrow:"Left Arrow",upArrow:"Up Arrow",rightArrow:"Right Arrow",downArrow:"Down Arrow",insert:"Insert","delete":"Delete",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/js/ckeditor/plugins/a11yhelp/dialogs/lang/sk.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/sk.js
new file mode 100644
index 0000000..3984709
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/sk.js
@@ -0,0 +1,12 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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 dialogu, stlaÄte TAB pre navigĂ¡ciu na ÄalÅ¡ie dialĂ³govĂ© pole, stlaÄte STIFT + TAB pre presun na predchĂ¡dzajĂºce pole, stlaÄte ENTER pre odoslanie dialĂ³gu, stlaÄte ESC pre zruÅ¡enie dialĂ³gu. Pre dialĂ³gy, ktorĂ© majĂº viac zĂ¡ložiek, stlaÄte ALT + F10 pre navigĂ¡cou do zoznamu zĂ¡ložiek. Potom sa posĂºvajte k ÄalÅ¡ej Å¾Ă¡ložke pomocou TAB alebo pravou Å¡Ă­pkou. Pre presun k predchĂ¡dzajĂºcej zĂ¡ložke, stlaÄte SHIFT + TAB alebo ľavĂº Å¡Ă­pku. StlaÄte medzernĂ­k alebo ENTER pre vybranie zĂ¡ložky."},
+{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}"}]}],backspace:"Backspace",tab:"Tab",enter:"Enter",shift:"Shift",ctrl:"Ctrl",alt:"Alt",pause:"Pause",capslock:"Caps Lock",escape:"Escape",pageUp:"StrĂ¡nka hore",pageDown:"StrĂ¡nka dole",
+end:"End",home:"Home",leftArrow:"Å Ă­pka naľavo",upArrow:"Å Ă­pka hore",rightArrow:"Å Ă­pka napravo",downArrow:"Å Ă­pka dole",insert:"Insert","delete":"Delete",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/js/ckeditor/plugins/a11yhelp/dialogs/lang/sl.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/sl.js
new file mode 100644
index 0000000..9d1f03a
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/sl.js
@@ -0,0 +1,12 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","sl",{title:"Navodila Dostopnosti",contents:"Vsebina PomoÄi. ÄŒe želite zapreti to pogovorno okno pritisnite ESC.",legend:[{name:"SploÅ¡no",items:[{name:"Urejevalna Orodna Vrstica",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:"Znotraj pogovornega okna, pritisnite tipko TAB za pomik na naslednjo pogovorno polje, pritisnite SHIFT + TAB za pomik v prejÅ¡nje polje, pritisnite tipko ENTER za predložitev pogovornega okna, pritisnite tipko ESC, da prekliÄete okno. Za okna, ki imajo veÄ zavihkov, pritisnite ALT + F10, da pojdete na seznam zavihkov. Na naslednji zavihek se premaknete s tipko TAB ali DESNO PUÅ ÄŒICO. Z SHIFT + TAB ali LEVO PUÅ ÄŒICO pa se premaknete na prejÅ¡nji zavihek. Pritisnite tipko SPACE ali ENTER za izbiro zavihka."},
+{name:"Urejevalni Kontekstni Meni",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}"}]}],backspace:"Backspace",tab:"Tab",enter:"Enter",shift:"Shift",ctrl:"Ctrl",alt:"Alt",pause:"Pause",capslock:"Caps Lock",escape:"Escape",pageUp:"Page Up",pageDown:"Page Down",end:"End",
+home:"Home",leftArrow:"Levo puÅ¡Äica",upArrow:"Gor puÅ¡Äica",rightArrow:"Desno puÅ¡Äica",downArrow:"Dol puÅ¡Äica",insert:"Insert","delete":"Delete",leftWindowKey:"Leva Windows tipka",rightWindowKey:"Desna Windows tipka",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:"Oklepaj",singleQuote:"OpuÅ¡Äaj"}); \ No newline at end of file
diff --git a/js/ckeditor/plugins/a11yhelp/dialogs/lang/sq.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/sq.js
new file mode 100644
index 0000000..12a8175
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/sq.js
@@ -0,0 +1,11 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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:"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:"Dialogu i Redaktuesit",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
+{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:"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:" Toolbar Collapse command",legend:"Shtyp ${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:"Ndihmë Qasjeje",legend:"Shtyp ${a11yHelp}"}]}],backspace:"Prapa",tab:"Fletë",enter:"Enter",shift:"Shift",ctrl:"Ctrl",alt:"Alt",pause:"Pause",capslock:"Caps Lock",escape:"Escape",pageUp:"Page Up",pageDown:"Page Down",end:"End",home:"Home",leftArrow:"Shenja majtas",upArrow:"Shenja sipër",rightArrow:"Shenja djathtas",downArrow:"Shenja poshtë",insert:"Shto","delete":"Grise",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:"Shto",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:"Presje",dash:"vizë",period:"Pikë",forwardSlash:"Forward Slash",
+graveAccent:"Grave Accent",openBracket:"Hape kllapën",backSlash:"Backslash",closeBracket:"Mbylle kllapën",singleQuote:"Single Quote"}); \ No newline at end of file
diff --git a/js/ckeditor/plugins/a11yhelp/dialogs/lang/sr-latn.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/sr-latn.js
new file mode 100644
index 0000000..0518371
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/sr-latn.js
@@ -0,0 +1,11 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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 next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
+{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}"}]}],backspace:"Backspace",tab:"Tab",enter:"Enter",shift:"Shift",ctrl:"Ctrl",alt:"Alt",pause:"Pause",capslock:"Caps Lock",escape:"Escape",pageUp:"Page Up",pageDown:"Page Down",end:"End",home:"Home",leftArrow:"Left Arrow",upArrow:"Up Arrow",rightArrow:"Right Arrow",downArrow:"Down Arrow",insert:"Insert","delete":"Delete",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/js/ckeditor/plugins/a11yhelp/dialogs/lang/sr.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/sr.js
new file mode 100644
index 0000000..f0ad0df
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/sr.js
@@ -0,0 +1,11 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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 next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
+{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}"}]}],backspace:"Backspace",tab:"Tab",enter:"Enter",shift:"Shift",ctrl:"Ctrl",alt:"Alt",pause:"Pause",capslock:"Caps Lock",escape:"Escape",pageUp:"Page Up",pageDown:"Page Down",end:"End",home:"Home",leftArrow:"Left Arrow",upArrow:"Up Arrow",rightArrow:"Right Arrow",downArrow:"Down Arrow",insert:"Insert","delete":"Delete",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/js/ckeditor/plugins/a11yhelp/dialogs/lang/sv.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/sv.js
new file mode 100644
index 0000000..17736f9
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/sv.js
@@ -0,0 +1,12 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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. Du trycker 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 navigera till fliklistan. Flytta sedan till nästa flik med HĂ–GERPIL. Flytta till föregĂ¥ende flik med SHIFT + TAB eller VĂ„NSTERPIL. Tryck Space eller ENTER för att välja fliken."},{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 listan-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:"Kommandot Ă¥ngra",legend:"Tryck pĂ¥ ${undo}"},{name:"Kommandot gör om",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}"}]}],backspace:"Backsteg",tab:"Tab",enter:"Retur",shift:"Skift",ctrl:"Ctrl",alt:"Alt",pause:"Paus",capslock:"Caps lock",escape:"Escape",pageUp:"Sida Up",pageDown:"Sida Ned",end:"Slut",home:"Hem",leftArrow:"Vänsterpil",upArrow:"Uppil",
+rightArrow:"Högerpil",downArrow:"NedĂ¥tpil",insert:"Infoga","delete":"Radera",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/js/ckeditor/plugins/a11yhelp/dialogs/lang/th.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/th.js
new file mode 100644
index 0000000..3aa4b71
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/th.js
@@ -0,0 +1,11 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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 next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
+{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}"}]}],backspace:"Backspace",tab:"Tab",enter:"Enter",shift:"Shift",ctrl:"Ctrl",alt:"Alt",pause:"Pause",capslock:"Caps Lock",escape:"Escape",pageUp:"Page Up",pageDown:"Page Down",end:"End",home:"Home",leftArrow:"Left Arrow",upArrow:"Up Arrow",rightArrow:"Right Arrow",downArrow:"Down Arrow",insert:"Insert","delete":"Delete",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/js/ckeditor/plugins/a11yhelp/dialogs/lang/tr.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/tr.js
new file mode 100644
index 0000000..423a51c
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/tr.js
@@ -0,0 +1,12 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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"}]}],backspace:"Backspace",tab:"Tab",enter:"Enter",shift:"Shift",ctrl:"Ctrl",alt:"Alt",pause:"Pause",capslock:"Caps Lock",escape:"Escape",pageUp:"Sayfa Yukarı",pageDown:"Sayfa Aşağı",end:"End",home:"Home",leftArrow:"Sol ok",upArrow:"Yukarı ok",rightArrow:"Sağ ok",downArrow:"Aşağı ok",insert:"Insert","delete":"Silme",leftWindowKey:"Sol windows tuşu",rightWindowKey:"Sağ windows tuşu",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:"Ç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 Lock",scrollLock:"Scroll Lock",semiColon:"Noktalı virgĂ¼l",equalSign:"EÅŸittir",comma:"VirgĂ¼l",dash:"Eksi",period:"Nokta",forwardSlash:"Forward Slash",
+graveAccent:"Grave Accent",openBracket:"Parantez aç",backSlash:"Backslash",closeBracket:"Parantez kapa",singleQuote:"Tek tırnak"}); \ No newline at end of file
diff --git a/js/ckeditor/plugins/a11yhelp/dialogs/lang/tt.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/tt.js
new file mode 100644
index 0000000..3fe133d
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/tt.js
@@ -0,0 +1,11 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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 next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},
+{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} баÑÑ‹Đ³Ñ‹Đ·"}]}],backspace:"ĐĐ°Đ¹Ñ‚Đ°Ñ€Ñƒ",tab:"Tab",enter:"Enter",shift:"Shift",ctrl:"Ctrl",alt:"Alt",pause:"Đ¢Ñ‹Đ½Ñ‹Ñˆ",capslock:"Caps Lock",escape:"Escape",pageUp:"Page Up",pageDown:"Page Down",end:"End",home:"Home",leftArrow:"Đ¡ÑƒĐ» ÑĐºĐºĐ° ÑƒĐº",upArrow:"Ó¨ÑĐºÓ™ Ñ‚Đ°Đ±Đ° ÑƒĐº",rightArrow:"Đ£̉£ ÑĐºĐºĐ° ÑƒĐº",downArrow:"ĐÑĐºĐ° Ñ‚Đ°Đ±Đ° ÑƒĐº",insert:"Ó¨ÑÑ‚Ó™̉¯","delete":"Đ‘ĐµÑ‚ĐµÑ€̉¯",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/js/ckeditor/plugins/a11yhelp/dialogs/lang/ug.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/ug.js
new file mode 100644
index 0000000..2ee8a06
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/ug.js
@@ -0,0 +1,11 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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} نى بÛسىڭ"}]}],backspace:"Backspace",tab:"Tab",enter:"Enter",shift:"Shift",ctrl:"Ctrl",alt:"Alt",pause:"Pause",capslock:"Caps Lock",escape:"Escape",
+pageUp:"Page Up",pageDown:"Page Down",end:"End",home:"Home",leftArrow:"Left Arrow",upArrow:"Up Arrow",rightArrow:"Right Arrow",downArrow:"Down Arrow",insert:"Insert","delete":"Delete",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/js/ckeditor/plugins/a11yhelp/dialogs/lang/uk.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/uk.js
new file mode 100644
index 0000000..83a48b8
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/uk.js
@@ -0,0 +1,12 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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 ĐĐ‘Đ Đ¡Đ¢Đ Đ†Đ›ĐĐ Đ’ĐŸĐ ĐĐ’Đ. ĐŸĐµÑ€ĐµÑ…Ñ–Đ´ Đ´Đ¾ Đ¿Đ¾Đ¿ĐµÑ€ĐµĐ´Đ½ÑŒĐ¾Ñ— Đ²ĐºĐ»Đ°Đ´ĐºĐ¸ Đ·Đ° Đ´Đ¾Đ¿Đ¾Đ¼Đ¾Đ³Đ¾Ñ SHIFT + TAB Đ°Đ±Đ¾ Đ¡Đ¢Đ Đ†Đ›ĐРВЛІВĐ. ĐĐ°Ñ‚Đ¸ÑĐ½Ñ–Ñ‚ÑŒ ĐŸĐ ĐĐŸĐ£Đ¡Đ Đ°Đ±Đ¾ ENTER, Ñ‰Đ¾Đ± Đ²Đ¸Đ±Ñ€Đ°Ñ‚Đ¸ Đ²ĐºĐ»Đ°Đ´ĐºÑƒ."},{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}"}]}],backspace:"Backspace",tab:"Tab",enter:"Enter",shift:"Shift",ctrl:"Ctrl",alt:"Alt",pause:"Pause",capslock:"Caps Lock",escape:"Esc",pageUp:"Page Up",pageDown:"Page Down",end:"End",home:"Home",leftArrow:"Đ›Ñ–Đ²Đ° ÑÑ‚Ñ€Ñ–Đ»ĐºĐ°",upArrow:"Đ¡Ñ‚Ñ€Ñ–Đ»ĐºĐ° Đ²Đ³Đ¾Ñ€Ñƒ",rightArrow:"ĐŸÑ€Đ°Đ²Đ° ÑÑ‚Ñ€Ñ–Đ»ĐºĐ°",downArrow:"Đ¡Ñ‚Ñ€Ñ–Đ»ĐºĐ° Đ²Đ½Đ¸Đ·",insert:"Đ’ÑÑ‚Đ°Đ²Đ¸Ñ‚Đ¸","delete":"Đ’Đ¸Đ´Đ°Đ»Đ¸Ñ‚Đ¸",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/js/ckeditor/plugins/a11yhelp/dialogs/lang/vi.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/vi.js
new file mode 100644
index 0000000..a7c61cc
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/vi.js
@@ -0,0 +1,11 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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:"BĂªn trong má»™t há»™p thoại, nhấn TAB để chuyển sang trÆ°á»ng tiếp theo, nhấn SHIFT + TAB để quay lại trÆ°á»ng phĂ­a trÆ°á»›c, nhấn ENTER để chấp nhận, nhấn ESC để Ä‘Ă³ng há»™p thoại. Äối vá»›i cĂ¡c há»™p thoại cĂ³ nhiá»u tab, nhấn ALT + F10 để chuyển đến danh sĂ¡ch cĂ¡c tab. Sau Ä‘Ă³ nhấn TAB hoặc MŨI TĂN SANG PHẢI để chuyển sang tab tiếp theo. Nhấn SHIFT + TAB hoặc MŨI TĂN SANG TRĂI để chuyển sang tab trÆ°á»›c Ä‘Ă³. Nhấn DẤU CĂCH hoặc ENTER để chá»n tab."},
+{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}"}]}],backspace:"PhĂ­m Backspace",tab:"PhĂ­m Tab",enter:"PhĂ­m Tab",shift:"PhĂ­m Shift",ctrl:"PhĂ­m Ctrl",alt:"PhĂ­m Alt",pause:"PhĂ­m Pause",capslock:"PhĂ­m Caps Lock",
+escape:"PhĂ­m Escape",pageUp:"PhĂ­m Page Up",pageDown:"PhĂ­m Page Down",end:"PhĂ­m End",home:"PhĂ­m Home",leftArrow:"PhĂ­m Left Arrow",upArrow:"PhĂ­m Up Arrow",rightArrow:"PhĂ­m Right Arrow",downArrow:"PhĂ­m Down Arrow",insert:"Chèn","delete":"XĂ³a",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/js/ckeditor/plugins/a11yhelp/dialogs/lang/zh-cn.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/zh-cn.js
new file mode 100644
index 0000000..9cc5ce3
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/zh-cn.js
@@ -0,0 +1,9 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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 键或者å‘å³ç®­å¤´æ¥ç§»å¨åˆ°ä¸‹ä¸€ä¸ªé€‰é¡¹å¡ï¼›SHIFT + TAB 组åˆé”®æˆ–者å‘左箭头移å¨åˆ°ä¸ä¸€ä¸ªé€‰é¡¹å¡ă€‚用 SPACE 键或者 ENTER 键选择选项å¡ă€‚"},{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}"}]}],backspace:"退格键",tab:"Tab é”®",enter:"å›è½¦é”®",shift:"Shift é”®",ctrl:"Ctrl é”®",alt:"Alt é”®",pause:"æ‚åœé”®",capslock:"大写é”å®é”®",escape:"Esc é”®",pageUp:"ä¸ç¿»é¡µé”®",pageDown:"下翻页键",end:"行尾键",home:"行首键",leftArrow:"å‘左箭头键",upArrow:"å‘ä¸ç®­å¤´é”®",rightArrow:"å‘å³ç®­å¤´é”®",downArrow:"å‘下箭头键",
+insert:"æ’入键","delete":"删除键",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/js/ckeditor/plugins/a11yhelp/dialogs/lang/zh.js b/js/ckeditor/plugins/a11yhelp/dialogs/lang/zh.js
new file mode 100644
index 0000000..b495f41
--- /dev/null
+++ b/js/ckeditor/plugins/a11yhelp/dialogs/lang/zh.js
@@ -0,0 +1,9 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("a11yhelp","zh",{title:"è¼”å©å·¥å…·æŒ‡å—",contents:"說æ˜å…§å®¹ă€‚è‹¥è¦é—œé–‰æ­¤å°è©±æ¡†è«‹æŒ‰ă€ŒESCă€ă€‚",legend:[{name:"一般",items:[{name:"編輯器工具列",legend:"è«‹æŒ‰ă€Œ${toolbarFocus}ă€ä»¥ç€è¦½å·¥å…·åˆ—。\r\nåˆ©ç”¨ă€ŒTABă€æˆ–ă€ŒSHIFT+TABă€ä»¥ä¾¿ç§»å‹•åˆ°ä¸‹ä¸€å€‹æˆ–å‰ä¸€å€‹å·¥å…·åˆ—ç¾¤çµ„ă€‚\r\nåˆ©ç”¨ă€Œâ†’ă€æˆ–ă€Œâ†ă€ä»¥ä¾¿ç§»å‹•åˆ°ä¸‹ä¸€å€‹æˆ–å‰ä¸€å€‹å·¥å…·åˆ—æŒ‰éˆ•ă€‚\r\nè«‹æŒ‰ä¸‹ă€Œç©ºç™½éµă€æˆ–ă€ŒENTERă€éµå•Ÿå‹•å·¥å…·åˆ—æŒ‰éˆ•ă€‚"},{name:"編輯器å°è©±æ–¹å¡",legend:"在å°è©±æ¡†ä¸­ï¼Œè«‹æŒ‰ TAB éµä»¥ä¾¿ç§»å‹•åˆ°ä¸‹å€‹æ¬„ä½ï¼Œè«‹æŒ‰ SHIFT + TAB 以便移動到å‰å€‹æ¬„ä½ï¼›è«‹æŒ‰ ENTER 以æ交å°è©±æ¡†è³‡æ–™ï¼Œæˆ–按下 ESC å–消å°è©±æ¡†ă€‚\r\n若是有å¤å€‹é æ¡†ç„å°è©±æ¡†ï¼Œè«‹æŒ‰ 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}ă€ä»¥ç€è¦½å…ƒç´ è·¯å¾‘å·¥å…·åˆ—ă€‚\r\nåˆ©ç”¨ă€ŒTABă€æˆ–ă€Œâ†’ă€ä»¥ä¾¿ç§»å‹•åˆ°ä¸‹ä¸€å€‹å…ƒç´ æŒ‰éˆ•ă€‚\r\nåˆ©ç”¨ă€ŒSHIFT+TABă€æˆ–ă€Œâ†ă€ä»¥ä¾¿ç§»å‹•åˆ°å‰ä¸€å€‹å…ƒç´ æŒ‰éˆ•ă€‚\r\nè«‹æŒ‰ä¸‹ă€Œç©ºç™½éµă€æˆ–ă€Œ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}ă€"}]}],
+backspace:"退格éµ",tab:"Tab",enter:"Enter",shift:"Shift",ctrl:"Ctrl",alt:"Alt",pause:"Pause",capslock:"Caps Lock",escape:"Escape",pageUp:"Page Up",pageDown:"Page Down",end:"End",home:"Home",leftArrow:"å‘左箭號",upArrow:"å‘ä¸éµè™Ÿ",rightArrow:"å‘å³éµè™Ÿ",downArrow:"å‘下éµè™Ÿ",insert:"æ’å…¥","delete":"刪除",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:"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:"æ–œç·",graveAccent:"æ‘音符號",openBracket:"左方括號",backSlash:"åæ–œç·",closeBracket:"å³æ–¹æ‹¬è™Ÿ",singleQuote:"單引號"}); \ No newline at end of file
diff --git a/js/ckeditor/plugins/about/dialogs/about.js b/js/ckeditor/plugins/about/dialogs/about.js
new file mode 100644
index 0000000..6e78f9c
--- /dev/null
+++ b/js/ckeditor/plugins/about/dialogs/about.js
@@ -0,0 +1,7 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.dialog.add("about",function(a){var a=a.lang.about,b=CKEDITOR.getUrl(CKEDITOR.plugins.get("about").path+"dialogs/"+(CKEDITOR.env.hidpi?"hidpi/":"")+"logo_ckeditor.png");return{title:CKEDITOR.env.ie?a.dlgTitle:a.title,minWidth:390,minHeight:230,contents:[{id:"tab1",label:"",title:"",expand:!0,padding:0,elements:[{type:"html",html:'<style type="text/css">.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:163px 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;}</style><div class="cke_about_container"><div class="cke_about_logo"></div><p>CKEditor '+CKEDITOR.version+" (revision "+CKEDITOR.revision+')<br><a target="_blank" href="http://ckeditor.com/">http://ckeditor.com</a></p><p>'+a.help.replace("$1",'<a target="_blank" href="http://docs.ckeditor.com/user">'+
+a.userGuide+"</a>")+"</p><p>"+a.moreInfo+'<br><a target="_blank" href="http://ckeditor.com/about/license">http://ckeditor.com/about/license</a></p><p>'+a.copy.replace("$1",'<a target="_blank" href="http://cksource.com/">CKSource</a> - Frederico Knabben')+"</p></div>"}]}],buttons:[CKEDITOR.dialog.cancelButton]}}); \ No newline at end of file
diff --git a/js/ckeditor/plugins/about/dialogs/hidpi/logo_ckeditor.png b/js/ckeditor/plugins/about/dialogs/hidpi/logo_ckeditor.png
new file mode 100644
index 0000000..10cc736
--- /dev/null
+++ b/js/ckeditor/plugins/about/dialogs/hidpi/logo_ckeditor.png
Binary files differ
diff --git a/js/ckeditor/plugins/about/dialogs/logo_ckeditor.png b/js/ckeditor/plugins/about/dialogs/logo_ckeditor.png
new file mode 100644
index 0000000..f186eb8
--- /dev/null
+++ b/js/ckeditor/plugins/about/dialogs/logo_ckeditor.png
Binary files differ
diff --git a/js/ckeditor/plugins/clipboard/dialogs/paste.js b/js/ckeditor/plugins/clipboard/dialogs/paste.js
new file mode 100644
index 0000000..441502b
--- /dev/null
+++ b/js/ckeditor/plugins/clipboard/dialogs/paste.js
@@ -0,0 +1,11 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.dialog.add("paste",function(c){function h(a){var b=new CKEDITOR.dom.document(a.document),f=b.getBody(),d=b.getById("cke_actscrpt");d&&d.remove();f.setAttribute("contenteditable",!0);if(CKEDITOR.env.ie&&8>CKEDITOR.env.version)b.getWindow().on("blur",function(){b.$.selection.empty()});b.on("keydown",function(a){var a=a.data,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")&&f.focus()}var e=c.lang.clipboard;c.on("pasteDialogCommit",function(a){a.data&&c.fire("paste",{type:"auto",dataValue:a.data})},null,null,1E3);return{title:e.title,minWidth:CKEDITOR.env.ie&&CKEDITOR.env.quirks?370:350,minHeight:CKEDITOR.env.quirks?250:245,onShow:function(){this.parts.dialog.$.offsetHeight;this.setupContent();this.parts.title.setHtml(this.customTitle||e.title);this.customTitle=null},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:"securityMsg",html:'<div style="white-space:normal;width:340px">'+e.securityMsg+"</div>"},{type:"html",id:"pasteMsg",html:'<div style="white-space:normal;width:340px">'+e.pasteMsg+"</div>"},{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='<html dir="'+c.config.contentsLangDirection+'" lang="'+(c.config.contentsLanguage||c.langCode)+'"><head><style>body{margin:3px;height:95%}</style></head><body><script id="cke_actscrpt" type="text/javascript">window.parent.CKEDITOR.tools.callFunction('+CKEDITOR.tools.addFunction(h,a)+",this);<\/script></body></html>",f=CKEDITOR.env.air?"javascript:void(0)":CKEDITOR.env.ie?
+"javascript:void((function(){"+encodeURIComponent("document.open();("+CKEDITOR.tools.fixDomain+")();document.close();")+'})())"':"",d=CKEDITOR.dom.element.createFromHtml('<iframe class="cke_pasteframe" frameborder="0" allowTransparency="true" src="'+f+'" role="region" aria-label="'+e.pasteArea+'" aria-describedby="'+a.getContentElement("general","pasteMsg").domId+'" aria-multiple="true"></iframe>');d.on("load",function(a){a.removeListener();a=d.getFrameDocument();a.write(b);c.focusManager.add(a.getBody());
+CKEDITOR.env.air&&h.call(this,a.getWindow().$)},a);d.setCustomData("dialog",a);a=this.getElement();a.setHtml("");a.append(d);if(CKEDITOR.env.ie){var g=CKEDITOR.dom.element.createFromHtml('<span tabindex="-1" style="position:absolute" role="presentation"></span>');g.on("focus",function(){setTimeout(function(){d.$.contentWindow.focus()})});a.append(g);this.focus=function(){g.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(),d;c&&c.remove();d=b.getHtml();setTimeout(function(){a.fire("pasteDialogCommit",d)},0)}}]}]}}); \ No newline at end of file
diff --git a/js/ckeditor/plugins/dialog/dialogDefinition.js b/js/ckeditor/plugins/dialog/dialogDefinition.js
new file mode 100644
index 0000000..525bb7a
--- /dev/null
+++ b/js/ckeditor/plugins/dialog/dialogDefinition.js
@@ -0,0 +1,4 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
diff --git a/js/ckeditor/plugins/fakeobjects/images/spacer.gif b/js/ckeditor/plugins/fakeobjects/images/spacer.gif
new file mode 100644
index 0000000..5bfd67a
--- /dev/null
+++ b/js/ckeditor/plugins/fakeobjects/images/spacer.gif
Binary files differ
diff --git a/js/ckeditor/plugins/icons.png b/js/ckeditor/plugins/icons.png
new file mode 100644
index 0000000..ee02970
--- /dev/null
+++ b/js/ckeditor/plugins/icons.png
Binary files differ
diff --git a/js/ckeditor/plugins/icons_hidpi.png b/js/ckeditor/plugins/icons_hidpi.png
new file mode 100644
index 0000000..0466c2b
--- /dev/null
+++ b/js/ckeditor/plugins/icons_hidpi.png
Binary files differ
diff --git a/js/ckeditor/plugins/image/dialogs/image.js b/js/ckeditor/plugins/image/dialogs/image.js
new file mode 100644
index 0000000..e9d85eb
--- /dev/null
+++ b/js/ckeditor/plugins/image/dialogs/image.js
@@ -0,0 +1,43 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+(function(){var r=function(c,j){function r(){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 i(a){if(!s){s=1;var b=this.getDialog(),d=b.imageElement;if(d){this.commit(f,d);for(var a=[].concat(a),e=a.length,c,g=0;g<e;g++)(c=b.getContentElement.apply(b,a[g].split(":")))&&c.setup(f,d)}s=0}}var f=1,k=/^\s*(\d+)((px)|\%)?\s*$/i,v=/(^\s*(\d+)((px)|\%)?\s*$)|^$/i,o=/^\d+px$/,
+w=function(){var a=this.getValue(),b=this.getDialog(),d=a.match(k);d&&("%"==d[2]&&l(b,!1),a=d[1]);b.lockRatio&&(d=b.originalElement,"true"==d.getCustomData("isReady")&&("txtHeight"==this.id?(a&&"0"!=a&&(a=Math.round(d.$.width*(a/d.$.height))),isNaN(a)||b.setValueOf("info","txtWidth",a)):(a&&"0"!=a&&(a=Math.round(d.$.height*(a/d.$.width))),isNaN(a)||b.setValueOf("info","txtHeight",a))));g(b)},g=function(a){if(!a.originalElement||!a.preview)return 1;a.commitContent(4,a.preview);return 0},s,l=function(a,
+b){if(!a.getContentElement("info","ratioLock"))return null;var d=a.originalElement;if(!d)return null;if("check"==b){if(!a.userlockRatio&&"true"==d.getCustomData("isReady")){var e=a.getValueOf("info","txtWidth"),c=a.getValueOf("info","txtHeight"),d=1E3*d.$.width/d.$.height,f=1E3*e/c;a.lockRatio=!1;!e&&!c?a.lockRatio=!0:!isNaN(d)&&!isNaN(f)&&Math.round(d)==Math.round(f)&&(a.lockRatio=!0)}}else void 0!==b?a.lockRatio=b:(a.userlockRatio=1,a.lockRatio=!a.lockRatio);e=CKEDITOR.document.getById(p);a.lockRatio?
+e.removeClass("cke_btn_unlocked"):e.addClass("cke_btn_unlocked");e.setAttribute("aria-checked",a.lockRatio);CKEDITOR.env.hc&&e.getChild(0).setHtml(a.lockRatio?CKEDITOR.env.ie?"â– ":"â–£":CKEDITOR.env.ie?"â–¡":"â–¢");return a.lockRatio},x=function(a){var b=a.originalElement;if("true"==b.getCustomData("isReady")){var d=a.getContentElement("info","txtWidth"),e=a.getContentElement("info","txtHeight");d&&d.setValue(b.$.width);e&&e.setValue(b.$.height)}g(a)},y=function(a,b){function d(a,b){var d=a.match(k);return d?
+("%"==d[2]&&(d[1]+="%",l(e,!1)),d[1]):b}if(a==f){var e=this.getDialog(),c="",g="txtWidth"==this.id?"width":"height",h=b.getAttribute(g);h&&(c=d(h,c));c=d(b.getStyle(g),c);this.setValue(c)}},t,q=function(){var a=this.originalElement,b=CKEDITOR.document.getById(m);a.setCustomData("isReady","true");a.removeListener("load",q);a.removeListener("error",h);a.removeListener("abort",h);b&&b.setStyle("display","none");this.dontResetSize||x(this);this.firstLoad&&CKEDITOR.tools.setTimeout(function(){l(this,"check")},
+0,this);this.dontResetSize=this.firstLoad=!1;g(this)},h=function(){var a=this.originalElement,b=CKEDITOR.document.getById(m);a.removeListener("load",q);a.removeListener("error",h);a.removeListener("abort",h);a=CKEDITOR.getUrl(CKEDITOR.plugins.get("image").path+"images/noimage.png");this.preview&&this.preview.setAttribute("src",a);b&&b.setStyle("display","none");l(this,!1)},n=function(a){return CKEDITOR.tools.getNextId()+"_"+a},p=n("btnLockSizes"),u=n("btnResetSize"),m=n("ImagePreviewLoader"),A=n("previewLink"),
+z=n("previewImage");return{title:c.lang.image["image"==j?"title":"titleButton"],minWidth: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(),d=(b=b&&b.getSelectedElement())&&a.elementPath(b).contains("a",1),c=CKEDITOR.document.getById(m);c&&c.setStyle("display","none");t=new CKEDITOR.dom.element("img",
+a.document);this.preview=CKEDITOR.document.getById(z);this.originalElement=a.document.createElement("img");this.originalElement.setAttribute("alt","");this.originalElement.setCustomData("isReady","false");if(d){this.linkElement=d;this.linkEditMode=!0;c=d.getChildren();if(1==c.count()){var g=c.getItem(0).getName();if("img"==g||"input"==g)this.imageElement=c.getItem(0),"img"==this.imageElement.getName()?this.imageEditMode="img":"input"==this.imageElement.getName()&&(this.imageEditMode="input")}"image"==
+j&&this.setupContent(2,d)}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(f,this.imageElement)):this.imageElement=a.document.createElement("img");
+l(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"==j&&"input"==a&&confirm(c.lang.image.button2Img)?(this.imageElement=c.document.createElement("img"),this.imageElement.setAttribute("alt",""),c.insertElement(this.imageElement)):"image"!=j&&"img"==a&&confirm(c.lang.image.img2Button)?(this.imageElement=c.document.createElement("input"),
+this.imageElement.setAttributes({type:"image",alt:""}),c.insertElement(this.imageElement)):(this.imageElement=this.cleanImageElement,delete this.cleanImageElement)}else"image"==j?this.imageElement=c.document.createElement("img"):(this.imageElement=c.document.createElement("input"),this.imageElement.setAttribute("type","image")),this.imageElement.setAttribute("alt","");this.linkEditMode||(this.linkElement=c.document.createElement("a"));this.commitContent(f,this.imageElement);this.commitContent(2,this.linkElement);
+this.imageElement.getAttribute("style")||this.imageElement.removeAttribute("style");this.imageEditMode?!this.linkEditMode&&this.addLink?(c.insertElement(this.linkElement),this.imageElement.appendTo(this.linkElement)):this.linkEditMode&&!this.addLink&&(c.getSelection().selectElement(this.linkElement),c.insertElement(this.imageElement)):this.addLink?this.linkEditMode?c.insertElement(this.imageElement):(c.insertElement(this.linkElement),this.linkElement.append(this.imageElement,!1)):c.insertElement(this.imageElement)},
+onLoad:function(){"image"!=j&&this.hidePage("Link");var a=this._.element.getDocument();this.getContentElement("info","ratioLock")&&(this.addFocusable(a.getById(u),5),this.addFocusable(a.getById(p),5));this.commitContent=r},onHide:function(){this.preview&&this.commitContent(8,this.preview);this.originalElement&&(this.originalElement.removeListener("load",q),this.originalElement.removeListener("error",h),this.originalElement.removeListener("abort",h),this.originalElement.remove(),this.originalElement=
+!1);delete this.imageElement},contents:[{id:"info",label:c.lang.image.infoTab,accessKey:"I",elements:[{type:"vbox",padding:0,children:[{type:"hbox",widths:["280px","110px"],align:"right",children:[{id:"txtUrl",type:"text",label:c.lang.common.url,required:!0,onChange:function(){var a=this.getDialog(),b=this.getValue();if(0<b.length){var a=this.getDialog(),d=a.originalElement;a.preview&&a.preview.removeStyle("display");d.setCustomData("isReady","false");var c=CKEDITOR.document.getById(m);c&&c.setStyle("display",
+"");d.on("load",q,a);d.on("error",h,a);d.on("abort",h,a);d.setAttribute("src",b);a.preview&&(t.setAttribute("src",b),a.preview.setAttribute("src",t.$.src),g(a))}else a.preview&&(a.preview.removeAttribute("src"),a.preview.setStyle("display","none"))},setup:function(a,b){if(a==f){var d=b.data("cke-saved-src")||b.getAttribute("src");this.getDialog().dontResetSize=!0;this.setValue(d);this.setInitValue()}},commit:function(a,b){a==f&&(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(c.lang.image.urlMissing)},{type:"button",id:"browse",style:"display:inline-block;margin-top:14px;",align:"center",label:c.lang.common.browseServer,hidden:!0,filebrowser:"info:txtUrl"}]}]},{id:"txtAlt",type:"text",label:c.lang.image.alt,accessKey:"T","default":"",onChange:function(){g(this.getDialog())},setup:function(a,b){a==f&&this.setValue(b.getAttribute("alt"))},
+commit:function(a,b){a==f?(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:c.lang.common.width,onKeyUp:w,onChange:function(){i.call(this,"advanced:txtdlgGenStyle")},validate:function(){var a=
+this.getValue().match(v);(a=!!(a&&0!==parseInt(a[1],10)))||alert(c.lang.common.invalidWidth);return a},setup:y,commit:function(a,b,d){var e=this.getValue();a==f?(e&&c.activeFilter.check("img{width,height}")?b.setStyle("width",CKEDITOR.tools.cssLength(e)):b.removeStyle("width"),!d&&b.removeAttribute("width")):4==a?e.match(k)?b.setStyle("width",CKEDITOR.tools.cssLength(e)):(a=this.getDialog().originalElement,"true"==a.getCustomData("isReady")&&b.setStyle("width",a.$.width+"px")):8==a&&(b.removeAttribute("width"),
+b.removeStyle("width"))}},{type:"text",id:"txtHeight",width:"45px",label:c.lang.common.height,onKeyUp:w,onChange:function(){i.call(this,"advanced:txtdlgGenStyle")},validate:function(){var a=this.getValue().match(v);(a=!!(a&&0!==parseInt(a[1],10)))||alert(c.lang.common.invalidHeight);return a},setup:y,commit:function(a,b,d){var e=this.getValue();a==f?(e&&c.activeFilter.check("img{width,height}")?b.setStyle("height",CKEDITOR.tools.cssLength(e)):b.removeStyle("height"),!d&&b.removeAttribute("height")):
+4==a?e.match(k)?b.setStyle("height",CKEDITOR.tools.cssLength(e)):(a=this.getDialog().originalElement,"true"==a.getCustomData("isReady")&&b.setStyle("height",a.$.height+"px")):8==a&&(b.removeAttribute("height"),b.removeStyle("height"))}}]},{id:"ratioLock",type:"html",style:"margin-top:30px;width:40px;height:40px;",onLoad:function(){var a=CKEDITOR.document.getById(u),b=CKEDITOR.document.getById(p);a&&(a.on("click",function(a){x(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){l(this);var b=this.originalElement,c=this.getValueOf("info","txtWidth");if(b.getCustomData("isReady")=="true"&&c){b=b.$.height/b.$.width*c;if(!isNaN(b)){this.setValueOf("info","txtHeight",Math.round(b));g(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:'<div><a href="javascript:void(0)" tabindex="-1" title="'+c.lang.image.lockRatio+'" class="cke_btn_locked" id="'+p+'" role="checkbox"><span class="cke_icon"></span><span class="cke_label">'+c.lang.image.lockRatio+'</span></a><a href="javascript:void(0)" tabindex="-1" title="'+c.lang.image.resetSize+'" class="cke_btn_reset" id="'+u+'" role="button"><span class="cke_label">'+c.lang.image.resetSize+"</span></a></div>"}]},{type:"vbox",padding:1,children:[{type:"text",id:"txtBorder",requiredContent:"img{border-width}",
+width:"60px",label:c.lang.image.border,"default":"",onKeyUp:function(){g(this.getDialog())},onChange:function(){i.call(this,"advanced:txtdlgGenStyle")},validate:CKEDITOR.dialog.validate.integer(c.lang.image.validateBorder),setup:function(a,b){if(a==f){var d;d=(d=(d=b.getStyle("border-width"))&&d.match(/^(\d+px)(?: \1 \1 \1)?$/))&&parseInt(d[1],10);isNaN(parseInt(d,10))&&(d=b.getAttribute("border"));this.setValue(d)}},commit:function(a,b,d){var c=parseInt(this.getValue(),10);a==f||4==a?(isNaN(c)?!c&&
+this.isChanged()&&b.removeStyle("border"):(b.setStyle("border-width",CKEDITOR.tools.cssLength(c)),b.setStyle("border-style","solid")),!d&&a==f&&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:c.lang.image.hSpace,"default":"",onKeyUp:function(){g(this.getDialog())},onChange:function(){i.call(this,
+"advanced:txtdlgGenStyle")},validate:CKEDITOR.dialog.validate.integer(c.lang.image.validateHSpace),setup:function(a,b){if(a==f){var d,c;d=b.getStyle("margin-left");c=b.getStyle("margin-right");d=d&&d.match(o);c=c&&c.match(o);d=parseInt(d,10);c=parseInt(c,10);d=d==c&&d;isNaN(parseInt(d,10))&&(d=b.getAttribute("hspace"));this.setValue(d)}},commit:function(a,b,d){var c=parseInt(this.getValue(),10);a==f||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))),!d&&a==f&&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:c.lang.image.vSpace,"default":"",onKeyUp:function(){g(this.getDialog())},onChange:function(){i.call(this,"advanced:txtdlgGenStyle")},validate:CKEDITOR.dialog.validate.integer(c.lang.image.validateVSpace),
+setup:function(a,b){if(a==f){var c,e;c=b.getStyle("margin-top");e=b.getStyle("margin-bottom");c=c&&c.match(o);e=e&&e.match(o);c=parseInt(c,10);e=parseInt(e,10);c=c==e&&c;isNaN(parseInt(c,10))&&(c=b.getAttribute("vspace"));this.setValue(c)}},commit:function(a,b,c){var e=parseInt(this.getValue(),10);a==f||4==a?(isNaN(e)?!e&&this.isChanged()&&(b.removeStyle("margin-top"),b.removeStyle("margin-bottom")):(b.setStyle("margin-top",CKEDITOR.tools.cssLength(e)),b.setStyle("margin-bottom",CKEDITOR.tools.cssLength(e))),
+!c&&a==f&&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:c.lang.common.align,"default":"",items:[[c.lang.common.notSet,""],[c.lang.common.alignLeft,"left"],[c.lang.common.alignRight,"right"]],onChange:function(){g(this.getDialog());i.call(this,"advanced:txtdlgGenStyle")},setup:function(a,b){if(a==f){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,c){var e=this.getValue();if(a==f||4==a){if(e?b.setStyle("float",e):b.removeStyle("float"),!c&&a==f)switch(e=(b.getAttribute("align")||"").toLowerCase(),e){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:"<div>"+CKEDITOR.tools.htmlEncode(c.lang.common.preview)+
+'<br><div id="'+m+'" class="ImagePreviewLoader" style="display:none"><div class="loading">&nbsp;</div></div><div class="ImagePreviewBox"><table><tr><td><a href="javascript:void(0)" target="_blank" onclick="return false;" id="'+A+'"><img id="'+z+'" alt="" /></a>'+(c.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.")+
+"</td></tr></table></div></div>"}]}]}]},{id:"Link",requiredContent:"a[href]",label:c.lang.image.linkTab,padding:0,elements:[{id:"txtUrl",type:"text",label:c.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 d=this.getValue();b.data("cke-saved-href",d);b.setAttribute("href",d);if(this.getValue()||!c.config.image_removeLinkByEmptyURL)this.getDialog().addLink=
+!0}}},{type:"button",id:"browse",filebrowser:{action:"Browse",target:"Link:txtUrl",url:c.config.filebrowserImageBrowseLinkUrl},style:"float:right",hidden:!0,label:c.lang.common.browseServer},{id:"cmbTarget",type:"select",requiredContent:"a[target]",label:c.lang.common.target,"default":"",items:[[c.lang.common.notSet,""],[c.lang.common.targetNew,"_blank"],[c.lang.common.targetTop,"_top"],[c.lang.common.targetSelf,"_self"],[c.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:c.lang.image.upload,elements:[{type:"file",id:"upload",label:c.lang.image.btnUpload,style:"height:40px",size:38},{type:"fileButton",id:"uploadButton",filebrowser:"info:txtUrl",label:c.lang.image.btnUpload,"for":["Upload","upload"]}]},{id:"advanced",label:c.lang.common.advancedTab,elements:[{type:"hbox",widths:["50%","25%","25%"],
+children:[{type:"text",id:"linkId",requiredContent:"img[id]",label:c.lang.common.id,setup:function(a,b){a==f&&this.setValue(b.getAttribute("id"))},commit:function(a,b){a==f&&(this.getValue()||this.isChanged())&&b.setAttribute("id",this.getValue())}},{id:"cmbLangDir",type:"select",requiredContent:"img[dir]",style:"width : 100px;",label:c.lang.common.langDir,"default":"",items:[[c.lang.common.notSet,""],[c.lang.common.langDirLtr,"ltr"],[c.lang.common.langDirRtl,"rtl"]],setup:function(a,b){a==f&&this.setValue(b.getAttribute("dir"))},
+commit:function(a,b){a==f&&(this.getValue()||this.isChanged())&&b.setAttribute("dir",this.getValue())}},{type:"text",id:"txtLangCode",requiredContent:"img[lang]",label:c.lang.common.langCode,"default":"",setup:function(a,b){a==f&&this.setValue(b.getAttribute("lang"))},commit:function(a,b){a==f&&(this.getValue()||this.isChanged())&&b.setAttribute("lang",this.getValue())}}]},{type:"text",id:"txtGenLongDescr",requiredContent:"img[longdesc]",label:c.lang.common.longDescr,setup:function(a,b){a==f&&this.setValue(b.getAttribute("longDesc"))},
+commit:function(a,b){a==f&&(this.getValue()||this.isChanged())&&b.setAttribute("longDesc",this.getValue())}},{type:"hbox",widths:["50%","50%"],children:[{type:"text",id:"txtGenClass",requiredContent:"img(cke-xyz)",label:c.lang.common.cssClass,"default":"",setup:function(a,b){a==f&&this.setValue(b.getAttribute("class"))},commit:function(a,b){a==f&&(this.getValue()||this.isChanged())&&b.setAttribute("class",this.getValue())}},{type:"text",id:"txtGenTitle",requiredContent:"img[title]",label:c.lang.common.advisoryTitle,
+"default":"",onChange:function(){g(this.getDialog())},setup:function(a,b){a==f&&this.setValue(b.getAttribute("title"))},commit:function(a,b){a==f?(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:c.lang.common.cssStyle,validate:CKEDITOR.dialog.validate.inlineStyle(c.lang.common.invalidInlineStyle),"default":"",setup:function(a,
+b){if(a==f){var c=b.getAttribute("style");!c&&b.$.style.cssText&&(c=b.$.style.cssText);this.setValue(c);var e=b.$.style.height,c=b.$.style.width,e=(e?e:"").match(k),c=(c?c:"").match(k);this.attributesInStyle={height:!!e,width:!!c}}},onChange:function(){i.call(this,"info:cmbFloat info:cmbAlign info:txtVSpace info:txtHSpace info:txtBorder info:txtWidth info:txtHeight".split(" "));g(this)},commit:function(a,b){a==f&&(this.getValue()||this.isChanged())&&b.setAttribute("style",this.getValue())}}]}]}};
+CKEDITOR.dialog.add("image",function(c){return r(c,"image")});CKEDITOR.dialog.add("imagebutton",function(c){return r(c,"imagebutton")})})(); \ No newline at end of file
diff --git a/js/ckeditor/plugins/image/images/noimage.png b/js/ckeditor/plugins/image/images/noimage.png
new file mode 100644
index 0000000..1598113
--- /dev/null
+++ b/js/ckeditor/plugins/image/images/noimage.png
Binary files differ
diff --git a/js/ckeditor/plugins/link/dialogs/anchor.js b/js/ckeditor/plugins/link/dialogs/anchor.js
new file mode 100644
index 0000000..f5fe2ea
--- /dev/null
+++ b/js/ckeditor/plugins/link/dialogs/anchor.js
@@ -0,0 +1,7 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.dialog.add("anchor",function(c){function d(a,b){return a.createFakeElement(a.document.createElement("a",{attributes:b}),"cke_anchor","anchor")}return{title:c.lang.link.anchor.title,minWidth:300,minHeight:60,onOk:function(){var a=CKEDITOR.tools.trim(this.getValueOf("info","txtName")),a={id:a,name:a,"data-cke-saved-name":a};if(this._.selectedElement)this._.selectedElement.data("cke-realelement")?(a=d(c,a),a.replace(this._.selectedElement),CKEDITOR.env.ie&&c.getSelection().selectElement(a)):
+this._.selectedElement.setAttributes(a);else{var b=c.getSelection(),b=b&&b.getRanges()[0];b.collapsed?(a=d(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,c.applyStyle(a))}},onHide:function(){delete this._.selectedElement},onShow:function(){var a=c.getSelection(),b=a.getSelectedElement(),d=b&&b.data("cke-realelement"),e=d?CKEDITOR.plugins.link.tryRestoreFakeAnchor(c,b):CKEDITOR.plugins.link.getSelectedLink(c);
+e&&(this._.selectedElement=e,this.setValueOf("info","txtName",e.data("cke-saved-name")||""),!d&&a.selectElement(e),b&&(this._.selectedElement=b));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()?(alert(c.lang.link.anchor.errorName),!1):!0}}]}]}}); \ No newline at end of file
diff --git a/js/ckeditor/plugins/link/dialogs/link.js b/js/ckeditor/plugins/link/dialogs/link.js
new file mode 100644
index 0000000..3ee3209
--- /dev/null
+++ b/js/ckeditor/plugins/link/dialogs/link.js
@@ -0,0 +1,26 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+(function(){CKEDITOR.dialog.add("link",function(g){var l=CKEDITOR.plugins.link,m=function(){var a=this.getDialog(),b=a.getContentElement("target","popupFeatures"),a=a.getContentElement("target","linkTargetName"),k=this.getValue();if(b&&a)switch(b=b.getElement(),b.hide(),a.setValue(""),k){case "frame":a.setLabel(g.lang.link.targetFrameName);a.getElement().show();break;case "popup":b.show();a.setLabel(g.lang.link.targetPopupName);a.getElement().show();break;default:a.setValue(k),a.getElement().hide()}},
+f=function(a){a.target&&this.setValue(a.target[this.id]||"")},h=function(a){a.advanced&&this.setValue(a.advanced[this.id]||"")},i=function(a){a.target||(a.target={});a.target[this.id]=this.getValue()||""},j=function(a){a.advanced||(a.advanced={});a.advanced[this.id]=this.getValue()||""},c=g.lang.common,b=g.lang.link,d;return{title:b.title,minWidth:350,minHeight:230,contents:[{id:"info",label:b.info,title:b.info,elements:[{id:"linkType",type:"select",label:b.type,"default":"url",items:[[b.toUrl,"url"],
+[b.toAnchor,"anchor"],[b.toEmail,"email"]],onChange:function(){var a=this.getDialog(),b=["urlOptions","anchorOptions","emailOptions"],k=this.getValue(),e=a.definition.getContents("upload"),e=e&&e.hidden;"url"==k?(g.config.linkShowTargetTab&&a.showPage("target"),e||a.showPage("upload")):(a.hidePage("target"),e||a.hidePage("upload"));for(e=0;e<b.length;e++){var c=a.getContentElement("info",b[e]);c&&(c=c.getElement().getParent().getParent(),b[e]==k+"Options"?c.show():c.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:c.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:c.url,required:!0,onLoad:function(){this.allowOnChange=
+!0},onKeyUp:function(){this.allowOnChange=!1;var a=this.getDialog().getContentElement("info","protocol"),b=this.getValue(),k=/^((javascript:)|[#\/\.\?])/i,c=/^(http|https|ftp|news):\/\/(?=.)/i.exec(b);c?(this.setValue(b.substr(c[0].length)),a.setValue(c[0].toLowerCase())):k.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:!g.config.linkJavaScriptLinksAllowed&&/javascript\:/.test(this.getValue())?(alert(c.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:c.browseServer}]},{type:"vbox",id:"anchorOptions",width:260,align:"center",padding:0,children:[{type:"fieldset",id:"selectAnchorText",label:b.selectAnchor,setup:function(){d=l.getEditorAnchors(g);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:'<div role="note" tabIndex="-1">'+CKEDITOR.tools.htmlEncode(b.noAnchors)+"</div>",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")?!0:CKEDITOR.dialog.validate.notEmpty(b.noEmail).apply(this)},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()}}]},{id:"target",requiredContent:"a[target]",label:b.target,title:b.target,
+elements:[{type:"hbox",widths:["50%","50%"],children:[{type:"select",id:"linkTargetType",label:c.target,"default":"notSet",style:"width : 100%;",items:[[c.notSet,"notSet"],[b.targetFrame,"frame"],[b.targetPopup,"popup"],[c.targetNew,"_blank"],[c.targetTop,"_top"],[c.targetSelf,"_self"],[c.targetParent,"_parent"]],onChange:m,setup:function(a){a.target&&this.setValue(a.target.type||"notSet");m.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(/\W/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:f,commit:i},{type:"checkbox",id:"status",label:b.popupStatusBar,setup:f,commit:i}]},{type:"hbox",
+children:[{type:"checkbox",id:"location",label:b.popupLocationBar,setup:f,commit:i},{type:"checkbox",id:"toolbar",label:b.popupToolbar,setup:f,commit:i}]},{type:"hbox",children:[{type:"checkbox",id:"menubar",label:b.popupMenuBar,setup:f,commit:i},{type:"checkbox",id:"fullscreen",label:b.popupFullScreen,setup:f,commit:i}]},{type:"hbox",children:[{type:"checkbox",id:"scrollbars",label:b.popupScrollBars,setup:f,commit:i},{type:"checkbox",id:"dependent",label:b.popupDependent,setup:f,commit:i}]},{type:"hbox",
+children:[{type:"text",widths:["50%","50%"],labelLayout:"horizontal",label:c.width,id:"width",setup:f,commit:i},{type:"text",labelLayout:"horizontal",widths:["50%","50%"],label:b.popupLeft,id:"left",setup:f,commit:i}]},{type:"hbox",children:[{type:"text",labelLayout:"horizontal",widths:["50%","50%"],label:c.height,id:"height",setup:f,commit:i},{type:"text",labelLayout:"horizontal",label:b.popupTop,widths:["50%","50%"],id:"top",setup:f,commit:i}]}]}]}]},{id:"upload",label:b.upload,title:b.upload,hidden:!0,
+filebrowser:"uploadButton",elements:[{type:"file",id:"upload",label:c.upload,style:"height:40px",size:29},{type:"fileButton",id:"uploadButton",label:c.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:h,commit:j},{type:"select",id:"advLangDir",requiredContent:"a[dir]",label:b.langDir,
+"default":"",style:"width:110px",items:[[c.notSet,""],[b.langDirLTR,"ltr"],[b.langDirRTL,"rtl"]],setup:h,commit:j},{type:"text",id:"advAccessKey",requiredContent:"a[accesskey]",width:"80px",label:b.acccessKey,maxLength:1,setup:h,commit:j}]},{type:"hbox",widths:["45%","35%","20%"],children:[{type:"text",label:b.name,id:"advName",requiredContent:"a[name]",setup:h,commit:j},{type:"text",label:b.langCode,id:"advLangCode",requiredContent:"a[lang]",width:"110px","default":"",setup:h,commit:j},{type:"text",
+label:b.tabIndex,id:"advTabIndex",requiredContent:"a[tabindex]",width:"80px",maxLength:5,setup:h,commit:j}]}]},{type:"vbox",padding:1,children:[{type:"hbox",widths:["45%","55%"],children:[{type:"text",label:b.advisoryTitle,requiredContent:"a[title]","default":"",id:"advTitle",setup:h,commit:j},{type:"text",label:b.advisoryContentType,requiredContent:"a[type]","default":"",id:"advContentType",setup:h,commit:j}]},{type:"hbox",widths:["45%","55%"],children:[{type:"text",label:b.cssClasses,requiredContent:"a(cke-xyz)",
+"default":"",id:"advCSSClasses",setup:h,commit:j},{type:"text",label:b.charset,requiredContent:"a[charset]","default":"",id:"advCharset",setup:h,commit:j}]},{type:"hbox",widths:["45%","55%"],children:[{type:"text",label:b.rel,requiredContent:"a[rel]","default":"",id:"advRel",setup:h,commit:j},{type:"text",label:b.styles,requiredContent:"a{cke-xyz}","default":"",id:"advStyles",validate:CKEDITOR.dialog.validate.inlineStyle(g.lang.common.invalidInlineStyle),setup:h,commit:j}]}]}]}],onShow:function(){var a=
+this.getParentEditor(),b=a.getSelection(),c=null;(c=l.getSelectedLink(a))&&c.hasAttribute("href")?b.getSelectedElement()||b.selectElement(c):c=null;a=l.parseLinkAttributes(a,c);this._.selectedElement=c;this.setupContent(a)},onOk:function(){var a={};this.commitContent(a);var b=g.getSelection(),c=l.getLinkAttributes(g,a);if(this._.selectedElement){var e=this._.selectedElement,d=e.data("cke-saved-href"),f=e.getHtml();e.setAttributes(c.set);e.removeAttributes(c.removed);if(d==f||"email"==a.type&&-1!=
+f.indexOf("@"))e.setHtml("email"==a.type?a.email.address:c.set["data-cke-saved-href"]),b.selectElement(e);delete this._.selectedElement}else b=b.getRanges()[0],b.collapsed&&(a=new CKEDITOR.dom.text("email"==a.type?a.email.address:c.set["data-cke-saved-href"],g.document),b.insertNode(a),b.selectNodeContents(a)),c=new CKEDITOR.style({element:"a",attributes:c.set}),c.type=CKEDITOR.STYLE_INLINE,c.applyToRange(b,g),b.select()},onLoad:function(){g.config.linkShowAdvancedTab||this.hidePage("advanced");g.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/js/ckeditor/plugins/link/images/anchor.png b/js/ckeditor/plugins/link/images/anchor.png
new file mode 100644
index 0000000..6d861a0
--- /dev/null
+++ b/js/ckeditor/plugins/link/images/anchor.png
Binary files differ
diff --git a/js/ckeditor/plugins/link/images/hidpi/anchor.png b/js/ckeditor/plugins/link/images/hidpi/anchor.png
new file mode 100644
index 0000000..f504843
--- /dev/null
+++ b/js/ckeditor/plugins/link/images/hidpi/anchor.png
Binary files differ
diff --git a/js/ckeditor/plugins/magicline/images/hidpi/icon-rtl.png b/js/ckeditor/plugins/magicline/images/hidpi/icon-rtl.png
new file mode 100644
index 0000000..4a8d2bf
--- /dev/null
+++ b/js/ckeditor/plugins/magicline/images/hidpi/icon-rtl.png
Binary files differ
diff --git a/js/ckeditor/plugins/magicline/images/hidpi/icon.png b/js/ckeditor/plugins/magicline/images/hidpi/icon.png
new file mode 100644
index 0000000..b981bb5
--- /dev/null
+++ b/js/ckeditor/plugins/magicline/images/hidpi/icon.png
Binary files differ
diff --git a/js/ckeditor/plugins/magicline/images/icon-rtl.png b/js/ckeditor/plugins/magicline/images/icon-rtl.png
new file mode 100644
index 0000000..55b5b5f
--- /dev/null
+++ b/js/ckeditor/plugins/magicline/images/icon-rtl.png
Binary files differ
diff --git a/js/ckeditor/plugins/magicline/images/icon.png b/js/ckeditor/plugins/magicline/images/icon.png
new file mode 100644
index 0000000..e063433
--- /dev/null
+++ b/js/ckeditor/plugins/magicline/images/icon.png
Binary files differ
diff --git a/js/ckeditor/plugins/pastefromword/filter/default.js b/js/ckeditor/plugins/pastefromword/filter/default.js
new file mode 100644
index 0000000..9c58a16
--- /dev/null
+++ b/js/ckeditor/plugins/pastefromword/filter/default.js
@@ -0,0 +1,31 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+(function(){function y(a){for(var a=a.toUpperCase(),c=z.length,b=0,f=0;f<c;++f)for(var d=z[f],e=d[1].length;a.substr(0,e)==d[1];a=a.substr(e))b+=d[0];return b}function A(a){for(var a=a.toUpperCase(),c=B.length,b=1,f=1;0<a.length;f*=c)b+=B.indexOf(a.charAt(a.length-1))*f,a=a.substr(0,a.length-1);return b}var C=CKEDITOR.htmlParser.fragment.prototype,o=CKEDITOR.htmlParser.element.prototype;C.onlyChild=o.onlyChild=function(){var a=this.children;return 1==a.length&&a[0]||null};o.removeAnyChildWithName=
+function(a){for(var c=this.children,b=[],f,d=0;d<c.length;d++)f=c[d],f.name&&(f.name==a&&(b.push(f),c.splice(d--,1)),b=b.concat(f.removeAnyChildWithName(a)));return b};o.getAncestor=function(a){for(var c=this.parent;c&&(!c.name||!c.name.match(a));)c=c.parent;return c};C.firstChild=o.firstChild=function(a){for(var c,b=0;b<this.children.length;b++)if(c=this.children[b],a(c)||c.name&&(c=c.firstChild(a)))return c;return null};o.addStyle=function(a,c,b){var f="";if("string"==typeof c)f+=a+":"+c+";";else{if("object"==
+typeof a)for(var d in a)a.hasOwnProperty(d)&&(f+=d+":"+a[d]+";");else f+=a;b=c}this.attributes||(this.attributes={});a=this.attributes.style||"";a=(b?[f,a]:[a,f]).join(";");this.attributes.style=a.replace(/^;+|;(?=;)/g,"")};o.getStyle=function(a){var c=this.attributes.style;if(c)return c=CKEDITOR.tools.parseCssText(c,1),c[a]};CKEDITOR.dtd.parentOf=function(a){var c={},b;for(b in this)-1==b.indexOf("$")&&this[b][a]&&(c[b]=1);return c};var H=/^([.\d]*)+(em|ex|px|gd|rem|vw|vh|vm|ch|mm|cm|in|pt|pc|deg|rad|ms|s|hz|khz){1}?/i,
+D=/^(?:\b0[^\s]*\s*){1,4}$/,x={ol:{decimal:/\d+/,"lower-roman":/^m{0,4}(cm|cd|d?c{0,3})(xc|xl|l?x{0,3})(ix|iv|v?i{0,3})$/,"upper-roman":/^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$/,"lower-alpha":/^[a-z]+$/,"upper-alpha":/^[A-Z]+$/},ul:{disc:/[l\u00B7\u2002]/,circle:/[\u006F\u00D8]/,square:/[\u006E\u25C6]/}},z=[[1E3,"M"],[900,"CM"],[500,"D"],[400,"CD"],[100,"C"],[90,"XC"],[50,"L"],[40,"XL"],[10,"X"],[9,"IX"],[5,"V"],[4,"IV"],[1,"I"]],B="ABCDEFGHIJKLMNOPQRSTUVWXYZ",s=0,t=null,w,E=CKEDITOR.plugins.pastefromword=
+{utils:{createListBulletMarker:function(a,c){var b=new CKEDITOR.htmlParser.element("cke:listbullet");b.attributes={"cke:listsymbol":a[0]};b.add(new CKEDITOR.htmlParser.text(c));return b},isListBulletIndicator:function(a){if(/mso-list\s*:\s*Ignore/i.test(a.attributes&&a.attributes.style))return!0},isContainingOnlySpaces:function(a){var c;return(c=a.onlyChild())&&/^(:?\s|&nbsp;)+$/.test(c.value)},resolveList:function(a){var c=a.attributes,b;if((b=a.removeAnyChildWithName("cke:listbullet"))&&b.length&&
+(b=b[0]))return a.name="cke:li",c.style&&(c.style=E.filters.stylesFilter([["text-indent"],["line-height"],[/^margin(:?-left)?$/,null,function(a){a=a.split(" ");a=CKEDITOR.tools.convertToPx(a[3]||a[1]||a[0]);!s&&(null!==t&&a>t)&&(s=a-t);t=a;c["cke:indent"]=s&&Math.ceil(a/s)+1||1}],[/^mso-list$/,null,function(a){var a=a.split(" "),b=Number(a[0].match(/\d+/)),a=Number(a[1].match(/\d+/));1==a&&(b!==w&&(c["cke:reset"]=1),w=b);c["cke:indent"]=a}]])(c.style,a)||""),c["cke:indent"]||(t=0,c["cke:indent"]=
+1),CKEDITOR.tools.extend(c,b.attributes),!0;w=t=s=null;return!1},getStyleComponents:function(){var a=CKEDITOR.dom.element.createFromHtml('<div style="position:absolute;left:-9999px;top:-9999px;"></div>',CKEDITOR.document);CKEDITOR.document.getBody().append(a);return function(c,b,f){a.setStyle(c,b);for(var c={},b=f.length,d=0;d<b;d++)c[f[d]]=a.getStyle(f[d]);return c}}(),listDtdParents:CKEDITOR.dtd.parentOf("ol")},filters:{flattenList:function(a,c){var c="number"==typeof c?c:1,b=a.attributes,f;switch(b.type){case "a":f=
+"lower-alpha";break;case "1":f="decimal"}for(var d=a.children,e,h=0;h<d.length;h++)if(e=d[h],e.name in CKEDITOR.dtd.$listItem){var j=e.attributes,g=e.children,m=g[g.length-1];m.name in CKEDITOR.dtd.$list&&(a.add(m,h+1),--g.length||d.splice(h--,1));e.name="cke:li";b.start&&!h&&(j.value=b.start);E.filters.stylesFilter([["tab-stops",null,function(a){(a=a.split(" ")[1].match(H))&&(t=CKEDITOR.tools.convertToPx(a[0]))}],1==c?["mso-list",null,function(a){a=a.split(" ");a=Number(a[0].match(/\d+/));a!==w&&
+(j["cke:reset"]=1);w=a}]:null])(j.style);j["cke:indent"]=c;j["cke:listtype"]=a.name;j["cke:list-style-type"]=f}else if(e.name in CKEDITOR.dtd.$list){arguments.callee.apply(this,[e,c+1]);d=d.slice(0,h).concat(e.children).concat(d.slice(h+1));a.children=[];e=0;for(g=d.length;e<g;e++)a.add(d[e]);d=a.children}delete a.name;b["cke:list"]=1},assembleList:function(a){for(var c=a.children,b,f,d,e,h,j,a=[],g,m,i,l,k,p,n=0;n<c.length;n++)if(b=c[n],"cke:li"==b.name)if(b.name="li",f=b.attributes,i=(i=f["cke:listsymbol"])&&
+i.match(/^(?:[(]?)([^\s]+?)([.)]?)$/),l=k=p=null,f["cke:ignored"])c.splice(n--,1);else{f["cke:reset"]&&(j=e=h=null);d=Number(f["cke:indent"]);d!=e&&(m=g=null);if(i){if(m&&x[m][g].test(i[1]))l=m,k=g;else for(var q in x)for(var u in x[q])if(x[q][u].test(i[1]))if("ol"==q&&/alpha|roman/.test(u)){if(g=/roman/.test(u)?y(i[1]):A(i[1]),!p||g<p)p=g,l=q,k=u}else{l=q;k=u;break}!l&&(l=i[2]?"ol":"ul")}else l=f["cke:listtype"]||"ol",k=f["cke:list-style-type"];m=l;g=k||("ol"==l?"decimal":"disc");k&&k!=("ol"==l?
+"decimal":"disc")&&b.addStyle("list-style-type",k);if("ol"==l&&i){switch(k){case "decimal":p=Number(i[1]);break;case "lower-roman":case "upper-roman":p=y(i[1]);break;case "lower-alpha":case "upper-alpha":p=A(i[1])}b.attributes.value=p}if(j){if(d>e)a.push(j=new CKEDITOR.htmlParser.element(l)),j.add(b),h.add(j);else{if(d<e){e-=d;for(var r;e--&&(r=j.parent);)j=r.parent}j.add(b)}c.splice(n--,1)}else a.push(j=new CKEDITOR.htmlParser.element(l)),j.add(b),c[n]=j;h=b;e=d}else j&&(j=e=h=null);for(n=0;n<a.length;n++)if(j=
+a[n],q=j.children,g=g=void 0,u=j.children.length,r=g=void 0,c=/list-style-type:(.*?)(?:;|$)/,e=CKEDITOR.plugins.pastefromword.filters.stylesFilter,g=j.attributes,!c.exec(g.style)){for(h=0;h<u;h++)if(g=q[h],g.attributes.value&&Number(g.attributes.value)==h+1&&delete g.attributes.value,g=c.exec(g.attributes.style))if(g[1]==r||!r)r=g[1];else{r=null;break}if(r){for(h=0;h<u;h++)g=q[h].attributes,g.style&&(g.style=e([["list-style-type"]])(g.style)||"");j.addStyle("list-style-type",r)}}w=t=s=null},falsyFilter:function(){return!1},
+stylesFilter:function(a,c){return function(b,f){var d=[];(b||"").replace(/&quot;/g,'"').replace(/\s*([^ :;]+)\s*:\s*([^;]+)\s*(?=;|$)/g,function(b,e,g){e=e.toLowerCase();"font-family"==e&&(g=g.replace(/["']/g,""));for(var m,i,l,k=0;k<a.length;k++)if(a[k]&&(b=a[k][0],m=a[k][1],i=a[k][2],l=a[k][3],e.match(b)&&(!m||g.match(m)))){e=l||e;c&&(i=i||g);"function"==typeof i&&(i=i(g,f,e));i&&i.push&&(e=i[0],i=i[1]);"string"==typeof i&&d.push([e,i]);return}!c&&d.push([e,g])});for(var e=0;e<d.length;e++)d[e]=
+d[e].join(":");return d.length?d.join(";")+";":!1}},elementMigrateFilter:function(a,c){return a?function(b){var f=c?(new CKEDITOR.style(a,c))._.definition:a;b.name=f.element;CKEDITOR.tools.extend(b.attributes,CKEDITOR.tools.clone(f.attributes));b.addStyle(CKEDITOR.style.getStyleText(f))}:function(){}},styleMigrateFilter:function(a,c){var b=this.elementMigrateFilter;return a?function(f,d){var e=new CKEDITOR.htmlParser.element(null),h={};h[c]=f;b(a,h)(e);e.children=d.children;d.children=[e];e.filter=
+function(){};e.parent=d}:function(){}},bogusAttrFilter:function(a,c){if(-1==c.name.indexOf("cke:"))return!1},applyStyleFilter:null},getRules:function(a,c){var b=CKEDITOR.dtd,f=CKEDITOR.tools.extend({},b.$block,b.$listItem,b.$tableContent),d=a.config,e=this.filters,h=e.falsyFilter,j=e.stylesFilter,g=e.elementMigrateFilter,m=CKEDITOR.tools.bind(this.filters.styleMigrateFilter,this.filters),i=this.utils.createListBulletMarker,l=e.flattenList,k=e.assembleList,p=this.utils.isListBulletIndicator,n=this.utils.isContainingOnlySpaces,
+q=this.utils.resolveList,u=function(a){a=CKEDITOR.tools.convertToPx(a);return isNaN(a)?a:a+"px"},r=this.utils.getStyleComponents,t=this.utils.listDtdParents,o=!1!==d.pasteFromWordRemoveFontStyles,s=!1!==d.pasteFromWordRemoveStyles;return{elementNames:[[/meta|link|script/,""]],root:function(a){a.filterChildren(c);k(a)},elements:{"^":function(a){var c;CKEDITOR.env.gecko&&(c=e.applyStyleFilter)&&c(a)},$:function(a){var v=a.name||"",e=a.attributes;v in f&&e.style&&(e.style=j([[/^(:?width|height)$/,null,
+u]])(e.style)||"");if(v.match(/h\d/)){a.filterChildren(c);if(q(a))return;g(d["format_"+v])(a)}else if(v in b.$inline)a.filterChildren(c),n(a)&&delete a.name;else if(-1!=v.indexOf(":")&&-1==v.indexOf("cke")){a.filterChildren(c);if("v:imagedata"==v){if(v=a.attributes["o:href"])a.attributes.src=v;a.name="img";return}delete a.name}v in t&&(a.filterChildren(c),k(a))},style:function(a){if(CKEDITOR.env.gecko){var a=(a=a.onlyChild().value.match(/\/\* Style Definitions \*\/([\s\S]*?)\/\*/))&&a[1],c={};a&&
+(a.replace(/[\n\r]/g,"").replace(/(.+?)\{(.+?)\}/g,function(a,b,F){for(var b=b.split(","),a=b.length,d=0;d<a;d++)CKEDITOR.tools.trim(b[d]).replace(/^(\w+)(\.[\w-]+)?$/g,function(a,b,d){b=b||"*";d=d.substring(1,d.length);d.match(/MsoNormal/)||(c[b]||(c[b]={}),d?c[b][d]=F:c[b]=F)})}),e.applyStyleFilter=function(a){var b=c["*"]?"*":a.name,d=a.attributes&&a.attributes["class"];b in c&&(b=c[b],"object"==typeof b&&(b=b[d]),b&&a.addStyle(b,!0))})}return!1},p:function(a){if(/MsoListParagraph/i.exec(a.attributes["class"])||
+a.getStyle("mso-list")){var b=a.firstChild(function(a){return a.type==CKEDITOR.NODE_TEXT&&!n(a.parent)});(b=b&&b.parent)&&b.addStyle("mso-list","Ignore")}a.filterChildren(c);q(a)||(d.enterMode==CKEDITOR.ENTER_BR?(delete a.name,a.add(new CKEDITOR.htmlParser.element("br"))):g(d["format_"+(d.enterMode==CKEDITOR.ENTER_P?"p":"div")])(a))},div:function(a){var c=a.onlyChild();if(c&&"table"==c.name){var b=a.attributes;c.attributes=CKEDITOR.tools.extend(c.attributes,b);b.style&&c.addStyle(b.style);c=new CKEDITOR.htmlParser.element("div");
+c.addStyle("clear","both");a.add(c);delete a.name}},td:function(a){a.getAncestor("thead")&&(a.name="th")},ol:l,ul:l,dl:l,font:function(a){if(p(a.parent))delete a.name;else{a.filterChildren(c);var b=a.attributes,d=b.style,e=a.parent;"font"==e.name?(CKEDITOR.tools.extend(e.attributes,a.attributes),d&&e.addStyle(d),delete a.name):(d=(d||"").split(";"),b.color&&("#000000"!=b.color&&d.push("color:"+b.color),delete b.color),b.face&&(d.push("font-family:"+b.face),delete b.face),b.size&&(d.push("font-size:"+
+(3<b.size?"large":3>b.size?"small":"medium")),delete b.size),a.name="span",a.addStyle(d.join(";")))}},span:function(a){if(p(a.parent))return!1;a.filterChildren(c);if(n(a))return delete a.name,null;if(p(a)){var b=a.firstChild(function(a){return a.value||"img"==a.name}),e=(b=b&&(b.value||"l."))&&b.match(/^(?:[(]?)([^\s]+?)([.)]?)$/);if(e)return b=i(e,b),(a=a.getAncestor("span"))&&/ mso-hide:\s*all|display:\s*none /.test(a.attributes.style)&&(b.attributes["cke:ignored"]=1),b}if(e=(b=a.attributes)&&b.style)b.style=
+j([["line-height"],[/^font-family$/,null,!o?m(d.font_style,"family"):null],[/^font-size$/,null,!o?m(d.fontSize_style,"size"):null],[/^color$/,null,!o?m(d.colorButton_foreStyle,"color"):null],[/^background-color$/,null,!o?m(d.colorButton_backStyle,"color"):null]])(e,a)||"";b.style||delete b.style;CKEDITOR.tools.isEmpty(b)&&delete a.name;return null},b:g(d.coreStyles_bold),i:g(d.coreStyles_italic),u:g(d.coreStyles_underline),s:g(d.coreStyles_strike),sup:g(d.coreStyles_superscript),sub:g(d.coreStyles_subscript),
+a:function(a){a=a.attributes;a.href&&a.href.match(/^file:\/\/\/[\S]+#/i)&&(a.href=a.href.replace(/^file:\/\/\/[^#]+/i,""))},"cke:listbullet":function(a){a.getAncestor(/h\d/)&&!d.pasteFromWordNumberedHeadingToList&&delete a.name}},attributeNames:[[/^onmouse(:?out|over)/,""],[/^onload$/,""],[/(?:v|o):\w+/,""],[/^lang/,""]],attributes:{style:j(s?[[/^list-style-type$/,null],[/^margin$|^margin-(?!bottom|top)/,null,function(a,b,c){if(b.name in{p:1,div:1}){b="ltr"==d.contentsLangDirection?"margin-left":
+"margin-right";if("margin"==c)a=r(c,a,[b])[b];else if(c!=b)return null;if(a&&!D.test(a))return[b,a]}return null}],[/^clear$/],[/^border.*|margin.*|vertical-align|float$/,null,function(a,b){if("img"==b.name)return a}],[/^width|height$/,null,function(a,b){if(b.name in{table:1,td:1,th:1,img:1})return a}]]:[[/^mso-/],[/-color$/,null,function(a){if("transparent"==a)return!1;if(CKEDITOR.env.gecko)return a.replace(/-moz-use-text-color/g,"transparent")}],[/^margin$/,D],["text-indent","0cm"],["page-break-before"],
+["tab-stops"],["display","none"],o?[/font-?/]:null],s),width:function(a,c){if(c.name in b.$tableContent)return!1},border:function(a,c){if(c.name in b.$tableContent)return!1},"class":h,bgcolor:h,valign:s?h:function(a,b){b.addStyle("vertical-align",a);return!1}},comment:!CKEDITOR.env.ie?function(a,b){var c=a.match(/<img.*?>/),d=a.match(/^\[if !supportLists\]([\s\S]*?)\[endif\]$/);return d?(d=(c=d[1]||c&&"l.")&&c.match(/>(?:[(]?)([^\s]+?)([.)]?)</),i(d,c)):CKEDITOR.env.gecko&&c?(c=CKEDITOR.htmlParser.fragment.fromHtml(c[0]).children[0],
+(d=(d=(d=b.previous)&&d.value.match(/<v:imagedata[^>]*o:href=['"](.*?)['"]/))&&d[1])&&(c.attributes.src=d),c):!1}:h}}},G=function(){this.dataFilter=new CKEDITOR.htmlParser.filter};G.prototype={toHtml:function(a){var a=CKEDITOR.htmlParser.fragment.fromHtml(a),c=new CKEDITOR.htmlParser.basicWriter;a.writeHtml(c,this.dataFilter);return c.getHtml(!0)}};CKEDITOR.cleanWord=function(a,c){CKEDITOR.env.gecko&&(a=a.replace(/(<\!--\[if[^<]*?\])--\>([\S\s]*?)<\!--(\[endif\]--\>)/gi,"$1$2$3"));CKEDITOR.env.webkit&&
+(a=a.replace(/(class="MsoListParagraph[^>]+><\!--\[if !supportLists\]--\>)([^<]+<span[^<]+<\/span>)(<\!--\[endif\]--\>)/gi,"$1<span>$2</span>$3"));var b=new G,f=b.dataFilter;f.addRules(CKEDITOR.plugins.pastefromword.getRules(c,f));c.fire("beforeCleanWord",{filter:f});try{a=b.toHtml(a)}catch(d){alert(c.lang.pastefromword.error)}a=a.replace(/cke:.*?".*?"/g,"");a=a.replace(/style=""/g,"");return a=a.replace(/<span>/g,"")}})(); \ No newline at end of file
diff --git a/js/ckeditor/plugins/scayt/LICENSE.md b/js/ckeditor/plugins/scayt/LICENSE.md
new file mode 100644
index 0000000..610c807
--- /dev/null
+++ b/js/ckeditor/plugins/scayt/LICENSE.md
@@ -0,0 +1,28 @@
+Software License Agreement
+==========================
+
+**CKEditor SCAYT Plugin**
+Copyright &copy; 2012, [CKSource](http://cksource.com) - Frederico Knabben. All rights reserved.
+
+Licensed under the terms of any of the following licenses at your choice:
+
+* GNU General Public License Version 2 or later (the "GPL"):
+ http://www.gnu.org/licenses/gpl.html
+
+* GNU Lesser General Public License Version 2.1 or later (the "LGPL"):
+ http://www.gnu.org/licenses/lgpl.html
+
+* Mozilla Public License Version 1.1 or later (the "MPL"):
+ http://www.mozilla.org/MPL/MPL-1.1.html
+
+You are not required to, but if you want to explicitly declare the license you have chosen to be bound to when using, reproducing, modifying and distributing this software, just include a text file titled "legal.txt" in your version of this software, indicating your license choice.
+
+Sources of Intellectual Property Included in this plugin
+--------------------------------------------------------
+
+Where not otherwise indicated, all plugin content is authored by CKSource engineers and consists of CKSource-owned intellectual property. In some specific instances, the plugin will incorporate work done by developers outside of CKSource with their express permission.
+
+Trademarks
+----------
+
+CKEditor is a trademark of CKSource - Frederico Knabben. All other brand and product names are trademarks, registered trademarks or service marks of their respective holders.
diff --git a/js/ckeditor/plugins/scayt/README.md b/js/ckeditor/plugins/scayt/README.md
new file mode 100644
index 0000000..1b3de25
--- /dev/null
+++ b/js/ckeditor/plugins/scayt/README.md
@@ -0,0 +1,25 @@
+CKEditor SCAYT Plugin
+=====================
+
+This plugin brings Spell Check As You Type (SCAYT) into up to CKEditor 4+.
+
+SCAYT is a "installation-less", using the web-services of [WebSpellChecker.net](http://www.webspellchecker.net/). It's an out of the box solution.
+
+Installation
+------------
+
+1. Clone/copy this repository contents in a new "plugins/scayt" folder in your CKEditor installation.
+2. Enable the "scayt" plugin in the CKEditor configuration file (config.js):
+
+ config.extraPlugins = 'scayt';
+
+That's all. SCAYT will appear on the editor toolbar and will be ready to use.
+
+License
+-------
+
+Licensed under the terms of any of the following licenses at your choice: [GPL](http://www.gnu.org/licenses/gpl.html), [LGPL](http://www.gnu.org/licenses/lgpl.html) and [MPL](http://www.mozilla.org/MPL/MPL-1.1.html).
+
+See LICENSE.md for more information.
+
+Developed in cooperation with [WebSpellChecker.net](http://www.webspellchecker.net/).
diff --git a/js/ckeditor/plugins/scayt/dialogs/options.js b/js/ckeditor/plugins/scayt/dialogs/options.js
new file mode 100644
index 0000000..8178e1a
--- /dev/null
+++ b/js/ckeditor/plugins/scayt/dialogs/options.js
@@ -0,0 +1,17 @@
+CKEDITOR.dialog.add("scaytDialog",function(f){var g=f.scayt,k='<p><img src="'+g.getLogo()+'" /></p><p>'+g.getLocal("version")+g.getVersion()+"</p><p>"+g.getLocal("text_copyrights")+"</p>",l=CKEDITOR.document,i={isChanged:function(){return null===this.newLang||this.currentLang===this.newLang?!1:!0},currentLang:g.getLang(),newLang:null,reset:function(){this.currentLang=g.getLang();this.newLang=null},id:"lang"},k=[{id:"options",label:g.getLocal("tab_options"),onShow:function(){},elements:[{type:"vbox",
+id:"scaytOptions",children:function(){var a=g.getApplicationConfig(),e=[],c={"ignore-all-caps-words":"label_allCaps","ignore-domain-names":"label_ignoreDomainNames","ignore-words-with-mixed-cases":"label_mixedCase","ignore-words-with-numbers":"label_mixedWithDigits"},d;for(d in a){var b={type:"checkbox"};b.id=d;b.label=g.getLocal(c[d]);e.push(b)}return e}(),onShow:function(){this.getChild();for(var a=f.scayt,e=0;e<this.getChild().length;e++)this.getChild()[e].setValue(a.getApplicationConfig()[this.getChild()[e].id])}}]},
+{id:"langs",label:g.getLocal("tab_languages"),elements:[{id:"leftLangColumn",type:"vbox",align:"left",widths:["100"],children:[{type:"html",id:"langBox",style:"overflow: hidden; white-space: normal;",html:'<div><div style="float:left;width:45%;margin-left:5px;" id="left-col-'+f.name+'"></div><div style="float:left;width:45%;margin-left:15px;" id="right-col-'+f.name+'"></div></div>',onShow:function(){var a=f.scayt.getLang();l.getById("scaytLang_"+a).$.checked=!0}}]}]},{id:"dictionaries",label:g.getLocal("tab_dictionaries"),
+elements:[{type:"vbox",id:"rightCol_col__left",children:[{type:"html",id:"dictionaryNote",html:""},{type:"text",id:"dictionaryName",label:g.getLocal("label_fieldNameDic")||"Dictionary name",onShow:function(a){var e=a.sender,c=f.scayt;setTimeout(function(){e.getContentElement("dictionaries","dictionaryNote").getElement().setText("");null!=c.getUserDictionaryName()&&""!=c.getUserDictionaryName()&&e.getContentElement("dictionaries","dictionaryName").setValue(c.getUserDictionaryName())},0)}},{type:"hbox",
+id:"notExistDic",align:"left",style:"width:auto;",widths:["50%","50%"],children:[{type:"button",id:"createDic",label:g.getLocal("btn_createDic"),title:g.getLocal("btn_createDic"),onClick:function(){var a=this.getDialog(),e=j,c=f.scayt,d=a.getContentElement("dictionaries","dictionaryName").getValue();c.createUserDictionary(d,function(b){b.error||e.toggleDictionaryButtons.call(a,!0);b.dialog=a;b.command="create";b.name=d;f.fire("scaytUserDictionaryAction",b)},function(b){b.dialog=a;b.command="create";
+b.name=d;f.fire("scaytUserDictionaryActionError",b)})}},{type:"button",id:"restoreDic",label:g.getLocal("btn_restoreDic"),title:g.getLocal("btn_restoreDic"),onClick:function(){var a=this.getDialog(),e=f.scayt,c=j,d=a.getContentElement("dictionaries","dictionaryName").getValue();e.restoreUserDictionary(d,function(b){b.dialog=a;b.error||c.toggleDictionaryButtons.call(a,!0);b.command="restore";b.name=d;f.fire("scaytUserDictionaryAction",b)},function(b){b.dialog=a;b.command="restore";b.name=d;f.fire("scaytUserDictionaryActionError",
+b)})}}]},{type:"hbox",id:"existDic",align:"left",style:"width:auto;",widths:["50%","50%"],children:[{type:"button",id:"removeDic",label:g.getLocal("btn_deleteDic"),title:g.getLocal("btn_deleteDic"),onClick:function(){var a=this.getDialog(),e=f.scayt,c=j,d=a.getContentElement("dictionaries","dictionaryName"),b=d.getValue();e.removeUserDictionary(b,function(e){d.setValue("");e.error||c.toggleDictionaryButtons.call(a,!1);e.dialog=a;e.command="remove";e.name=b;f.fire("scaytUserDictionaryAction",e)},function(c){c.dialog=
+a;c.command="remove";c.name=b;f.fire("scaytUserDictionaryActionError",c)})}},{type:"button",id:"renameDic",label:g.getLocal("btn_renameDic"),title:g.getLocal("btn_renameDic"),onClick:function(){var a=this.getDialog(),e=f.scayt,c=a.getContentElement("dictionaries","dictionaryName").getValue();e.renameUserDictionary(c,function(d){d.dialog=a;d.command="rename";d.name=c;f.fire("scaytUserDictionaryAction",d)},function(d){d.dialog=a;d.command="rename";d.name=c;f.fire("scaytUserDictionaryActionError",d)})}}]},
+{type:"html",id:"dicInfo",html:'<div id="dic_info_editor1" style="margin:5px auto; width:95%;white-space:normal;">'+g.getLocal("text_descriptionDic")+"</div>"}]}]},{id:"about",label:g.getLocal("tab_about"),elements:[{type:"html",id:"about",style:"margin: 5px 5px;",html:'<div><div id="scayt_about_">'+k+"</div></div>"}]}];f.on("scaytUserDictionaryAction",function(a){var e=SCAYT.prototype.UILib,c=a.data.dialog,d=c.getContentElement("dictionaries","dictionaryNote").getElement(),b=a.editor.scayt,f;void 0===
+a.data.error?(f=b.getLocal("message_success_"+a.data.command+"Dic"),f=f.replace("%s",a.data.name),d.setText(f),e.css(d.$,{color:"blue"})):(""===a.data.name?d.setText(b.getLocal("message_info_emptyDic")):(f=b.getLocal("message_error_"+a.data.command+"Dic"),f=f.replace("%s",a.data.name),d.setText(f)),e.css(d.$,{color:"red"}),null!=b.getUserDictionaryName()&&""!=b.getUserDictionaryName()?c.getContentElement("dictionaries","dictionaryName").setValue(b.getUserDictionaryName()):c.getContentElement("dictionaries",
+"dictionaryName").setValue(""))});f.on("scaytUserDictionaryActionError",function(a){var e=SCAYT.prototype.UILib,c=a.data.dialog,d=c.getContentElement("dictionaries","dictionaryNote").getElement(),b=a.editor.scayt,f;""===a.data.name?d.setText(b.getLocal("message_info_emptyDic")):(f=b.getLocal("message_error_"+a.data.command+"Dic"),f=f.replace("%s",a.data.name),d.setText(f));e.css(d.$,{color:"red"});null!=b.getUserDictionaryName()&&""!=b.getUserDictionaryName()?c.getContentElement("dictionaries","dictionaryName").setValue(b.getUserDictionaryName()):
+c.getContentElement("dictionaries","dictionaryName").setValue("")});var j={title:g.getLocal("text_title"),resizable:CKEDITOR.DIALOG_RESIZE_BOTH,minWidth:340,minHeight:260,onLoad:function(){if(0!=f.config.scayt_uiTabs[1]){var a=j,e=a.getLangBoxes.call(this);e.getParent().setStyle("white-space","normal");a.renderLangList(e);this.definition.minWidth=this.getSize().width;this.resize(this.definition.minWidth,this.definition.minHeight)}},onCancel:function(){i.reset()},onHide:function(){f.unlockSelection()},
+onShow:function(){f.fire("scaytDialogShown",this);if(0!=f.config.scayt_uiTabs[2]){var a=f.scayt,e=this.getContentElement("dictionaries","dictionaryName"),c=this.getContentElement("dictionaries","existDic").getElement().getParent(),d=this.getContentElement("dictionaries","notExistDic").getElement().getParent();c.hide();d.hide();null!=a.getUserDictionaryName()&&""!=a.getUserDictionaryName()?(this.getContentElement("dictionaries","dictionaryName").setValue(a.getUserDictionaryName()),c.show()):(e.setValue(""),
+d.show())}},onOk:function(){var a=j,e=f.scayt;this.getContentElement("options","scaytOptions");a=a.getChangedOption.call(this);e.commitOption({changedOptions:a})},toggleDictionaryButtons:function(a){var e=this.getContentElement("dictionaries","existDic").getElement().getParent(),c=this.getContentElement("dictionaries","notExistDic").getElement().getParent();a?(e.show(),c.hide()):(e.hide(),c.show())},getChangedOption:function(){var a={};if(1==f.config.scayt_uiTabs[0])for(var e=this.getContentElement("options",
+"scaytOptions").getChild(),c=0;c<e.length;c++)e[c].isChanged()&&(a[e[c].id]=e[c].getValue());i.isChanged()&&(a[i.id]=f.config.scayt_sLang=i.currentLang=i.newLang);return a},buildRadioInputs:function(a,e){var c=new CKEDITOR.dom.element("div");CKEDITOR.document.createElement("div");var d="scaytLang_"+e,b=CKEDITOR.dom.element.createFromHtml('<input id="'+d+'" type="radio" value="'+e+'" name="scayt_lang" />'),g=new CKEDITOR.dom.element("label"),h=f.scayt;c.setStyles({"white-space":"normal",position:"relative",
+"padding-bottom":"2px"});b.on("click",function(a){i.newLang=a.sender.getValue()});g.appendText(a);g.setAttribute("for",d);c.append(b);c.append(g);e===h.getLang()&&(b.setAttribute("checked",!0),b.setAttribute("defaultChecked","defaultChecked"));return c},renderLangList:function(a){var e=a.find("#left-col-"+f.name).getItem(0),a=a.find("#right-col-"+f.name).getItem(0),c=g.getLangList(),d={},b=[],i=0,h;for(h in c.ltr)d[h]=c.ltr[h];for(h in c.rtl)d[h]=c.rtl[h];for(h in d)b.push([h,d[h]]);b.sort(function(a,
+c){var b=0;a[1]>c[1]?b=1:a[1]<c[1]&&(b=-1);return b});d={};for(c=0;c<b.length;c++)d[b[c][0]]=b[c][1];b=Math.round(b.length/2);for(h in d)i++,this.buildRadioInputs(d[h],h).appendTo(i<=b?e:a)},getLangBoxes:function(){return this.getContentElement("langs","langBox").getElement()},contents:function(a,e){var c=[],d=e.config.scayt_uiTabs;if(d){for(var b in d)1==d[b]&&c.push(a[b]);c.push(a[a.length-1])}else return a;return c}(k,f)};return j}); \ No newline at end of file
diff --git a/js/ckeditor/plugins/scayt/dialogs/toolbar.css b/js/ckeditor/plugins/scayt/dialogs/toolbar.css
new file mode 100644
index 0000000..861f43e
--- /dev/null
+++ b/js/ckeditor/plugins/scayt/dialogs/toolbar.css
@@ -0,0 +1,71 @@
+a
+{
+ text-decoration:none;
+ padding: 2px 4px 4px 6px;
+ display : block;
+ border-width: 1px;
+ border-style: solid;
+ margin : 0px;
+}
+
+a.cke_scayt_toogle:hover,
+a.cke_scayt_toogle:focus,
+a.cke_scayt_toogle:active
+{
+ border-color: #316ac5;
+ background-color: #dff1ff;
+ color : #000;
+ cursor: pointer;
+ margin : 0px;
+}
+a.cke_scayt_toogle {
+ color : #316ac5;
+ border-color: #fff;
+}
+.scayt_enabled a.cke_scayt_item {
+ color : #316ac5;
+ border-color: #fff;
+ margin : 0px;
+}
+.scayt_disabled a.cke_scayt_item {
+ color : gray;
+ border-color : #fff;
+}
+.scayt_enabled a.cke_scayt_item:hover,
+.scayt_enabled a.cke_scayt_item:focus,
+.scayt_enabled a.cke_scayt_item:active
+{
+ border-color: #316ac5;
+ background-color: #dff1ff;
+ color : #000;
+ cursor: pointer;
+}
+.scayt_disabled a.cke_scayt_item:hover,
+.scayt_disabled a.cke_scayt_item:focus,
+.scayt_disabled a.cke_scayt_item:active
+{
+ border-color: gray;
+ background-color: #dff1ff;
+ color : gray;
+ cursor: no-drop;
+}
+.cke_scayt_set_on, .cke_scayt_set_off
+{
+ display: none;
+}
+.scayt_enabled .cke_scayt_set_on
+{
+ display: none;
+}
+.scayt_disabled .cke_scayt_set_on
+{
+ display: inline;
+}
+.scayt_disabled .cke_scayt_set_off
+{
+ display: none;
+}
+.scayt_enabled .cke_scayt_set_off
+{
+ display: inline;
+}
diff --git a/js/ckeditor/plugins/specialchar/dialogs/lang/_translationstatus.txt b/js/ckeditor/plugins/specialchar/dialogs/lang/_translationstatus.txt
new file mode 100644
index 0000000..3ad20f5
--- /dev/null
+++ b/js/ckeditor/plugins/specialchar/dialogs/lang/_translationstatus.txt
@@ -0,0 +1,20 @@
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/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/js/ckeditor/plugins/specialchar/dialogs/lang/af.js b/js/ckeditor/plugins/specialchar/dialogs/lang/af.js
new file mode 100644
index 0000000..27bb901
--- /dev/null
+++ b/js/ckeditor/plugins/specialchar/dialogs/lang/af.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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/js/ckeditor/plugins/specialchar/dialogs/lang/ar.js b/js/ckeditor/plugins/specialchar/dialogs/lang/ar.js
new file mode 100644
index 0000000..8c3cc20
--- /dev/null
+++ b/js/ckeditor/plugins/specialchar/dialogs/lang/ar.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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/js/ckeditor/plugins/specialchar/dialogs/lang/bg.js b/js/ckeditor/plugins/specialchar/dialogs/lang/bg.js
new file mode 100644
index 0000000..74cc149
--- /dev/null
+++ b/js/ckeditor/plugins/specialchar/dialogs/lang/bg.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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:"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/js/ckeditor/plugins/specialchar/dialogs/lang/ca.js b/js/ckeditor/plugins/specialchar/dialogs/lang/ca.js
new file mode 100644
index 0000000..46dcb0a
--- /dev/null
+++ b/js/ckeditor/plugins/specialchar/dialogs/lang/ca.js
@@ -0,0 +1,14 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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/js/ckeditor/plugins/specialchar/dialogs/lang/cs.js b/js/ckeditor/plugins/specialchar/dialogs/lang/cs.js
new file mode 100644
index 0000000..c8d129e
--- /dev/null
+++ b/js/ckeditor/plugins/specialchar/dialogs/lang/cs.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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 Ae",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/js/ckeditor/plugins/specialchar/dialogs/lang/cy.js b/js/ckeditor/plugins/specialchar/dialogs/lang/cy.js
new file mode 100644
index 0000000..b873ac9
--- /dev/null
+++ b/js/ckeditor/plugins/specialchar/dialogs/lang/cy.js
@@ -0,0 +1,14 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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/js/ckeditor/plugins/specialchar/dialogs/lang/da.js b/js/ckeditor/plugins/specialchar/dialogs/lang/da.js
new file mode 100644
index 0000000..e20f604
--- /dev/null
+++ b/js/ckeditor/plugins/specialchar/dialogs/lang/da.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","da",{euro:"Euro-tegn",lsquo:"Left single quotation mark",rsquo:"Right single quotation mark",ldquo:"Left double quotation mark",rdquo:"Right double quotation mark",ndash:"Bindestreg",mdash:"Tankestreg",iexcl:"Inverted exclamation mark",cent:"Cent-tegn",pound:"Pund-tegn",curren:"Kurs-tegn",yen:"Yen-tegn",brvbar:"Brudt streg",sect:"Paragraftegn",uml:"Diaeresis",copy:"Copyright-tegn",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark",
+not:"Not sign",reg:"Registreret varemærke tegn",macr:"Macron",deg:"Grad-tegn",sup2:"Superscript to",sup3:"Superscript tre",acute:"Acute accent",micro:"Mikro-tegn",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript et",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:"Varemærke-tegn",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/js/ckeditor/plugins/specialchar/dialogs/lang/de.js b/js/ckeditor/plugins/specialchar/dialogs/lang/de.js
new file mode 100644
index 0000000..a056347
--- /dev/null
+++ b/js/ckeditor/plugins/specialchar/dialogs/lang/de.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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",pound:"Pfund",curren:"Währung",yen:"Yen",brvbar:"gestrichelte Linie",sect:"§ Zeichen",uml:"Diäresis",copy:"Copyright",ordf:"Feminine ordinal Anzeige",laquo:"Nach links zeigenden Doppel-Winkel AnfĂ¼hrungszeichen",not:"Not-Zeichen",
+reg:"Registriert",macr:"Längezeichen",deg:"Grad",sup2:"Hoch 2",sup3:"Hoch 3",acute:"Akzentzeichen ",micro:"Micro",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/js/ckeditor/plugins/specialchar/dialogs/lang/el.js b/js/ckeditor/plugins/specialchar/dialogs/lang/el.js
new file mode 100644
index 0000000..31e69ab
--- /dev/null
+++ b/js/ckeditor/plugins/specialchar/dialogs/lang/el.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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:"Feminine ordinal indicator",laquo:"ΑÏιστεÏός χαÏακτήÏας Î´Î¹Ï€Î»Î¿Ï ÎµÎ¹ÏƒÎ±Î³Ï‰Î³Î¹ÎºÎ¿Ï",not:"ΣÏμβολο άÏνησης",reg:"ΣÏμβολο σημάτων κατατεθέν",macr:"ΜακÏόν",deg:"ΣÏμβολο βαθμοÏ",sup2:"Εκτεθειμένο δÏο",sup3:"Εκτεθειμένο Ï„Ïία",acute:"Οξεία",micro:"ΣÏμβολο μικÏοÏ",para:"ΣÏμβολο παÏαγÏάφου",middot:"Μέση τελεία",cedil:"ΥπογεγÏαμμένη",sup1:"Εκτεθειμένο ένα",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",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:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"ΟÏιζόντια αποσιωπητικά",trade:"ΣÏμβολο εμποÏÎ¹ÎºÎ¿Ï ÎºÎ±Ï„Î±Ï„ÎµÎ¸Î­Î½",9658:"ΜαÏÏος δείκτης που δείχνει Ï€Ïος τα δεξιά",bull:"Îουκκίδα",rarr:"Δεξί βελάκι",rArr:"Διπλό δεξί βελάκι",hArr:"Διπλό βελάκι αÏιστεÏά-δεξιά",diams:"ΜαÏÏο διαμάντι",asymp:"Σχεδόν ίσο με"}); \ No newline at end of file
diff --git a/js/ckeditor/plugins/specialchar/dialogs/lang/en-gb.js b/js/ckeditor/plugins/specialchar/dialogs/lang/en-gb.js
new file mode 100644
index 0000000..08de561
--- /dev/null
+++ b/js/ckeditor/plugins/specialchar/dialogs/lang/en-gb.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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/js/ckeditor/plugins/specialchar/dialogs/lang/en.js b/js/ckeditor/plugins/specialchar/dialogs/lang/en.js
new file mode 100644
index 0000000..418406d
--- /dev/null
+++ b/js/ckeditor/plugins/specialchar/dialogs/lang/en.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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/js/ckeditor/plugins/specialchar/dialogs/lang/eo.js b/js/ckeditor/plugins/specialchar/dialogs/lang/eo.js
new file mode 100644
index 0000000..c5803d5
--- /dev/null
+++ b/js/ckeditor/plugins/specialchar/dialogs/lang/eo.js
@@ -0,0 +1,12 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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/js/ckeditor/plugins/specialchar/dialogs/lang/es.js b/js/ckeditor/plugins/specialchar/dialogs/lang/es.js
new file mode 100644
index 0000000..e91f1a0
--- /dev/null
+++ b/js/ckeditor/plugins/specialchar/dialogs/lang/es.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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/js/ckeditor/plugins/specialchar/dialogs/lang/et.js b/js/ckeditor/plugins/specialchar/dialogs/lang/et.js
new file mode 100644
index 0000000..2a20883
--- /dev/null
+++ b/js/ckeditor/plugins/specialchar/dialogs/lang/et.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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/js/ckeditor/plugins/specialchar/dialogs/lang/fa.js b/js/ckeditor/plugins/specialchar/dialogs/lang/fa.js
new file mode 100644
index 0000000..c3efb3c
--- /dev/null
+++ b/js/ckeditor/plugins/specialchar/dialogs/lang/fa.js
@@ -0,0 +1,12 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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/js/ckeditor/plugins/specialchar/dialogs/lang/fi.js b/js/ckeditor/plugins/specialchar/dialogs/lang/fi.js
new file mode 100644
index 0000000..79f4a7d
--- /dev/null
+++ b/js/ckeditor/plugins/specialchar/dialogs/lang/fi.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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/js/ckeditor/plugins/specialchar/dialogs/lang/fr-ca.js b/js/ckeditor/plugins/specialchar/dialogs/lang/fr-ca.js
new file mode 100644
index 0000000..24a0d0d
--- /dev/null
+++ b/js/ckeditor/plugins/specialchar/dialogs/lang/fr-ca.js
@@ -0,0 +1,10 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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/js/ckeditor/plugins/specialchar/dialogs/lang/fr.js b/js/ckeditor/plugins/specialchar/dialogs/lang/fr.js
new file mode 100644
index 0000000..b224b1e
--- /dev/null
+++ b/js/ckeditor/plugins/specialchar/dialogs/lang/fr.js
@@ -0,0 +1,11 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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 haut",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:"Section",uml:"Tréma",copy:"Symbole Copyright",ordf:"Indicateur ordinal féminin",laquo:"Guillemet français ouvrant",
+not:"Crochet de négation",reg:"Marque déposée",macr:"Macron",deg:"Degré",sup2:"Exposant 2",sup3:"\\tExposant 3",acute:"Accent aigu",micro:"Omicron",para:"Paragraphe",middot:"Point médian",cedil:"Cédille",sup1:"\\tExposant 1",ordm:"Indicateur ordinal masculin",raquo:"Guillemet français fermant",frac14:"Un quart",frac12:"Un demi",frac34:"Trois quarts",iquest:"Point d'interrogation inversé",Agrave:"A majuscule accent grave",Aacute:"A majuscule accent aigu",Acirc:"A majuscule accent circonflexe",Atilde:"A majuscule avec caron",
+Auml:"A majuscule tréma",Aring:"A majuscule avec un rond au-dessus",AElig:"Æ majuscule ligaturés",Ccedil:"C majuscule cédille",Egrave:"E majuscule accent grave",Eacute:"E majuscule accent aigu",Ecirc:"E majuscule accent circonflexe",Euml:"E majuscule tréma",Igrave:"I majuscule accent grave",Iacute:"I majuscule accent aigu",Icirc:"I majuscule accent circonflexe",Iuml:"I majuscule tréma",ETH:"Lettre majuscule islandaise ED",Ntilde:"N majuscule avec caron",Ograve:"O majuscule accent grave",Oacute:"O majuscule accent aigu",
+Ocirc:"O majuscule accent circonflexe",Otilde:"O majuscule avec caron",Ouml:"O majuscule tréma",times:"Multiplication",Oslash:"O majuscule barré",Ugrave:"U majuscule accent grave",Uacute:"U majuscule accent aigu",Ucirc:"U majuscule accent circonflexe",Uuml:"U majuscule tréma",Yacute:"Y majuscule accent aigu",THORN:"Lettre islandaise Thorn majuscule",szlig:"Lettre minuscule allemande s dur",agrave:"a minuscule accent grave",aacute:"a minuscule accent aigu",acirc:"a minuscule accent circonflexe",atilde:"a minuscule avec caron",
+auml:"a minuscule tréma",aring:"a minuscule avec un rond au-dessus",aelig:"æ minuscule ligaturés",ccedil:"c minuscule cédille",egrave:"e minuscule accent grave",eacute:"e minuscule accent aigu",ecirc:"e minuscule accent circonflexe",euml:"e minuscule tréma",igrave:"i minuscule accent grave",iacute:"i minuscule accent aigu",icirc:"i minuscule accent circonflexe",iuml:"i minuscule tréma",eth:"Lettre minuscule islandaise ED",ntilde:"n minuscule avec caron",ograve:"o minuscule accent grave",oacute:"o minuscule accent aigu",
+ocirc:"o minuscule accent circonflexe",otilde:"o minuscule avec caron",ouml:"o minuscule trĂ©ma",divide:"Division",oslash:"o minuscule barrĂ©",ugrave:"u minuscule accent grave",uacute:"u minuscule accent aigu",ucirc:"u minuscule accent circonflexe",uuml:"u minuscule trĂ©ma",yacute:"y minuscule accent aigu",thorn:"Lettre islandaise thorn minuscule",yuml:"y minuscule trĂ©ma",OElig:"ligature majuscule latine Å’",oelig:"ligature minuscule latine Å“",372:"W majuscule accent circonflexe",374:"Y majuscule accent circonflexe",
+373:"w minuscule accent circonflexe",375:"y minuscule accent circonflexe",sbquo:"Guillemet simple fermant (anglais)",8219:"Guillemet-virgule supérieur culbuté",bdquo:"Guillemet-virgule double inférieur",hellip:"Points de suspension",trade:"Marque commerciale (trade mark)",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:"Carreau noir",asymp:"Presque égal"}); \ No newline at end of file
diff --git a/js/ckeditor/plugins/specialchar/dialogs/lang/gl.js b/js/ckeditor/plugins/specialchar/dialogs/lang/gl.js
new file mode 100644
index 0000000..797ecc5
--- /dev/null
+++ b/js/ckeditor/plugins/specialchar/dialogs/lang/gl.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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/js/ckeditor/plugins/specialchar/dialogs/lang/he.js b/js/ckeditor/plugins/specialchar/dialogs/lang/he.js
new file mode 100644
index 0000000..7593589
--- /dev/null
+++ b/js/ckeditor/plugins/specialchar/dialogs/lang/he.js
@@ -0,0 +1,12 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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/js/ckeditor/plugins/specialchar/dialogs/lang/hr.js b/js/ckeditor/plugins/specialchar/dialogs/lang/hr.js
new file mode 100644
index 0000000..6575432
--- /dev/null
+++ b/js/ckeditor/plugins/specialchar/dialogs/lang/hr.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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:"Feminine ordinal indicator",laquo:"Lijevi dvostruki uglati navodnik",not:"Not znak",
+reg:"Registered znak",macr:"Macron",deg:"Stupanj znak",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"Mikro znak",para:"Pilcrow sign",middot:"Srednja toÄka",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Desni dvostruku uglati navodnik",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Naopaki upitnik",Agrave:"Veliko latinsko slovo A s akcentom",Aacute:"LatiniÄno veliko slovo A sa oÅ¡trim naglaskom",
+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/js/ckeditor/plugins/specialchar/dialogs/lang/hu.js b/js/ckeditor/plugins/specialchar/dialogs/lang/hu.js
new file mode 100644
index 0000000..4455483
--- /dev/null
+++ b/js/ckeditor/plugins/specialchar/dialogs/lang/hu.js
@@ -0,0 +1,12 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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/js/ckeditor/plugins/specialchar/dialogs/lang/id.js b/js/ckeditor/plugins/specialchar/dialogs/lang/id.js
new file mode 100644
index 0000000..1b4bd67
--- /dev/null
+++ b/js/ckeditor/plugins/specialchar/dialogs/lang/id.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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/js/ckeditor/plugins/specialchar/dialogs/lang/it.js b/js/ckeditor/plugins/specialchar/dialogs/lang/it.js
new file mode 100644
index 0000000..6b09097
--- /dev/null
+++ b/js/ckeditor/plugins/specialchar/dialogs/lang/it.js
@@ -0,0 +1,14 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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 AE",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/js/ckeditor/plugins/specialchar/dialogs/lang/ja.js b/js/ckeditor/plugins/specialchar/dialogs/lang/ja.js
new file mode 100644
index 0000000..b32e890
--- /dev/null
+++ b/js/ckeditor/plugins/specialchar/dialogs/lang/ja.js
@@ -0,0 +1,9 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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/js/ckeditor/plugins/specialchar/dialogs/lang/km.js b/js/ckeditor/plugins/specialchar/dialogs/lang/km.js
new file mode 100644
index 0000000..8d6a3d1
--- /dev/null
+++ b/js/ckeditor/plugins/specialchar/dialogs/lang/km.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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/js/ckeditor/plugins/specialchar/dialogs/lang/ku.js b/js/ckeditor/plugins/specialchar/dialogs/lang/ku.js
new file mode 100644
index 0000000..5bed679
--- /dev/null
+++ b/js/ckeditor/plugins/specialchar/dialogs/lang/ku.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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/js/ckeditor/plugins/specialchar/dialogs/lang/lt.js b/js/ckeditor/plugins/specialchar/dialogs/lang/lt.js
new file mode 100644
index 0000000..f575dfd
--- /dev/null
+++ b/js/ckeditor/plugins/specialchar/dialogs/lang/lt.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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/js/ckeditor/plugins/specialchar/dialogs/lang/lv.js b/js/ckeditor/plugins/specialchar/dialogs/lang/lv.js
new file mode 100644
index 0000000..7ea58a0
--- /dev/null
+++ b/js/ckeditor/plugins/specialchar/dialogs/lang/lv.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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/js/ckeditor/plugins/specialchar/dialogs/lang/nb.js b/js/ckeditor/plugins/specialchar/dialogs/lang/nb.js
new file mode 100644
index 0000000..f9fd879
--- /dev/null
+++ b/js/ckeditor/plugins/specialchar/dialogs/lang/nb.js
@@ -0,0 +1,11 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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/js/ckeditor/plugins/specialchar/dialogs/lang/nl.js b/js/ckeditor/plugins/specialchar/dialogs/lang/nl.js
new file mode 100644
index 0000000..ba75bf3
--- /dev/null
+++ b/js/ckeditor/plugins/specialchar/dialogs/lang/nl.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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/js/ckeditor/plugins/specialchar/dialogs/lang/no.js b/js/ckeditor/plugins/specialchar/dialogs/lang/no.js
new file mode 100644
index 0000000..404b4fd
--- /dev/null
+++ b/js/ckeditor/plugins/specialchar/dialogs/lang/no.js
@@ -0,0 +1,11 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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/js/ckeditor/plugins/specialchar/dialogs/lang/pl.js b/js/ckeditor/plugins/specialchar/dialogs/lang/pl.js
new file mode 100644
index 0000000..76e2acd
--- /dev/null
+++ b/js/ckeditor/plugins/specialchar/dialogs/lang/pl.js
@@ -0,0 +1,12 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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 w lewo",diams:"Czarny znak karo",asymp:"Znak prawie rĂ³wne"}); \ No newline at end of file
diff --git a/js/ckeditor/plugins/specialchar/dialogs/lang/pt-br.js b/js/ckeditor/plugins/specialchar/dialogs/lang/pt-br.js
new file mode 100644
index 0000000..41f8c33
--- /dev/null
+++ b/js/ckeditor/plugins/specialchar/dialogs/lang/pt-br.js
@@ -0,0 +1,11 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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/js/ckeditor/plugins/specialchar/dialogs/lang/pt.js b/js/ckeditor/plugins/specialchar/dialogs/lang/pt.js
new file mode 100644
index 0000000..9c73f0c
--- /dev/null
+++ b/js/ckeditor/plugins/specialchar/dialogs/lang/pt.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","pt",{euro:"SĂ­mbolo do 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 do CĂªntimo",pound:"SĂ­mbolo da Libra",curren:"SĂ­mbolo de Moeda",yen:"SĂ­mbolo do Iene",brvbar:"Barra quebrada",sect:"SĂ­mbolo de SecĂ§Ă£o",uml:"Trema",copy:"SĂ­mbolo dos 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 Grau",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 pra 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/js/ckeditor/plugins/specialchar/dialogs/lang/ru.js b/js/ckeditor/plugins/specialchar/dialogs/lang/ru.js
new file mode 100644
index 0000000..30633fd
--- /dev/null
+++ b/js/ckeditor/plugins/specialchar/dialogs/lang/ru.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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/js/ckeditor/plugins/specialchar/dialogs/lang/si.js b/js/ckeditor/plugins/specialchar/dialogs/lang/si.js
new file mode 100644
index 0000000..12789fb
--- /dev/null
+++ b/js/ckeditor/plugins/specialchar/dialogs/lang/si.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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/js/ckeditor/plugins/specialchar/dialogs/lang/sk.js b/js/ckeditor/plugins/specialchar/dialogs/lang/sk.js
new file mode 100644
index 0000000..6e5b534
--- /dev/null
+++ b/js/ckeditor/plugins/specialchar/dialogs/lang/sk.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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/js/ckeditor/plugins/specialchar/dialogs/lang/sl.js b/js/ckeditor/plugins/specialchar/dialogs/lang/sl.js
new file mode 100644
index 0000000..bdebbd1
--- /dev/null
+++ b/js/ckeditor/plugins/specialchar/dialogs/lang/sl.js
@@ -0,0 +1,12 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","sl",{euro:"Evro znak",lsquo:"Levi enojni narekovaj",rsquo:"Desni enojni narekovaj",ldquo:"Levi dvojni narekovaj",rdquo:"Desni dvojni narekovaj",ndash:"En pomiÅ¡ljaj",mdash:"Em pomiÅ¡ljaj",iexcl:"Obrnjen klicaj",cent:"Cent znak",pound:"Funt znak",curren:"Znak valute",yen:"Jen znak",brvbar:"Zlomljena Ärta",sect:"Znak oddelka",uml:"Diaeresis",copy:"Znak avtorskih pravic",ordf:"Ženski zaporedni kazalnik",laquo:"Levi obrnjen dvojni kotni narekovaj",not:"Ne znak",reg:"Registrirani znak",
+macr:"Macron",deg:"Znak stopinj",sup2:"Nadpisano dva",sup3:"Nadpisano tri",acute:"Ostrivec",micro:"Mikro znak",para:"Pilcrow znak",middot:"Sredinska 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/js/ckeditor/plugins/specialchar/dialogs/lang/sq.js b/js/ckeditor/plugins/specialchar/dialogs/lang/sq.js
new file mode 100644
index 0000000..967a048
--- /dev/null
+++ b/js/ckeditor/plugins/specialchar/dialogs/lang/sq.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark",
+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:"Pilcrow sign",middot:"Pika e Mesme",cedil:"Hark nën shkronja",sup1:"Super-skripta një",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",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:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",trade:"Shenja e Simbolit Tregtarë",9658:"Black right-pointing pointer",bull:"Pulla",rarr:"Shigjeta djathtas",rArr:"Shenja të dyfishta djathtas",hArr:"Shigjeta e dyfishë majtas-djathtas",diams:"Black diamond suit",asymp:"Gati e barabar me"}); \ No newline at end of file
diff --git a/js/ckeditor/plugins/specialchar/dialogs/lang/sv.js b/js/ckeditor/plugins/specialchar/dialogs/lang/sv.js
new file mode 100644
index 0000000..d177c86
--- /dev/null
+++ b/js/ckeditor/plugins/specialchar/dialogs/lang/sv.js
@@ -0,0 +1,11 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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/js/ckeditor/plugins/specialchar/dialogs/lang/th.js b/js/ckeditor/plugins/specialchar/dialogs/lang/th.js
new file mode 100644
index 0000000..1d43ac9
--- /dev/null
+++ b/js/ckeditor/plugins/specialchar/dialogs/lang/th.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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/js/ckeditor/plugins/specialchar/dialogs/lang/tr.js b/js/ckeditor/plugins/specialchar/dialogs/lang/tr.js
new file mode 100644
index 0000000..65c1a19
--- /dev/null
+++ b/js/ckeditor/plugins/specialchar/dialogs/lang/tr.js
@@ -0,0 +1,12 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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/js/ckeditor/plugins/specialchar/dialogs/lang/tt.js b/js/ckeditor/plugins/specialchar/dialogs/lang/tt.js
new file mode 100644
index 0000000..303d655
--- /dev/null
+++ b/js/ckeditor/plugins/specialchar/dialogs/lang/tt.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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/js/ckeditor/plugins/specialchar/dialogs/lang/ug.js b/js/ckeditor/plugins/specialchar/dialogs/lang/ug.js
new file mode 100644
index 0000000..757e83f
--- /dev/null
+++ b/js/ckeditor/plugins/specialchar/dialogs/lang/ug.js
@@ -0,0 +1,13 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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/js/ckeditor/plugins/specialchar/dialogs/lang/uk.js b/js/ckeditor/plugins/specialchar/dialogs/lang/uk.js
new file mode 100644
index 0000000..2343e56
--- /dev/null
+++ b/js/ckeditor/plugins/specialchar/dialogs/lang/uk.js
@@ -0,0 +1,12 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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/js/ckeditor/plugins/specialchar/dialogs/lang/vi.js b/js/ckeditor/plugins/specialchar/dialogs/lang/vi.js
new file mode 100644
index 0000000..a71305b
--- /dev/null
+++ b/js/ckeditor/plugins/specialchar/dialogs/lang/vi.js
@@ -0,0 +1,14 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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/js/ckeditor/plugins/specialchar/dialogs/lang/zh-cn.js b/js/ckeditor/plugins/specialchar/dialogs/lang/zh-cn.js
new file mode 100644
index 0000000..d794a3d
--- /dev/null
+++ b/js/ckeditor/plugins/specialchar/dialogs/lang/zh-cn.js
@@ -0,0 +1,9 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/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:"拉ä¸æ–‡å¤§å†™å­—æ¯ 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",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/js/ckeditor/plugins/specialchar/dialogs/lang/zh.js b/js/ckeditor/plugins/specialchar/dialogs/lang/zh.js
new file mode 100644
index 0000000..94c0cfb
--- /dev/null
+++ b/js/ckeditor/plugins/specialchar/dialogs/lang/zh.js
@@ -0,0 +1,12 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.plugins.setLang("specialchar","zh",{euro:"æ­å…ƒç¬¦è™Ÿ",lsquo:"左單引號",rsquo:"å³å–®å¼•è™Ÿ",ldquo:"左雙引號",rdquo:"å³é›™å¼•è™Ÿ",ndash:"短破æ˜è™Ÿ",mdash:"é•·ç ´æ˜è™Ÿ",iexcl:"倒置ç„é©å˜†è™Ÿ",cent:"ç¾åˆ†ç¬¦è™Ÿ",pound:"英é符號",curren:"貨幣符號",yen:"日圓符號",brvbar:"Broken bar",sect:"章節符號",uml:"分音符號",copy:"版æ¬ç¬¦è™Ÿ",ordf:"雌性符號",laquo:"左雙角括號",not:"Not 符號",reg:"註å†å•†æ¨™ç¬¦è™Ÿ",macr:"長音符號",deg:"度數符號",sup2:"ä¸æ¨™å­— 2",sup3:"ä¸æ¨™å­— 3",acute:"尖音符號",micro:"Micro sign",para:"段è½ç¬¦è™Ÿ",middot:"中間é»",cedil:"å­—æ¯ C 下é¢ç„å°¾å‹ç¬¦è™Ÿ ",sup1:"ä¸æ¨™",ordm:"雄性符號",raquo:"å³é›™è§’括號",frac14:"四分之一符號",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:"拉ä¸å¤§å¯«å­—æ¯ E 帶分音符號",Aring:"拉ä¸å¤§å¯«å­—æ¯ A 帶ä¸åœ“圈",AElig:"拉ä¸å¤§å¯«å­—æ¯ Ă†",Ccedil:"拉ä¸å¤§å¯«å­—æ¯ C 帶下尾符號",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:"乘號",Oslash:"拉ä¸å¤§å¯«å­—æ¯ O 帶粗ç·ç¬¦è™Ÿ",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/js/ckeditor/plugins/specialchar/dialogs/specialchar.js b/js/ckeditor/plugins/specialchar/dialogs/specialchar.js
new file mode 100644
index 0000000..b343a83
--- /dev/null
+++ b/js/ckeditor/plugins/specialchar/dialogs/specialchar.js
@@ -0,0 +1,14 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.dialog.add("specialchar",function(i){var e,l=i.lang.specialchar,k=function(c){var b,c=c.data?c.data.getTarget():new CKEDITOR.dom.element(c);if("a"==c.getName()&&(b=c.getChild(0).getHtml()))c.removeClass("cke_light_background"),e.hide(),c=i.document.createElement("span"),c.setHtml(b),i.insertText(c.getText())},m=CKEDITOR.tools.addFunction(k),j,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())){j&&d(null,j);
+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");j=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("&nbsp;"),e.getContentElement("info","htmlPreview").getElement().setHtml("&nbsp;"),b.getParent().removeClass("cke_light_background"),
+j=void 0)},n=CKEDITOR.tools.addFunction(function(c){var c=new CKEDITOR.dom.event(c),b=c.getTarget(),a;a=c.getKeystroke();var f="rtl"==i.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:if(a=b.getParent().getParent().getNext())if((a=a.getChild([b.getParent().getIndex(),0]))&&1==a.type)a.focus(),d(null,b),g(null,a);c.preventDefault();break;case 32:k({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:l.title,minWidth:430,minHeight:280,buttons:[CKEDITOR.dialog.cancelButton],charColumns:17,onLoad:function(){for(var c=this.definition.charColumns,b=i.config.specialChars,a=CKEDITOR.tools.getNextId()+"_specialchar_table_label",f=['<table role="listbox" aria-labelledby="'+a+'" style="width: 320px; height: 100%; border-collapse: separate;" align="center" cellspacing="2" cellpadding="2" border="0">'],d=0,g=b.length,h,e;d<g;){f.push('<tr role="presentation">');for(var j=0;j<c;j++,
+d++){if(h=b[d]){h instanceof Array?(e=h[1],h=h[0]):(e=h.replace("&","").replace(";","").replace("#",""),e=l[e]||h);var k="cke_specialchar_label_"+d+"_"+CKEDITOR.tools.getNextNumber();f.push('<td class="cke_dark_background" style="cursor: default" role="presentation"><a href="javascript: void(0);" role="option" aria-posinset="'+(d+1)+'"',' aria-setsize="'+g+'"',' aria-labelledby="'+k+'"',' class="cke_specialchar" title="',CKEDITOR.tools.htmlEncode(e),'" onkeydown="CKEDITOR.tools.callFunction( '+n+
+', event, this )" onclick="CKEDITOR.tools.callFunction('+m+', this); return false;" tabindex="-1"><span style="margin: 0 auto;cursor: inherit">'+h+'</span><span class="cke_voice_label" id="'+k+'">'+e+"</span></a>")}else f.push('<td class="cke_dark_background">&nbsp;');f.push("</td>")}f.push("</tr>")}f.push("</tbody></table>",'<span id="'+a+'" class="cke_voice_label">'+l.options+"</span>");this.getContentElement("info","charContainer").getElement().setHtml(f.join(""))},contents:[{id:"info",label:i.lang.common.generalTab,
+title:i.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:"<div></div>"},{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:"<div>&nbsp;</div>"},{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:"<div>&nbsp;</div>"}]}]}]}]}]}}); \ No newline at end of file
diff --git a/js/ckeditor/plugins/table/dialogs/table.js b/js/ckeditor/plugins/table/dialogs/table.js
new file mode 100644
index 0000000..2a33528
--- /dev/null
+++ b/js/ckeditor/plugins/table/dialogs/table.js
@@ -0,0 +1,21 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+(function(){function r(a){for(var e=0,l=0,k=0,m,g=a.$.rows.length;k<g;k++){m=a.$.rows[k];for(var d=e=0,c,b=m.cells.length;d<b;d++)c=m.cells[d],e+=c.colSpan;e>l&&(l=e)}return l}function o(a){return function(){var e=this.getValue(),e=!!(CKEDITOR.dialog.validate.integer()(e)&&0<e);e||(alert(a),this.select());return e}}function n(a,e){var l=function(g){return new CKEDITOR.dom.element(g,a.document)},n=a.editable(),m=a.plugins.dialogadvtab;return{title:a.lang.table.title,minWidth:310,minHeight:CKEDITOR.env.ie?
+310:280,onLoad:function(){var g=this,a=g.getContentElement("advanced","advStyles");if(a)a.on("change",function(){var a=this.getStyle("width",""),b=g.getContentElement("info","txtWidth");b&&b.setValue(a,!0);a=this.getStyle("height","");(b=g.getContentElement("info","txtHeight"))&&b.setValue(a,!0)})},onShow:function(){var g=a.getSelection(),d=g.getRanges(),c,b=this.getContentElement("info","txtRows"),h=this.getContentElement("info","txtCols"),p=this.getContentElement("info","txtWidth"),f=this.getContentElement("info",
+"txtHeight");"tableProperties"==e&&((g=g.getSelectedElement())&&g.is("table")?c=g:0<d.length&&(CKEDITOR.env.webkit&&d[0].shrink(CKEDITOR.NODE_ELEMENT),c=a.elementPath(d[0].getCommonAncestor(!0)).contains("table",1)),this._.selectedElement=c);c?(this.setupContent(c),b&&b.disable(),h&&h.disable()):(b&&b.enable(),h&&h.enable());p&&p.onChange();f&&f.onChange()},onOk:function(){var g=a.getSelection(),d=this._.selectedElement&&g.createBookmarks(),c=this._.selectedElement||l("table"),b={};this.commitContent(b,
+c);if(b.info){b=b.info;if(!this._.selectedElement)for(var h=c.append(l("tbody")),e=parseInt(b.txtRows,10)||0,f=parseInt(b.txtCols,10)||0,i=0;i<e;i++)for(var j=h.append(l("tr")),k=0;k<f;k++)j.append(l("td")).appendBogus();e=b.selHeaders;if(!c.$.tHead&&("row"==e||"both"==e)){j=new CKEDITOR.dom.element(c.$.createTHead());h=c.getElementsByTag("tbody").getItem(0);h=h.getElementsByTag("tr").getItem(0);for(i=0;i<h.getChildCount();i++)f=h.getChild(i),f.type==CKEDITOR.NODE_ELEMENT&&!f.data("cke-bookmark")&&
+(f.renameNode("th"),f.setAttribute("scope","col"));j.append(h.remove())}if(null!==c.$.tHead&&!("row"==e||"both"==e)){j=new CKEDITOR.dom.element(c.$.tHead);h=c.getElementsByTag("tbody").getItem(0);for(k=h.getFirst();0<j.getChildCount();){h=j.getFirst();for(i=0;i<h.getChildCount();i++)f=h.getChild(i),f.type==CKEDITOR.NODE_ELEMENT&&(f.renameNode("td"),f.removeAttribute("scope"));h.insertBefore(k)}j.remove()}if(!this.hasColumnHeaders&&("col"==e||"both"==e))for(j=0;j<c.$.rows.length;j++)f=new CKEDITOR.dom.element(c.$.rows[j].cells[0]),
+f.renameNode("th"),f.setAttribute("scope","row");if(this.hasColumnHeaders&&!("col"==e||"both"==e))for(i=0;i<c.$.rows.length;i++)j=new CKEDITOR.dom.element(c.$.rows[i]),"tbody"==j.getParent().getName()&&(f=new CKEDITOR.dom.element(j.$.cells[0]),f.renameNode("td"),f.removeAttribute("scope"));b.txtHeight?c.setStyle("height",b.txtHeight):c.removeStyle("height");b.txtWidth?c.setStyle("width",b.txtWidth):c.removeStyle("width");c.getAttribute("style")||c.removeAttribute("style")}if(this._.selectedElement)try{g.selectBookmarks(d)}catch(m){}else a.insertElement(c),
+setTimeout(function(){var g=new CKEDITOR.dom.element(c.$.rows[0].cells[0]),b=a.createRange();b.moveToPosition(g,CKEDITOR.POSITION_AFTER_START);b.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:o(a.lang.table.invalidRows),setup:function(a){this.setValue(a.$.rows.length)},
+commit:k},{type:"text",id:"txtCols","default":2,label:a.lang.table.columns,required:!0,controlStyle:"width:5em",validate:o(a.lang.table.invalidCols),setup:function(a){this.setValue(r(a))},commit:k},{type:"html",html:"&nbsp;"},{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(a){var d=this.getDialog();d.hasColumnHeaders=
+!0;for(var c=0;c<a.$.rows.length;c++){var b=a.$.rows[c].cells[0];if(b&&"th"!=b.nodeName.toLowerCase()){d.hasColumnHeaders=!1;break}}null!==a.$.tHead?this.setValue(d.hasColumnHeaders?"both":"row"):this.setValue(d.hasColumnHeaders?"col":"")},commit:k},{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.alignLeft,"left"],[a.lang.common.alignCenter,"center"],[a.lang.common.alignRight,"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>n.getSize("width")?"100%":500:0,getValue:q,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){this.setValue(a.getStyle("width"))},commit:k}]},{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:q,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:k}]},{type:"html",html:"&nbsp;"},{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()){var a=a.getItem(0),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 c=this.getValue(),b=d.getElementsByTag("caption");
+if(c)0<b.count()?(b=b.getItem(0),b.setHtml("")):(b=new CKEDITOR.dom.element("caption",a.document),d.getChildCount()?b.insertBefore(d.getFirst()):b.appendTo(d)),b.append(new CKEDITOR.dom.text(c,a.document));else if(0<b.count())for(c=b.count()-1;0<=c;c--)b.getItem(c).remove()}}},{type:"text",id:"txtSummary",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")}}]}]},m&&m.createAdvancedTab(a,null,"table")]}}var q=CKEDITOR.tools.cssLength,k=function(a){var e=this.id;a.info||(a.info={});a.info[e]=this.getValue()};CKEDITOR.dialog.add("table",function(a){return n(a,"table")});CKEDITOR.dialog.add("tableProperties",function(a){return n(a,"tableProperties")})})(); \ No newline at end of file
diff --git a/js/ckeditor/plugins/tabletools/dialogs/tableCell.js b/js/ckeditor/plugins/tabletools/dialogs/tableCell.js
new file mode 100644
index 0000000..6efe765
--- /dev/null
+++ b/js/ckeditor/plugins/tabletools/dialogs/tableCell.js
@@ -0,0 +1,17 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+CKEDITOR.dialog.add("cellProperties",function(g){function d(a){return function(b){for(var c=a(b[0]),d=1;d<b.length;d++)if(a(b[d])!==c){c=null;break}"undefined"!=typeof c&&(this.setValue(c),CKEDITOR.env.gecko&&("select"==this.type&&!c)&&(this.getInputElement().$.selectedIndex=-1))}}function j(a){if(a=l.exec(a.getStyle("width")||a.getAttribute("width")))return a[2]}var h=g.lang.table,c=h.cell,e=g.lang.common,i=CKEDITOR.dialog.validate,l=/^(\d+(?:\.\d+)?)(px|%)$/,f={type:"html",html:"&nbsp;"},m="rtl"==
+g.lang.dir,k=g.plugins.colordialog;return{title:c.title,minWidth:CKEDITOR.env.ie&&CKEDITOR.env.quirks?450:410,minHeight:CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.quirks)?230:220,contents:[{id:"info",label:c.title,accessKey:"I",elements:[{type:"hbox",widths:["40%","5%","40%"],children:[{type:"vbox",padding:0,children:[{type:"hbox",widths:["70%","30%"],children:[{type:"text",id:"width",width:"100px",label:e.width,validate:i.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:d(function(a){var b=parseInt(a.getAttribute("width"),10),a=parseInt(a.getStyle("width"),10);return!isNaN(a)?a:!isNaN(b)?b:""}),commit:function(a){var b=parseInt(this.getValue(),10),c=this.getDialog().getValueOf("info","widthType")||j(a);isNaN(b)?a.removeStyle("width"):a.setStyle("width",b+c);a.removeAttribute("width")},"default":""},{type:"select",id:"widthType",
+label:g.lang.table.widthUnit,labelStyle:"visibility:hidden","default":"px",items:[[h.widthPx,"px"],[h.widthPc,"%"]],setup:d(j)}]},{type:"hbox",widths:["70%","30%"],children:[{type:"text",id:"height",label:e.height,width:"100px","default":"",validate:i.number(c.invalidHeight),onLoad:function(){var a=this.getDialog().getContentElement("info","htmlHeightType").getElement(),b=this.getInputElement(),c=b.getAttribute("aria-labelledby");b.setAttribute("aria-labelledby",[c,a.$.id].join(" "))},setup:d(function(a){var b=
+parseInt(a.getAttribute("height"),10),a=parseInt(a.getStyle("height"),10);return!isNaN(a)?a:!isNaN(b)?b:""}),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:"<br />"+h.widthPx}]},f,{type:"select",id:"wordWrap",label:c.wordWrap,"default":"yes",items:[[c.yes,"yes"],[c.no,"no"]],setup:d(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")}},f,{type:"select",id:"hAlign",label:c.hAlign,"default":"",items:[[e.notSet,""],[e.alignLeft,"left"],[e.alignCenter,"center"],[e.alignRight,"right"],[e.alignJustify,"justify"]],setup:d(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",label:c.vAlign,"default":"",items:[[e.notSet,""],[e.alignTop,"top"],[e.alignMiddle,"middle"],[e.alignBottom,"bottom"],[c.alignBaseline,"baseline"]],setup:d(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")}}]},
+f,{type:"vbox",padding:0,children:[{type:"select",id:"cellType",label:c.cellType,"default":"td",items:[[c.data,"td"],[c.header,"th"]],setup:d(function(a){return a.getName()}),commit:function(a){a.renameNode(this.getValue())}},f,{type:"text",id:"rowSpan",label:c.rowSpan,"default":"",validate:i.integer(c.invalidRowSpan),setup:d(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",label:c.colSpan,"default":"",validate:i.integer(c.invalidColSpan),setup:d(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")}},f,{type:"hbox",padding:0,widths:["60%","40%"],children:[{type:"text",id:"bgColor",label:c.bgColor,"default":"",setup:d(function(a){var b=a.getAttribute("bgColor");
+return a.getStyle("background-color")||b}),commit:function(a){this.getValue()?a.setStyle("background-color",this.getValue()):a.removeStyle("background-color");a.removeAttribute("bgColor")}},k?{type:"button",id:"bgColorChoose","class":"colorChooser",label:c.chooseColor,onLoad:function(){this.getElement().getParent().setStyle("vertical-align","bottom")},onClick:function(){g.getColorFromDialog(function(a){a&&this.getDialog().getContentElement("info","bgColor").setValue(a);this.focus()},this)}}:f]},f,
+{type:"hbox",padding:0,widths:["60%","40%"],children:[{type:"text",id:"borderColor",label:c.borderColor,"default":"",setup:d(function(a){var b=a.getAttribute("borderColor");return a.getStyle("border-color")||b}),commit:function(a){this.getValue()?a.setStyle("border-color",this.getValue()):a.removeStyle("border-color");a.removeAttribute("borderColor")}},k?{type:"button",id:"borderColorChoose","class":"colorChooser",label:c.chooseColor,style:(m?"margin-right":"margin-left")+": 10px",onLoad:function(){this.getElement().getParent().setStyle("vertical-align",
+"bottom")},onClick:function(){g.getColorFromDialog(function(a){a&&this.getDialog().getContentElement("info","borderColor").setValue(a);this.focus()},this)}}:f]}]}]}]}],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/js/ckeditor/plugins/wsc/LICENSE.md b/js/ckeditor/plugins/wsc/LICENSE.md
new file mode 100644
index 0000000..c7d374a
--- /dev/null
+++ b/js/ckeditor/plugins/wsc/LICENSE.md
@@ -0,0 +1,28 @@
+Software License Agreement
+==========================
+
+**CKEditor WSC Plugin**
+Copyright &copy; 2012, [CKSource](http://cksource.com) - Frederico Knabben. All rights reserved.
+
+Licensed under the terms of any of the following licenses at your choice:
+
+* GNU General Public License Version 2 or later (the "GPL"):
+ http://www.gnu.org/licenses/gpl.html
+
+* GNU Lesser General Public License Version 2.1 or later (the "LGPL"):
+ http://www.gnu.org/licenses/lgpl.html
+
+* Mozilla Public License Version 1.1 or later (the "MPL"):
+ http://www.mozilla.org/MPL/MPL-1.1.html
+
+You are not required to, but if you want to explicitly declare the license you have chosen to be bound to when using, reproducing, modifying and distributing this software, just include a text file titled "legal.txt" in your version of this software, indicating your license choice.
+
+Sources of Intellectual Property Included in this plugin
+--------------------------------------------------------
+
+Where not otherwise indicated, all plugin content is authored by CKSource engineers and consists of CKSource-owned intellectual property. In some specific instances, the plugin will incorporate work done by developers outside of CKSource with their express permission.
+
+Trademarks
+----------
+
+CKEditor is a trademark of CKSource - Frederico Knabben. All other brand and product names are trademarks, registered trademarks or service marks of their respective holders.
diff --git a/js/ckeditor/plugins/wsc/README.md b/js/ckeditor/plugins/wsc/README.md
new file mode 100644
index 0000000..46eeafb
--- /dev/null
+++ b/js/ckeditor/plugins/wsc/README.md
@@ -0,0 +1,25 @@
+CKEditor WebSpellChecker Plugin
+===============================
+
+This plugin brings Web Spell Checker (WSC) into CKEditor.
+
+WSC is "installation-less", using the web-services of [WebSpellChecker.net](http://www.webspellchecker.net/). It's an out of the box solution.
+
+Installation
+------------
+
+1. Clone/copy this repository contents in a new "plugins/wsc" folder in your CKEditor installation.
+2. Enable the "wsc" plugin in the CKEditor configuration file (config.js):
+
+ config.extraPlugins = 'wsc';
+
+That's all. WSC will appear on the editor toolbar and will be ready to use.
+
+License
+-------
+
+Licensed under the terms of any of the following licenses at your choice: [GPL](http://www.gnu.org/licenses/gpl.html), [LGPL](http://www.gnu.org/licenses/lgpl.html) and [MPL](http://www.mozilla.org/MPL/MPL-1.1.html).
+
+See LICENSE.md for more information.
+
+Developed in cooperation with [WebSpellChecker.net](http://www.webspellchecker.net/).
diff --git a/js/ckeditor/plugins/wsc/dialogs/ciframe.html b/js/ckeditor/plugins/wsc/dialogs/ciframe.html
new file mode 100644
index 0000000..82df25b
--- /dev/null
+++ b/js/ckeditor/plugins/wsc/dialogs/ciframe.html
@@ -0,0 +1,66 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<!--
+Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+-->
+<html>
+<head>
+ <title></title>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ <script type="text/javascript">
+
+function gup( name )
+{
+ name = name.replace( /[\[]/, '\\\[' ).replace( /[\]]/, '\\\]' ) ;
+ var regexS = '[\\?&]' + name + '=([^&#]*)' ;
+ var regex = new RegExp( regexS ) ;
+ var results = regex.exec( window.location.href ) ;
+
+ if ( results )
+ return results[ 1 ] ;
+ else
+ return '' ;
+}
+
+var interval;
+
+function sendData2Master()
+{
+ var destination = window.parent.parent ;
+ try
+ {
+ if ( destination.XDTMaster )
+ {
+ var t = destination.XDTMaster.read( [ gup( 'cmd' ), gup( 'data' ) ] ) ;
+ window.clearInterval( interval ) ;
+ }
+ }
+ catch (e) {}
+}
+
+function OnMessage (event) {
+ var message = event.data;
+ var destination = window.parent.parent;
+ destination.XDTMaster.read( [ 'end', message, 'fpm' ] ) ;
+}
+
+function listenPostMessage() {
+ if (window.addEventListener) { // all browsers except IE before version 9
+ window.addEventListener ("message", OnMessage, false);
+ }else {
+ if (window.attachEvent) { // IE before version 9
+ window.attachEvent("onmessage", OnMessage);
+ }
+ }
+}
+
+function onLoad()
+{
+ interval = window.setInterval( sendData2Master, 100 );
+ listenPostMessage();
+}
+
+</script>
+</head>
+<body onload="onLoad()"><p></p></body>
+</html>
diff --git a/js/ckeditor/plugins/wsc/dialogs/tmpFrameset.html b/js/ckeditor/plugins/wsc/dialogs/tmpFrameset.html
new file mode 100644
index 0000000..c2d82aa
--- /dev/null
+++ b/js/ckeditor/plugins/wsc/dialogs/tmpFrameset.html
@@ -0,0 +1,52 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
+<!--
+Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+-->
+<html>
+<head>
+ <title></title>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ <script type="text/javascript">
+
+function doLoadScript( url )
+{
+ if ( !url )
+ return false ;
+
+ var s = document.createElement( "script" ) ;
+ s.type = "text/javascript" ;
+ s.src = url ;
+ document.getElementsByTagName( "head" )[ 0 ].appendChild( s ) ;
+
+ return true ;
+}
+
+var opener;
+function tryLoad()
+{
+ opener = window.parent;
+
+ // get access to global parameters
+ var oParams = window.opener.oldFramesetPageParams;
+
+ // make frameset rows string prepare
+ var sFramesetRows = ( parseInt( oParams.firstframeh, 10 ) || '30') + ",*," + ( parseInt( oParams.thirdframeh, 10 ) || '150' ) + ',0' ;
+ document.getElementById( 'itFrameset' ).rows = sFramesetRows ;
+
+ // dynamic including init frames and crossdomain transport code
+ // from config sproxy_js_frameset url
+ var addScriptUrl = oParams.sproxy_js_frameset ;
+ doLoadScript( addScriptUrl ) ;
+}
+
+ </script>
+</head>
+
+<frameset id="itFrameset" onload="tryLoad();" border="0" rows="30,*,*,0">
+ <frame scrolling="no" framespacing="0" frameborder="0" noresize="noresize" marginheight="0" marginwidth="2" src="" name="navbar"></frame>
+ <frame scrolling="auto" framespacing="0" frameborder="0" noresize="noresize" marginheight="0" marginwidth="0" src="" name="mid"></frame>
+ <frame scrolling="no" framespacing="0" frameborder="0" noresize="noresize" marginheight="1" marginwidth="1" src="" name="bot"></frame>
+ <frame scrolling="no" framespacing="0" frameborder="0" noresize="noresize" marginheight="1" marginwidth="1" src="" name="spellsuggestall"></frame>
+</frameset>
+</html>
diff --git a/js/ckeditor/plugins/wsc/dialogs/wsc.css b/js/ckeditor/plugins/wsc/dialogs/wsc.css
new file mode 100644
index 0000000..496d731
--- /dev/null
+++ b/js/ckeditor/plugins/wsc/dialogs/wsc.css
@@ -0,0 +1,82 @@
+/*
+Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+html, body
+{
+ background-color: transparent;
+ margin: 0px;
+ padding: 0px;
+}
+
+body
+{
+ padding: 10px;
+}
+
+body, td, input, select, textarea
+{
+ font-size: 11px;
+ font-family: 'Microsoft Sans Serif' , Arial, Helvetica, Verdana;
+}
+
+.midtext
+{
+ padding:0px;
+ margin:10px;
+}
+
+.midtext p
+{
+ padding:0px;
+ margin:10px;
+}
+
+.Button
+{
+ border: #737357 1px solid;
+ color: #3b3b1f;
+ background-color: #c7c78f;
+}
+
+.PopupTabArea
+{
+ color: #737357;
+ background-color: #e3e3c7;
+}
+
+.PopupTitleBorder
+{
+ border-bottom: #d5d59d 1px solid;
+}
+.PopupTabEmptyArea
+{
+ padding-left: 10px;
+ border-bottom: #d5d59d 1px solid;
+}
+
+.PopupTab, .PopupTabSelected
+{
+ border-right: #d5d59d 1px solid;
+ border-top: #d5d59d 1px solid;
+ border-left: #d5d59d 1px solid;
+ padding: 3px 5px 3px 5px;
+ color: #737357;
+}
+
+.PopupTab
+{
+ margin-top: 1px;
+ border-bottom: #d5d59d 1px solid;
+ cursor: pointer;
+}
+
+.PopupTabSelected
+{
+ font-weight: bold;
+ cursor: default;
+ padding-top: 4px;
+ border-bottom: #f1f1e3 1px solid;
+ background-color: #f1f1e3;
+}
diff --git a/js/ckeditor/plugins/wsc/dialogs/wsc.js b/js/ckeditor/plugins/wsc/dialogs/wsc.js
new file mode 100644
index 0000000..b53a48c
--- /dev/null
+++ b/js/ckeditor/plugins/wsc/dialogs/wsc.js
@@ -0,0 +1,74 @@
+/*
+ Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+(function(){function q(a){return a&&a.domId&&a.getInputElement().$?a.getInputElement():a&&a.$?a:!1}function z(a){if(!a)throw"Languages-by-groups list are required for construct selectbox";var c=[],d="",f;for(f in a)for(var g in a[f]){var h=a[f][g];"en_US"==h?d=h:c.push(h)}c.sort();d&&c.unshift(d);return{getCurrentLangGroup:function(c){a:{for(var d in a)for(var f in a[d])if(f.toUpperCase()===c.toUpperCase()){c=d;break a}c=""}return c},setLangList:function(){var c={},d;for(d in a)for(var f in a[d])c[a[d][f]]=
+f;return c}()}}var e=function(){var a=function(a,b,f){var f=f||{},g=f.expires;if("number"==typeof g&&g){var h=new Date;h.setTime(h.getTime()+1E3*g);g=f.expires=h}g&&g.toUTCString&&(f.expires=g.toUTCString());var b=encodeURIComponent(b),a=a+"="+b,e;for(e in f)b=f[e],a+="; "+e,!0!==b&&(a+="="+b);document.cookie=a};return{postMessage:{init:function(a){window.addEventListener?window.addEventListener("message",a,!1):window.attachEvent("onmessage",a)},send:function(a){var b=Object.prototype.toString,f=
+a.fn||null,g=a.id||"",e=a.target||window,i=a.message||{id:g};a.message&&"[object Object]"==b.call(a.message)&&(a.message.id||(a.message.id=g),i=a.message);a=window.JSON.stringify(i,f);e.postMessage(a,"*")},unbindHandler:function(a){window.removeEventListener?window.removeEventListener("message",a,!1):window.detachEvent("onmessage",a)}},hash:{create:function(){},parse:function(){}},cookie:{set:a,get:function(a){return(a=document.cookie.match(RegExp("(?:^|; )"+a.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g,
+"\\$1")+"=([^;]*)")))?decodeURIComponent(a[1]):void 0},remove:function(c){a(c,"",{expires:-1})}},misc:{findFocusable:function(a){var b=null;a&&(b=a.find("a[href], area[href], input, select, textarea, button, *[tabindex], *[contenteditable]"));return b},isVisible:function(a){return!(0===a.offsetWidth||0==a.offsetHeight||"none"===(document.defaultView&&document.defaultView.getComputedStyle?document.defaultView.getComputedStyle(a,null).display:a.currentStyle?a.currentStyle.display:a.style.display))},
+hasClass:function(a,b){return!(!a.className||!a.className.match(RegExp("(\\s|^)"+b+"(\\s|$)")))}}}}(),a=a||{};a.TextAreaNumber=null;a.load=!0;a.cmd={SpellTab:"spell",Thesaurus:"thes",GrammTab:"grammar"};a.dialog=null;a.optionNode=null;a.selectNode=null;a.grammerSuggest=null;a.textNode={};a.iframeMain=null;a.dataTemp="";a.div_overlay=null;a.textNodeInfo={};a.selectNode={};a.selectNodeResponce={};a.langList=null;a.langSelectbox=null;a.banner="";a.show_grammar=null;a.div_overlay_no_check=null;a.targetFromFrame=
+{};a.onLoadOverlay=null;a.LocalizationComing={};a.OverlayPlace=null;a.LocalizationButton={ChangeTo:{instance:null,text:"Change to"},ChangeAll:{instance:null,text:"Change All"},IgnoreWord:{instance:null,text:"Ignore word"},IgnoreAllWords:{instance:null,text:"Ignore all words"},Options:{instance:null,text:"Options",optionsDialog:{instance:null}},AddWord:{instance:null,text:"Add word"},FinishChecking:{instance:null,text:"Finish Checking"}};a.LocalizationLabel={ChangeTo:{instance:null,text:"Change to"},
+Suggestions:{instance:null,text:"Suggestions"}};var A=function(b){var c,d;for(d in b)c=b[d].instance.getElement().getFirst()||b[d].instance.getElement(),c.setText(a.LocalizationComing[d])},B=function(b){for(var c in b){if(!b[c].instance.setLabel)break;b[c].instance.setLabel(a.LocalizationComing[c])}},j,r;a.framesetHtml=function(b){return"<iframe id="+a.iframeNumber+"_"+b+' frameborder="0" allowtransparency="1" style="width:100%;border: 1px solid #AEB3B9;overflow: auto;background:#fff; border-radius: 3px;"></iframe>'};
+a.setIframe=function(b,c){var d;d=a.framesetHtml(c);var f=a.iframeNumber+"_"+c;b.getElement().setHtml(d);d=document.getElementById(f);d=d.contentWindow?d.contentWindow:d.contentDocument.document?d.contentDocument.document:d.contentDocument;d.document.open();d.document.write('<!DOCTYPE html><html><head><meta charset="UTF-8"><title>iframe</title><style>html,body{margin: 0;height: 100%;font: 13px/1.555 "Trebuchet MS", sans-serif;}a{color: #888;font-weight: bold;text-decoration: none;border-bottom: 1px solid #888;}.main-box {color:#252525;padding: 3px 5px;text-align: justify;}.main-box p{margin: 0 0 14px;}.main-box .cerr{color: #f00000;border-bottom-color: #f00000;}</style></head><body><div id="content" class="main-box"></div><iframe src="" frameborder="0" id="spelltext" name="spelltext" style="display:none; width: 100%" ></iframe><iframe src="" frameborder="0" id="loadsuggestfirst" name="loadsuggestfirst" style="display:none; width: 100%" ></iframe><iframe src="" frameborder="0" id="loadspellsuggestall" name="loadspellsuggestall" style="display:none; width: 100%" ></iframe><iframe src="" frameborder="0" id="loadOptionsForm" name="loadOptionsForm" style="display:none; width: 100%" ></iframe><script>(function(window) {var ManagerPostMessage = function() {var _init = function(handler) {if (document.addEventListener) {window.addEventListener("message", handler, false);} else {window.attachEvent("onmessage", handler);};};var _sendCmd = function(o) {var str,type = Object.prototype.toString,fn = o.fn || null,id = o.id || "",target = o.target || window,message = o.message || { "id": id };if (o.message && type.call(o.message) == "[object Object]") {(o.message["id"]) ? o.message["id"] : o.message["id"] = id;message = o.message;};str = JSON.stringify(message, fn);target.postMessage(str, "*");};return {init: _init,send: _sendCmd};};var manageMessageTmp = new ManagerPostMessage;var appString = (function(){var spell = parent.CKEDITOR.config.wsc.DefaultParams.scriptPath;var serverUrl = parent.CKEDITOR.config.wsc.DefaultParams.serviceHost;return serverUrl + spell;})();function loadScript(src, callback) {var scriptTag = document.createElement("script");scriptTag.type = "text/javascript";callback ? callback : callback = function() {};if(scriptTag.readyState) {scriptTag.onreadystatechange = function() {if (scriptTag.readyState == "loaded" ||scriptTag.readyState == "complete") {scriptTag.onreadystatechange = null;setTimeout(function(){scriptTag.parentNode.removeChild(scriptTag)},1);callback();}};}else{scriptTag.onload = function() {setTimeout(function(){scriptTag.parentNode.removeChild(scriptTag)},1);callback();};};scriptTag.src = src;document.getElementsByTagName("head")[0].appendChild(scriptTag);};window.onload = function(){loadScript(appString, function(){manageMessageTmp.send({"id": "iframeOnload","target": window.parent});});}})(this);<\/script></body></html>');
+d.document.close()};a.setCurrentIframe=function(b){a.setIframe(a.dialog._.contents[b].Content,b)};a.setHeightBannerFrame=function(){var b=a.dialog.getContentElement("SpellTab","banner").getElement(),c=a.dialog.getContentElement("GrammTab","banner").getElement(),d=a.dialog.getContentElement("Thesaurus","banner").getElement();b.setStyle("height","90px");c.setStyle("height","90px");d.setStyle("height","90px")};a.setHeightFrame=function(){document.getElementById(a.iframeNumber+"_"+a.dialog._.currentTabId).style.height=
+"240px"};a.sendData=function(b){var c=b._.currentTabId,d=b._.contents[c].Content,f,g;a.setIframe(d,c);var e=function(e){e=e||window.event;e.data.getTarget().is("a")&&c!=b._.currentTabId&&(c=b._.currentTabId,d=b._.contents[c].Content,f=a.iframeNumber+"_"+c,a.div_overlay.setEnable(),d.getElement().getChildCount()?v(a.targetFromFrame[f],a.cmd[c]):(a.setIframe(d,c),g=document.getElementById(f),a.targetFromFrame[f]=g.contentWindow))};b.parts.tabs.removeListener("click",e);b.parts.tabs.on("click",e)};a.buildSelectLang=
+function(a){var c=new CKEDITOR.dom.element("div"),d=new CKEDITOR.dom.element("select"),a="wscLang"+a;c.addClass("cke_dialog_ui_input_select");c.setAttribute("role","presentation");c.setStyles({height:"auto",position:"absolute",right:"0",top:"-1px",width:"160px","white-space":"normal"});d.setAttribute("id",a);d.addClass("cke_dialog_ui_input_select");d.setStyles({width:"160px"});c.append(d);return c};a.buildOptionLang=function(b,c){var d=document.getElementById("wscLang"+c),f=document.createDocumentFragment(),
+g,e,i=[];if(0===d.options.length){for(g in b)i.push([g,b[g]]);i.sort();for(var k=0;k<i.length;k++)g=document.createElement("option"),g.setAttribute("value",i[k][1]),e=document.createTextNode(i[k][0]),g.appendChild(e),i[k][1]==a.selectingLang&&g.setAttribute("selected","selected"),f.appendChild(g);d.appendChild(f)}};a.buildOptionSynonyms=function(b){var b=a.selectNodeResponce[b],c=q(a.selectNode.synonyms);a.selectNode.synonyms.clear();for(var d=0;d<b.length;d++){var f=document.createElement("option");
+f.text=b[d];f.value=b[d];c.$.add(f,d)}a.selectNode.synonyms.getInputElement().$.firstChild.selected=!0;a.textNode.Thesaurus.setValue(a.selectNode.synonyms.getInputElement().getValue())};var s=function(a){var c=document,d=a.target||c.body,f=a.id||"overlayBlock",g=a.opacity||"0.9",a=a.background||"#f1f1f1",e=c.getElementById(f),i=e||c.createElement("div");i.style.cssText="position: absolute;top:30px;bottom:41px;left:1px;right:1px;z-index: 10020;padding:0;margin:0;background:"+a+";opacity: "+g+";filter: alpha(opacity="+
+100*g+");display: none;";i.id=f;e||d.appendChild(i);return{setDisable:function(){i.style.display="none"},setEnable:function(){i.style.display="block"}}},C=function(b,c,d){var f=new CKEDITOR.dom.element("div"),e=new CKEDITOR.dom.element("input"),h=new CKEDITOR.dom.element("label"),i="wscGrammerSuggest"+b+"_"+c;f.addClass("cke_dialog_ui_input_radio");f.setAttribute("role","presentation");f.setStyles({width:"97%",padding:"5px","white-space":"normal"});e.setAttributes({type:"radio",value:c,name:"wscGrammerSuggest",
+id:i});e.setStyles({"float":"left"});e.on("click",function(b){a.textNode.GrammTab.setValue(b.sender.getValue())});d&&e.setAttribute("checked",!0);e.addClass("cke_dialog_ui_radio_input");h.appendText(b);h.setAttribute("for",i);h.setStyles({display:"block","line-height":"16px","margin-left":"18px","white-space":"normal"});f.append(e);f.append(h);return f},w=function(a){a=a||"true";null!==a&&"false"==a&&m()},n=function(b){var c=new z(b),b="wscLang"+a.dialog.getParentEditor().name,b=document.getElementById(b),
+d=a.iframeNumber+"_"+a.dialog._.currentTabId;a.buildOptionLang(c.setLangList,a.dialog.getParentEditor().name);x[c.getCurrentLangGroup(a.selectingLang)]();w(a.show_grammar);b.onchange=function(){x[c.getCurrentLangGroup(this.value)]();w(a.show_grammar);a.div_overlay.setEnable();a.selectingLang=this.value;e.postMessage.send({message:{changeLang:a.selectingLang,text:a.dataTemp},target:a.targetFromFrame[d],id:"selectionLang_outer__page"})}},D=function(b){if("no_any_suggestions"==b){b="No suggestions";
+a.LocalizationButton.ChangeTo.instance.disable();a.LocalizationButton.ChangeAll.instance.disable();var c=function(b){b=a.LocalizationButton[b].instance;b.getElement().hasClass("cke_disabled")?b.getElement().setStyle("color","#a0a0a0"):b.disable()};c("ChangeTo");c("ChangeAll")}else a.LocalizationButton.ChangeTo.instance.enable(),a.LocalizationButton.ChangeAll.instance.enable(),a.LocalizationButton.ChangeTo.instance.getElement().setStyle("color","#333"),a.LocalizationButton.ChangeAll.instance.getElement().setStyle("color",
+"#333");return b},F={iframeOnload:function(){a.div_overlay.setEnable();var b=a.dialog._.currentTabId;v(a.targetFromFrame[a.iframeNumber+"_"+b],a.cmd[b])},suggestlist:function(b){delete b.id;a.div_overlay_no_check.setDisable();t();n(a.langList);var c=D(b.word),d="";c instanceof Array&&(c=b.word[0]);d=c=c.split(",");a.textNode.SpellTab.setValue(d[0]);b=q(r);r.clear();for(c=0;c<d.length;c++){var f=document.createElement("option");f.text=d[c];f.value=d[c];b.$.add(f,c)}l();a.div_overlay.setDisable()},
+grammerSuggest:function(b){delete b.id;delete b.mocklangs;t();n(a.langList);var c=b.grammSuggest[0];a.grammerSuggest.getElement().setHtml("");a.textNode.GrammTab.reset();a.textNode.GrammTab.setValue(c);a.textNodeInfo.GrammTab.getElement().setHtml("");a.textNodeInfo.GrammTab.getElement().setText(b.info);for(var b=b.grammSuggest,c=b.length,d=!0,f=0;f<c;f++)a.grammerSuggest.getElement().append(C(b[f],b[f],d)),d=!1;l();a.div_overlay.setDisable()},thesaurusSuggest:function(b){delete b.id;delete b.mocklangs;
+t();n(a.langList);a.selectNodeResponce=b;a.textNode.Thesaurus.reset();var c=q(a.selectNode.categories),d=0;a.selectNode.categories.clear();for(var f in b){var e=document.createElement("option");e.text=f;e.value=f;c.$.add(e,d);d++}b=a.selectNode.categories.getInputElement().getChildren().$[0].value;a.selectNode.categories.getInputElement().getChildren().$[0].selected=!0;a.buildOptionSynonyms(b);l();a.div_overlay.setDisable()},finish:function(b){delete b.id;E();b=a.dialog.getContentElement(a.dialog._.currentTabId,
+"BlockFinishChecking").getElement();b.removeStyle("display");b.removeStyle("position");b.removeStyle("left");b.show();a.div_overlay.setDisable()},settext:function(b){delete b.id;a.dialog.getParentEditor().getCommand("checkspell");var c=a.dialog.getParentEditor();try{c.focus()}catch(d){}c.setData(b.text,function(){a.dataTemp="";c.unlockSelection();c.fire("saveSnapshot");a.dialog.hide()})},ReplaceText:function(b){delete b.id;a.div_overlay.setEnable();a.dataTemp=b.text;a.selectingLang=b.currentLang;
+window.setTimeout(function(){try{a.div_overlay.setDisable()}catch(b){}},500);A(a.LocalizationButton);B(a.LocalizationLabel)},options_checkbox_send:function(b){delete b.id;b={osp:e.cookie.get("osp"),udn:e.cookie.get("udn"),cust_dic_ids:a.cust_dic_ids};e.postMessage.send({message:b,target:a.targetFromFrame[a.iframeNumber+"_"+a.dialog._.currentTabId],id:"options_outer__page"})},getOptions:function(b){var c=b.DefOptions.udn;a.LocalizationComing=b.DefOptions.localizationButtonsAndText;a.show_grammar=b.show_grammar;
+a.langList=b.lang;if(a.bnr=b.bannerId){a.setHeightBannerFrame();var d=b.banner;a.dialog.getContentElement(a.dialog._.currentTabId,"banner").getElement().setHtml(d)}else a.setHeightFrame();"undefined"==c&&(a.userDictionaryName?(c=a.userDictionaryName,d={osp:e.cookie.get("osp"),udn:a.userDictionaryName,cust_dic_ids:a.cust_dic_ids,id:"options_dic_send",udnCmd:"create"},e.postMessage.send({message:d,target:a.targetFromFrame[void 0]})):c="");e.cookie.set("osp",b.DefOptions.osp);e.cookie.set("udn",c);e.cookie.set("cust_dic_ids",
+b.DefOptions.cust_dic_ids);e.postMessage.send({id:"giveOptions"})},options_dic_send:function(){var b={osp:e.cookie.get("osp"),udn:e.cookie.get("udn"),cust_dic_ids:a.cust_dic_ids,id:"options_dic_send",udnCmd:e.cookie.get("udnCmd")};e.postMessage.send({message:b,target:a.targetFromFrame[a.iframeNumber+"_"+a.dialog._.currentTabId]})},data:function(a){delete a.id},giveOptions:function(){},setOptionsConfirmF:function(){},setOptionsConfirmT:function(){j.setValue("")},clickBusy:function(){a.div_overlay.setEnable()},
+suggestAllCame:function(){a.div_overlay.setDisable();a.div_overlay_no_check.setDisable()},TextCorrect:function(){n(a.langList)}},y=function(a){a=a||window.event;if((a=window.JSON.parse(a.data))&&a.id)F[a.id](a)},v=function(b,c,d,f){c=c||CKEDITOR.config.wsc_cmd;d=d||a.dataTemp;e.postMessage.send({message:{customerId:a.wsc_customerId,text:d,txt_ctrl:a.TextAreaNumber,cmd:c,cust_dic_ids:a.cust_dic_ids,udn:a.userDictionaryName,slang:a.selectingLang,reset_suggest:f||!1},target:b,id:"data_outer__page"});
+a.div_overlay.setEnable()},x={superset:function(){a.dialog.showPage("Thesaurus");a.dialog.showPage("GrammTab");o()},usual:function(){u();m();o()},rtl:function(){u();m();o()}},G=function(b){var c=new function(a){var b={};return{getCmdByTab:function(c){for(var e in a)b[a[e]]=e;return b[c]}}}(a.cmd);b.selectPage(c.getCmdByTab(CKEDITOR.config.wsc_cmd));a.sendData(b)},u=function(){a.dialog.hidePage("Thesaurus")},m=function(){a.dialog.hidePage("GrammTab")},o=function(){a.dialog.showPage("SpellTab")},l=
+function(){var b=a.dialog.getContentElement(a.dialog._.currentTabId,"bottomGroup").getElement();b.removeStyle("display");b.removeStyle("position");b.removeStyle("left");b.show()},E=function(){var b=a.dialog.getContentElement(a.dialog._.currentTabId,"bottomGroup").getElement(),c=document.activeElement,d;b.setStyles({display:"block",position:"absolute",left:"-9999px"});setTimeout(function(){b.removeStyle("display");b.removeStyle("position");b.removeStyle("left");b.hide();a.dialog._.editor.focusManager.currentActive.focusNext();
+d=e.misc.findFocusable(a.dialog.parts.contents);if(!e.misc.hasClass(c,"cke_dialog_tab")&&!e.misc.hasClass(c,"cke_dialog_contents_body")&&e.misc.isVisible(c))try{c.focus()}catch(f){}else for(var g=0,h;g<d.count();g++)if(h=d.getItem(g),e.misc.isVisible(h.$)){try{h.$.focus()}catch(i){}break}},0)},t=function(){var b=a.dialog.getContentElement(a.dialog._.currentTabId,"BlockFinishChecking").getElement(),c=document.activeElement,d;b.setStyles({display:"block",position:"absolute",left:"-9999px"});setTimeout(function(){b.removeStyle("display");
+b.removeStyle("position");b.removeStyle("left");b.hide();a.dialog._.editor.focusManager.currentActive.focusNext();d=e.misc.findFocusable(a.dialog.parts.contents);if(!e.misc.hasClass(c,"cke_dialog_tab")&&!e.misc.hasClass(c,"cke_dialog_contents_body")&&e.misc.isVisible(c))try{c.focus()}catch(f){}else for(var g=0,h;g<d.count();g++)if(h=d.getItem(g),e.misc.isVisible(h.$)){try{h.$.focus()}catch(i){}break}},0)};CKEDITOR.dialog.add("checkspell",function(b){var c=function(){this.getElement().focus();a.div_overlay.setEnable();
+var c=a.dialog._.currentTabId,f=a.iframeNumber+"_"+c,g=a.textNode[c].getValue(),h=this.getElement().getAttribute("title-cmd");e.postMessage.send({message:{cmd:h,tabId:c,new_word:g},target:a.targetFromFrame[f],id:"cmd_outer__page"});("ChangeTo"==h||"ChangeAll"==h)&&b.fire("saveSnapshot");"FinishChecking"==h&&b.config.wsc_onFinish.call(CKEDITOR.document.getWindow().getFrame())};return{title:b.config.wsc_dialogTitle||b.lang.wsc.title,minWidth:560,minHeight:444,buttons:[CKEDITOR.dialog.cancelButton],
+onLoad:function(){a.dialog=this;u();m();o()},onShow:function(){b.lockSelection(b.getSelection());a.TextAreaNumber="cke_textarea_"+CKEDITOR.currentInstance.name;e.postMessage.init(y);a.dataTemp=CKEDITOR.currentInstance.getData();a.OverlayPlace=a.dialog.parts.tabs.getParent().$;if(CKEDITOR&&CKEDITOR.config){a.wsc_customerId=b.config.wsc_customerId;a.cust_dic_ids=b.config.wsc_customDictionaryIds;a.userDictionaryName=b.config.wsc_userDictionaryName;a.defaultLanguage=CKEDITOR.config.defaultLanguage;var c=
+"file:"==document.location.protocol?"http:":document.location.protocol;CKEDITOR.scriptLoader.load(b.config.wsc_customLoaderScript||c+"//loader.webspellchecker.net/sproxy_fck/sproxy.php?plugin=fck2&customerid="+a.wsc_customerId+"&cmd=script&doc=wsc&schema=22",function(c){CKEDITOR.config&&CKEDITOR.config.wsc&&CKEDITOR.config.wsc.DefaultParams?(a.serverLocationHash=CKEDITOR.config.wsc.DefaultParams.serviceHost,a.logotype=CKEDITOR.config.wsc.DefaultParams.logoPath,a.loadIcon=CKEDITOR.config.wsc.DefaultParams.iconPath,
+a.loadIconEmptyEditor=CKEDITOR.config.wsc.DefaultParams.iconPathEmptyEditor,a.LangComparer=new CKEDITOR.config.wsc.DefaultParams._SP_FCK_LangCompare):(a.serverLocationHash=DefaultParams.serviceHost,a.logotype=DefaultParams.logoPath,a.loadIcon=DefaultParams.iconPath,a.loadIconEmptyEditor=DefaultParams.iconPathEmptyEditor,a.LangComparer=new _SP_FCK_LangCompare);a.pluginPath=CKEDITOR.getUrl(b.plugins.wsc.path);a.iframeNumber=a.TextAreaNumber;a.templatePath=a.pluginPath+"dialogs/tmp.html";a.LangComparer.setDefaulLangCode(a.defaultLanguage);
+a.currentLang=b.config.wsc_lang||a.LangComparer.getSPLangCode(b.langCode);a.selectingLang=a.currentLang;a.div_overlay=new s({opacity:"1",background:"#fff url("+a.loadIcon+") no-repeat 50% 50%",target:a.OverlayPlace});var d=a.dialog.parts.tabs.getId(),d=CKEDITOR.document.getById(d);d.setStyle("width","97%");d.getElementsByTag("DIV").count()||d.append(a.buildSelectLang(a.dialog.getParentEditor().name));a.div_overlay_no_check=new s({opacity:"1",id:"no_check_over",background:"#fff url("+a.loadIconEmptyEditor+
+") no-repeat 50% 50%",target:a.OverlayPlace});c&&(G(a.dialog),a.dialog.setupContent(a.dialog))})}else a.dialog.hide()},onHide:function(){var c=CKEDITOR.plugins.scayt,f=b.scayt;b.unlockSelection();c&&(f&&c.state[b.name]&&f.setMarkupPaused)&&f.setMarkupPaused(!1);a.dataTemp="";e.postMessage.unbindHandler(y)},contents:[{id:"SpellTab",label:"SpellChecker",accessKey:"S",elements:[{type:"html",id:"banner",label:"banner",style:"",html:"<div></div>"},{type:"html",id:"Content",label:"spellContent",html:"",
+setup:function(b){var b=a.iframeNumber+"_"+b._.currentTabId,c=document.getElementById(b);a.targetFromFrame[b]=c.contentWindow}},{type:"hbox",id:"bottomGroup",style:"width:560px; margin: 0 auto;",widths:["50%","50%"],children:[{type:"hbox",id:"leftCol",align:"left",width:"50%",children:[{type:"vbox",id:"rightCol1",widths:["50%","50%"],children:[{type:"text",id:"text",label:a.LocalizationLabel.ChangeTo.text+":",labelLayout:"horizontal",labelStyle:"font: 12px/25px arial, sans-serif;",width:"140px","default":"",
+onShow:function(){a.textNode.SpellTab=this;a.LocalizationLabel.ChangeTo.instance=this},onHide:function(){this.reset()}},{type:"hbox",id:"rightCol",align:"right",width:"30%",children:[{type:"vbox",id:"rightCol_col__left",children:[{type:"text",id:"labelSuggestions",label:a.LocalizationLabel.Suggestions.text+":",onShow:function(){a.LocalizationLabel.Suggestions.instance=this;this.getInputElement().setStyles({display:"none"})}},{type:"html",id:"logo",html:'<img width="99" height="68" border="0" src="" title="WebSpellChecker.net" alt="WebSpellChecker.net" style="display: inline-block;">',
+setup:function(){this.getElement().$.src=a.logotype;this.getElement().getParent().setStyles({"text-align":"left"})}}]},{type:"select",id:"list_of_suggestions",labelStyle:"font: 12px/25px arial, sans-serif;",size:"6",inputStyle:"width: 140px; height: auto;",items:[["loading..."]],onShow:function(){r=this},onChange:function(){a.textNode.SpellTab.setValue(this.getValue())}}]}]}]},{type:"hbox",id:"rightCol",align:"right",width:"50%",children:[{type:"vbox",id:"rightCol_col__left",widths:["50%","50%","50%",
+"50%"],children:[{type:"button",id:"ChangeTo",label:a.LocalizationButton.ChangeTo.text,title:"Change to",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id);a.LocalizationButton.ChangeTo.instance=this},onClick:c},{type:"button",id:"ChangeAll",label:a.LocalizationButton.ChangeAll.text,title:"Change All",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id);a.LocalizationButton.ChangeAll.instance=this},onClick:c},{type:"button",
+id:"AddWord",label:a.LocalizationButton.AddWord.text,title:"Add word",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id);a.LocalizationButton.AddWord.instance=this},onClick:c},{type:"button",id:"FinishChecking",label:a.LocalizationButton.FinishChecking.text,title:"Finish Checking",style:"width: 100%;margin-top: 9px;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id);a.LocalizationButton.FinishChecking.instance=this},onClick:c}]},{type:"vbox",
+id:"rightCol_col__right",widths:["50%","50%","50%"],children:[{type:"button",id:"IgnoreWord",label:a.LocalizationButton.IgnoreWord.text,title:"Ignore word",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id);a.LocalizationButton.IgnoreWord.instance=this},onClick:c},{type:"button",id:"IgnoreAllWords",label:a.LocalizationButton.IgnoreAllWords.text,title:"Ignore all words",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id);
+a.LocalizationButton.IgnoreAllWords.instance=this},onClick:c},{type:"button",id:"option",label:a.LocalizationButton.Options.text,title:"Option",style:"width: 100%;",onLoad:function(){a.LocalizationButton.Options.instance=this;"file:"==document.location.protocol&&this.disable()},onClick:function(){this.getElement().focus();"file:"==document.location.protocol?alert("WSC: Options functionality is disabled when runing from file system"):(p=document.activeElement,b.openDialog("options"))}}]}]}]},{type:"hbox",
+id:"BlockFinishChecking",style:"width:560px; margin: 0 auto;",widths:["70%","30%"],onShow:function(){this.getElement().setStyles({display:"block",position:"absolute",left:"-9999px"})},onHide:l,children:[{type:"hbox",id:"leftCol",align:"left",width:"70%",children:[{type:"vbox",id:"rightCol1",setup:function(){this.getChild()[0].getElement().$.src=a.logotype;this.getChild()[0].getElement().getParent().setStyles({"text-align":"center"})},children:[{type:"html",id:"logo",html:'<img width="99" height="68" border="0" src="" title="WebSpellChecker.net" alt="WebSpellChecker.net" style="display: inline-block;">'}]}]},
+{type:"hbox",id:"rightCol",align:"right",width:"30%",children:[{type:"vbox",id:"rightCol_col__left",children:[{type:"button",id:"Option_button",label:a.LocalizationButton.Options.text,title:"Option",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id);"file:"==document.location.protocol&&this.disable()},onClick:function(){this.getElement().focus();"file:"==document.location.protocol?alert("WSC: Options functionality is disabled when runing from file system"):
+(p=document.activeElement,b.openDialog("options"))}},{type:"button",id:"FinishChecking",label:a.LocalizationButton.FinishChecking.text,title:"Finish Checking",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c}]}]}]}]},{id:"GrammTab",label:"Grammar",accessKey:"G",elements:[{type:"html",id:"banner",label:"banner",style:"",html:"<div></div>"},{type:"html",id:"Content",label:"GrammarContent",html:"",setup:function(){var b=a.iframeNumber+"_"+a.dialog._.currentTabId,
+c=document.getElementById(b);a.targetFromFrame[b]=c.contentWindow}},{type:"vbox",id:"bottomGroup",style:"width:560px; margin: 0 auto;",children:[{type:"hbox",id:"leftCol",widths:["66%","34%"],children:[{type:"vbox",children:[{type:"text",id:"text",label:"Change to:",labelLayout:"horizontal",labelStyle:"font: 12px/25px arial, sans-serif;",inputStyle:"float: right; width: 200px;","default":"",onShow:function(){a.textNode.GrammTab=this},onHide:function(){this.reset()}},{type:"html",id:"html_text",html:"<div style='min-height: 17px; line-height: 17px; padding: 5px; text-align: left;background: #F1F1F1;color: #595959; white-space: normal!important;'></div>",
+onShow:function(){a.textNodeInfo.GrammTab=this}},{type:"html",id:"radio",html:"",onShow:function(){a.grammerSuggest=this}}]},{type:"vbox",children:[{type:"button",id:"ChangeTo",label:"Change to",title:"Change to",style:"width: 133px; float: right;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c},{type:"button",id:"IgnoreWord",label:"Ignore word",title:"Ignore word",style:"width: 133px; float: right;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},
+onClick:c},{type:"button",id:"IgnoreAllWords",label:"Ignore Problem",title:"Ignore Problem",style:"width: 133px; float: right;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c},{type:"button",id:"FinishChecking",label:"Finish Checking",title:"Finish Checking",style:"width: 133px; float: right; margin-top: 9px;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c}]}]}]},{type:"hbox",id:"BlockFinishChecking",style:"width:560px; margin: 0 auto;",
+widths:["70%","30%"],onShow:function(){this.getElement().setStyles({display:"block",position:"absolute",left:"-9999px"})},onHide:l,children:[{type:"hbox",id:"leftCol",align:"left",width:"70%",children:[{type:"vbox",id:"rightCol1",children:[{type:"html",id:"logo",html:'<img width="99" height="68" border="0" src="" title="WebSpellChecker.net" alt="WebSpellChecker.net" style="display: inline-block;">',setup:function(){this.getElement().$.src=a.logotype;this.getElement().getParent().setStyles({"text-align":"center"})}}]}]},
+{type:"hbox",id:"rightCol",align:"right",width:"30%",children:[{type:"vbox",id:"rightCol_col__left",children:[{type:"button",id:"FinishChecking",label:"Finish Checking",title:"Finish Checking",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c}]}]}]}]},{id:"Thesaurus",label:"Thesaurus",accessKey:"T",elements:[{type:"html",id:"banner",label:"banner",style:"",html:"<div></div>"},{type:"html",id:"Content",label:"spellContent",html:"",setup:function(){var b=
+a.iframeNumber+"_"+a.dialog._.currentTabId,c=document.getElementById(b);a.targetFromFrame[b]=c.contentWindow}},{type:"vbox",id:"bottomGroup",style:"width:560px; margin: -10px auto; overflow: hidden;",children:[{type:"hbox",widths:["75%","25%"],children:[{type:"vbox",children:[{type:"hbox",widths:["65%","35%"],children:[{type:"text",id:"ChangeTo",label:"Change to:",labelLayout:"horizontal",inputStyle:"width: 160px;",labelStyle:"font: 12px/25px arial, sans-serif;","default":"",onShow:function(){a.textNode.Thesaurus=
+this},onHide:function(){this.reset()}},{type:"button",id:"ChangeTo",label:"Change to",title:"Change to",style:"width: 121px; margin-top: 1px;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c}]},{type:"hbox",children:[{type:"select",id:"categories",label:"Categories:",labelStyle:"font: 12px/25px arial, sans-serif;",size:"5",inputStyle:"width: 180px; height: auto;",items:[],onShow:function(){a.selectNode.categories=this},onChange:function(){a.buildOptionSynonyms(this.getValue())}},
+{type:"select",id:"synonyms",label:"Synonyms:",labelStyle:"font: 12px/25px arial, sans-serif;",size:"5",inputStyle:"width: 180px; height: auto;",items:[],onShow:function(){a.selectNode.synonyms=this;a.textNode.Thesaurus.setValue(this.getValue())},onChange:function(){a.textNode.Thesaurus.setValue(this.getValue())}}]}]},{type:"vbox",width:"120px",style:"margin-top:46px;",children:[{type:"html",id:"logotype",label:"WebSpellChecker.net",html:'<img width="99" height="68" border="0" src="" title="WebSpellChecker.net" alt="WebSpellChecker.net" style="display: inline-block;">',
+setup:function(){this.getElement().$.src=a.logotype;this.getElement().getParent().setStyles({"text-align":"center"})}},{type:"button",id:"FinishChecking",label:"Finish Checking",title:"Finish Checking",style:"width: 121px; float: right; margin-top: 9px;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c}]}]}]},{type:"hbox",id:"BlockFinishChecking",style:"width:560px; margin: 0 auto;",widths:["70%","30%"],onShow:function(){this.getElement().setStyles({display:"block",
+position:"absolute",left:"-9999px"})},children:[{type:"hbox",id:"leftCol",align:"left",width:"70%",children:[{type:"vbox",id:"rightCol1",children:[{type:"html",id:"logo",html:'<img width="99" height="68" border="0" src="" title="WebSpellChecker.net" alt="WebSpellChecker.net" style="display: inline-block;">',setup:function(){this.getElement().$.src=a.logotype;this.getElement().getParent().setStyles({"text-align":"center"})}}]}]},{type:"hbox",id:"rightCol",align:"right",width:"30%",children:[{type:"vbox",
+id:"rightCol_col__left",children:[{type:"button",id:"FinishChecking",label:"Finish Checking",title:"Finish Checking",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c}]}]}]}]}]}});var p=null;CKEDITOR.dialog.add("options",function(){var b=null,c={},d={},f=null,g=null;e.cookie.get("udn");e.cookie.get("osp");var h=function(){g=this.getElement().getAttribute("title-cmd");var a=[];a[0]=d.IgnoreAllCapsWords;a[1]=d.IgnoreWordsNumbers;a[2]=d.IgnoreMixedCaseWords;
+a[3]=d.IgnoreDomainNames;a=a.toString().replace(/,/g,"");e.cookie.set("osp",a);e.cookie.set("udnCmd",g?g:"ignore");"delete"!=g&&(a="",""!==j.getValue()&&(a=j.getValue()),e.cookie.set("udn",a));e.postMessage.send({id:"options_dic_send"})},i=function(){f.getElement().setHtml(a.LocalizationComing.error);f.getElement().show()};return{title:a.LocalizationComing.Options,minWidth:430,minHeight:130,resizable:CKEDITOR.DIALOG_RESIZE_NONE,contents:[{id:"OptionsTab",label:"Options",accessKey:"O",elements:[{type:"hbox",
+id:"options_error",children:[{type:"html",style:"display: block;text-align: center;white-space: normal!important; font-size: 12px;color:red",html:"<div></div>",onShow:function(){f=this}}]},{type:"vbox",id:"Options_content",children:[{type:"hbox",id:"Options_manager",widths:["52%","48%"],children:[{type:"fieldset",label:"Spell Checking Options",style:"border: none;margin-top: 13px;padding: 10px 0 10px 10px",onShow:function(){this.getInputElement().$.children[0].innerHTML=a.LocalizationComing.SpellCheckingOptions},
+children:[{type:"vbox",id:"Options_checkbox",children:[{type:"checkbox",id:"IgnoreAllCapsWords",label:"Ignore All-Caps Words",labelStyle:"margin-left: 5px; font: 12px/16px arial, sans-serif;display: inline-block;white-space: normal;",style:"float:left; min-height: 16px;","default":"",onClick:function(){d[this.id]=!this.getValue()?0:1}},{type:"checkbox",id:"IgnoreWordsNumbers",label:"Ignore Words with Numbers",labelStyle:"margin-left: 5px; font: 12px/16px arial, sans-serif;display: inline-block;white-space: normal;",
+style:"float:left; min-height: 16px;","default":"",onClick:function(){d[this.id]=!this.getValue()?0:1}},{type:"checkbox",id:"IgnoreMixedCaseWords",label:"Ignore Mixed-Case Words",labelStyle:"margin-left: 5px; font: 12px/16px arial, sans-serif;display: inline-block;white-space: normal;",style:"float:left; min-height: 16px;","default":"",onClick:function(){d[this.id]=!this.getValue()?0:1}},{type:"checkbox",id:"IgnoreDomainNames",label:"Ignore Domain Names",labelStyle:"margin-left: 5px; font: 12px/16px arial, sans-serif;display: inline-block;white-space: normal;",
+style:"float:left; min-height: 16px;","default":"",onClick:function(){d[this.id]=!this.getValue()?0:1}}]}]},{type:"vbox",id:"Options_DictionaryName",children:[{type:"text",id:"DictionaryName",style:"margin-bottom: 10px",label:"Dictionary Name:",labelLayout:"vertical",labelStyle:"font: 12px/25px arial, sans-serif;","default":"",onLoad:function(){j=this;this.setValue(a.userDictionaryName?a.userDictionaryName:(e.cookie.get("udn"),this.getValue()))},onShow:function(){j=this;this.setValue(!e.cookie.get("udn")?
+this.getValue():e.cookie.get("udn"));this.setLabel(a.LocalizationComing.DictionaryName)},onHide:function(){this.reset()}},{type:"hbox",id:"Options_buttons",children:[{type:"vbox",id:"Options_leftCol_col",widths:["50%","50%"],children:[{type:"button",id:"create",label:"Create",title:"Create",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onShow:function(){(this.getElement().getFirst()||this.getElement()).setText(a.LocalizationComing.Create)},onClick:h},
+{type:"button",id:"restore",label:"Restore",title:"Restore",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onShow:function(){(this.getElement().getFirst()||this.getElement()).setText(a.LocalizationComing.Restore)},onClick:h}]},{type:"vbox",id:"Options_rightCol_col",widths:["50%","50%"],children:[{type:"button",id:"rename",label:"Rename",title:"Rename",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onShow:function(){(this.getElement().getFirst()||
+this.getElement()).setText(a.LocalizationComing.Rename)},onClick:h},{type:"button",id:"delete",label:"Remove",title:"Remove",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onShow:function(){(this.getElement().getFirst()||this.getElement()).setText(a.LocalizationComing.Remove)},onClick:h}]}]}]}]},{type:"hbox",id:"Options_text",children:[{type:"html",style:"text-align: justify;margin-top: 15px;white-space: normal!important; font-size: 12px;color:#777;",html:"<div>"+
+a.LocalizationComing.OptionsTextIntro+"</div>",onShow:function(){this.getElement().setText(a.LocalizationComing.OptionsTextIntro)}}]}]}]}],buttons:[CKEDITOR.dialog.okButton,CKEDITOR.dialog.cancelButton],onOk:function(){var a=[];a[0]=d.IgnoreAllCapsWords;a[1]=d.IgnoreWordsNumbers;a[2]=d.IgnoreMixedCaseWords;a[3]=d.IgnoreDomainNames;a=a.toString().replace(/,/g,"");e.cookie.set("osp",a);e.cookie.set("udn",j.getValue());e.postMessage.send({id:"options_checkbox_send"});f.getElement().hide();f.getElement().setHtml(" ")},
+onLoad:function(){b=this;c.IgnoreAllCapsWords=b.getContentElement("OptionsTab","IgnoreAllCapsWords");c.IgnoreWordsNumbers=b.getContentElement("OptionsTab","IgnoreWordsNumbers");c.IgnoreMixedCaseWords=b.getContentElement("OptionsTab","IgnoreMixedCaseWords");c.IgnoreDomainNames=b.getContentElement("OptionsTab","IgnoreDomainNames")},onShow:function(){e.postMessage.init(i);var b=e.cookie.get("osp").split("");d.IgnoreAllCapsWords=b[0];d.IgnoreWordsNumbers=b[1];d.IgnoreMixedCaseWords=b[2];d.IgnoreDomainNames=
+b[3];!parseInt(d.IgnoreAllCapsWords,10)?c.IgnoreAllCapsWords.setValue("",!1):c.IgnoreAllCapsWords.setValue("checked",!1);!parseInt(d.IgnoreWordsNumbers,10)?c.IgnoreWordsNumbers.setValue("",!1):c.IgnoreWordsNumbers.setValue("checked",!1);!parseInt(d.IgnoreMixedCaseWords,10)?c.IgnoreMixedCaseWords.setValue("",!1):c.IgnoreMixedCaseWords.setValue("checked",!1);!parseInt(d.IgnoreDomainNames,10)?c.IgnoreDomainNames.setValue("",!1):c.IgnoreDomainNames.setValue("checked",!1);d.IgnoreAllCapsWords=!c.IgnoreAllCapsWords.getValue()?
+0:1;d.IgnoreWordsNumbers=!c.IgnoreWordsNumbers.getValue()?0:1;d.IgnoreMixedCaseWords=!c.IgnoreMixedCaseWords.getValue()?0:1;d.IgnoreDomainNames=!c.IgnoreDomainNames.getValue()?0:1;c.IgnoreAllCapsWords.getElement().$.lastChild.innerHTML=a.LocalizationComing.IgnoreAllCapsWords;c.IgnoreWordsNumbers.getElement().$.lastChild.innerHTML=a.LocalizationComing.IgnoreWordsWithNumbers;c.IgnoreMixedCaseWords.getElement().$.lastChild.innerHTML=a.LocalizationComing.IgnoreMixedCaseWords;c.IgnoreDomainNames.getElement().$.lastChild.innerHTML=
+a.LocalizationComing.IgnoreDomainNames},onHide:function(){e.postMessage.unbindHandler(i);if(p)try{p.focus()}catch(a){}}}});CKEDITOR.dialog.on("resize",function(b){var b=b.data,c=b.dialog,d=CKEDITOR.document.getById(a.iframeNumber+"_"+c._.currentTabId);"checkspell"==c._.name&&(a.bnr?d&&d.setSize("height",b.height-310):d&&d.setSize("height",b.height-220))});CKEDITOR.on("dialogDefinition",function(b){if("checkspell"===b.data.name){var c=b.data.definition;a.onLoadOverlay=new s({opacity:"1",background:"#fff",
+target:c.dialog.parts.tabs.getParent().$});a.onLoadOverlay.setEnable();c.dialog.on("cancel",function(){c.dialog.getParentEditor().config.wsc_onClose.call(this.document.getWindow().getFrame());a.div_overlay.setDisable();a.onLoadOverlay.setDisable();return!1},this,null,-1)}})})(); \ No newline at end of file
diff --git a/js/ckeditor/plugins/wsc/dialogs/wsc_ie.js b/js/ckeditor/plugins/wsc/dialogs/wsc_ie.js
new file mode 100644
index 0000000..10487d1
--- /dev/null
+++ b/js/ckeditor/plugins/wsc/dialogs/wsc_ie.js
@@ -0,0 +1,11 @@
+/*
+ Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+CKEDITOR.dialog.add("checkspell",function(a){function c(a,c){var d=0;return function(){"function"==typeof window.doSpell?("undefined"!=typeof e&&window.clearInterval(e),j(a)):180==d++&&window._cancelOnError(c)}}function j(c){var f=new window._SP_FCK_LangCompare,b=CKEDITOR.getUrl(a.plugins.wsc.path+"dialogs/"),e=b+"tmpFrameset.html";window.gFCKPluginName="wsc";f.setDefaulLangCode(a.config.defaultLanguage);window.doSpell({ctrl:g,lang:a.config.wsc_lang||f.getSPLangCode(a.langCode),intLang:a.config.wsc_uiLang||
+f.getSPLangCode(a.langCode),winType:d,onCancel:function(){c.hide()},onFinish:function(b){a.focus();c.getParentEditor().setData(b.value);c.hide()},staticFrame:e,framesetPath:e,iframePath:b+"ciframe.html",schemaURI:b+"wsc.css",userDictionaryName:a.config.wsc_userDictionaryName,customDictionaryName:a.config.wsc_customDictionaryIds&&a.config.wsc_customDictionaryIds.split(","),domainName:a.config.wsc_domainName});CKEDITOR.document.getById(h).setStyle("display","none");CKEDITOR.document.getById(d).setStyle("display",
+"block")}var b=CKEDITOR.tools.getNextNumber(),d="cke_frame_"+b,g="cke_data_"+b,h="cke_error_"+b,e,b=document.location.protocol||"http:",i=a.lang.wsc.notAvailable,k='<textarea style="display: none" id="'+g+'" rows="10" cols="40"> </textarea><div id="'+h+'" style="display:none;color:red;font-size:16px;font-weight:bold;padding-top:160px;text-align:center;z-index:11;"></div><iframe src="" style="width:100%;background-color:#f1f1e3;" frameborder="0" name="'+d+'" id="'+d+'" allowtransparency="1"></iframe>',
+l=a.config.wsc_customLoaderScript||b+"//loader.webspellchecker.net/sproxy_fck/sproxy.php?plugin=fck2&customerid="+a.config.wsc_customerId+"&cmd=script&doc=wsc&schema=22";a.config.wsc_customLoaderScript&&(i+='<p style="color:#000;font-size:11px;font-weight: normal;text-align:center;padding-top:10px">'+a.lang.wsc.errorLoading.replace(/%s/g,a.config.wsc_customLoaderScript)+"</p>");window._cancelOnError=function(c){if("undefined"==typeof window.WSC_Error){CKEDITOR.document.getById(d).setStyle("display",
+"none");var b=CKEDITOR.document.getById(h);b.setStyle("display","block");b.setHtml(c||a.lang.wsc.notAvailable)}};return{title:a.config.wsc_dialogTitle||a.lang.wsc.title,minWidth:485,minHeight:380,buttons:[CKEDITOR.dialog.cancelButton],onShow:function(){var b=this.getContentElement("general","content").getElement();b.setHtml(k);b.getChild(2).setStyle("height",this._.contentSize.height+"px");"function"!=typeof window.doSpell&&CKEDITOR.document.getHead().append(CKEDITOR.document.createElement("script",
+{attributes:{type:"text/javascript",src:l}}));b=a.getData();CKEDITOR.document.getById(g).setValue(b);e=window.setInterval(c(this,i),250)},onHide:function(){window.ooo=void 0;window.int_framsetLoaded=void 0;window.framesetLoaded=void 0;window.is_window_opened=!1},contents:[{id:"general",label:a.config.wsc_dialogTitle||a.lang.wsc.title,padding:0,elements:[{type:"html",id:"content",html:""}]}]}});
+CKEDITOR.dialog.on("resize",function(a){var a=a.data,c=a.dialog;"checkspell"==c._.name&&((c=(c=c.getContentElement("general","content").getElement())&&c.getChild(2))&&c.setSize("height",a.height),c&&c.setSize("width",a.width))}); \ No newline at end of file
diff --git a/js/ckeditor/samples/ajax.html b/js/ckeditor/samples/ajax.html
new file mode 100644
index 0000000..967e841
--- /dev/null
+++ b/js/ckeditor/samples/ajax.html
@@ -0,0 +1,82 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/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="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="http://ckeditor.com/">http://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2015, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+</html>
diff --git a/js/ckeditor/samples/api.html b/js/ckeditor/samples/api.html
new file mode 100644
index 0000000..50f568e
--- /dev/null
+++ b/js/ckeditor/samples/api.html
@@ -0,0 +1,207 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/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.
+ // http://docs.ckeditor.com/#!/api/CKEDITOR.editor-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.
+ // http://docs.ckeditor.com/#!/api/CKEDITOR.editor-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).
+ // http://docs.ckeditor.com/#!/api/CKEDITOR.editor-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
+ // http://docs.ckeditor.com/#!/api/CKEDITOR.editor-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.
+ // http://docs.ckeditor.com/#!/api/CKEDITOR.editor-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
+ // http://docs.ckeditor.com/#!/api/CKEDITOR.editor-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())
+ // http://docs.ckeditor.com/#!/api/CKEDITOR.editor-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="description">
+ <p>
+ This sample shows how to use the
+ <a class="samples" href="http://docs.ckeditor.com/#!/api/CKEDITOR.editor">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="http://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="http://ckeditor.com/">http://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2015, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+</html>
diff --git a/js/ckeditor/samples/appendto.html b/js/ckeditor/samples/appendto.html
new file mode 100644
index 0000000..8ed16b6
--- /dev/null
+++ b/js/ckeditor/samples/appendto.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/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 id="section1">
+ <div class="description">
+ <p>
+ The <code><a class="samples" href="http://docs.ckeditor.com/#!/api/CKEDITOR-method-appendTo">CKEDITOR.appendTo()</a></code> method serves to to place editors inside existing DOM elements. Unlike <code><a class="samples" href="http://docs.ckeditor.com/#!/api/CKEDITOR-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="http://ckeditor.com/">CKEditor</a>.</p>'
+ );
+
+ </script>
+ </div>
+ <br>
+ <div id="footer">
+ <hr>
+ <p>
+ CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2015, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+</html>
diff --git a/js/ckeditor/samples/assets/inlineall/logo.png b/js/ckeditor/samples/assets/inlineall/logo.png
new file mode 100644
index 0000000..b4d5979
--- /dev/null
+++ b/js/ckeditor/samples/assets/inlineall/logo.png
Binary files differ
diff --git a/js/ckeditor/samples/assets/outputxhtml/outputxhtml.css b/js/ckeditor/samples/assets/outputxhtml/outputxhtml.css
new file mode 100644
index 0000000..1b3bf64
--- /dev/null
+++ b/js/ckeditor/samples/assets/outputxhtml/outputxhtml.css
@@ -0,0 +1,204 @@
+/*
+ * Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md or http://ckeditor.com/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;
+}
diff --git a/js/ckeditor/samples/assets/posteddata.php b/js/ckeditor/samples/assets/posteddata.php
new file mode 100644
index 0000000..1e1406f
--- /dev/null
+++ b/js/ckeditor/samples/assets/posteddata.php
@@ -0,0 +1,59 @@
+<!DOCTYPE html>
+<?php
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/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="http://ckeditor.com/">http://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2015, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+</html>
diff --git a/js/ckeditor/samples/assets/sample.css b/js/ckeditor/samples/assets/sample.css
new file mode 100644
index 0000000..a47e4dd
--- /dev/null
+++ b/js/ckeditor/samples/assets/sample.css
@@ -0,0 +1,3 @@
+/**
+ * Required by tests (dom/document.html).
+ */
diff --git a/js/ckeditor/samples/assets/sample.jpg b/js/ckeditor/samples/assets/sample.jpg
new file mode 100644
index 0000000..9498271
--- /dev/null
+++ b/js/ckeditor/samples/assets/sample.jpg
Binary files differ
diff --git a/js/ckeditor/samples/assets/uilanguages/languages.js b/js/ckeditor/samples/assets/uilanguages/languages.js
new file mode 100644
index 0000000..df9c682
--- /dev/null
+++ b/js/ckeditor/samples/assets/uilanguages/languages.js
@@ -0,0 +1,7 @@
+/*
+ Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+var CKEDITOR_LANGS=function(){var c={af:"Afrikaans",ar:"Arabic",bg:"Bulgarian",bn:"Bengali/Bangla",bs:"Bosnian",ca:"Catalan",cs:"Czech",cy:"Welsh",da:"Danish",de:"German",el:"Greek",en:"English","en-au":"English (Australia)","en-ca":"English (Canadian)","en-gb":"English (United Kingdom)",eo:"Esperanto",es:"Spanish",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",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/js/ckeditor/samples/datafiltering.html b/js/ckeditor/samples/datafiltering.html
new file mode 100644
index 0000000..1165594
--- /dev/null
+++ b/js/ckeditor/samples/datafiltering.html
@@ -0,0 +1,401 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/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="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="http://docs.ckeditor.com/#!/api/CKEDITOR.config-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="http://docs.ckeditor.com/#!/api/CKEDITOR.config-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="http://docs.ckeditor.com/#!/api/CKEDITOR.config-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="http://docs.ckeditor.com/#!/guide/dev_advanced_content_filter">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="http://docs.ckeditor.com/#!/api/CKEDITOR.config-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 last 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="http://docs.ckeditor.com/#!/api/CKEDITOR.config-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="http://docs.ckeditor.com/#!/api/CKEDITOR.config-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>
+
+ <div id="footer">
+ <hr>
+ <p>
+ CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2015, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+</html>
diff --git a/js/ckeditor/samples/divreplace.html b/js/ckeditor/samples/divreplace.html
new file mode 100644
index 0000000..b87086a
--- /dev/null
+++ b/js/ckeditor/samples/divreplace.html
@@ -0,0 +1,141 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/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="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="http://ckeditor.com/">http://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2015, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+</html>
diff --git a/js/ckeditor/samples/index.html b/js/ckeditor/samples/index.html
new file mode 100644
index 0000000..3b6f9af
--- /dev/null
+++ b/js/ckeditor/samples/index.html
@@ -0,0 +1,128 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/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="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="plugins/magicline/magicline.html">Magicline plugin</a></dt>
+<dd>Using the Magicline plugin to access difficult focus spaces.</dd>
+
+<dt><a class="samples" href="plugins/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="plugins/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="plugins/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="plugins/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="plugins/htmlwriter/outputhtml.html">Output HTML</a></dt>
+<dd>Configuring CKEditor to produce legacy HTML 4 code.</dd>
+
+<dt><a class="samples" href="plugins/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="http://ckeditor.com/">http://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2015, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+</html>
diff --git a/js/ckeditor/samples/inlineall.html b/js/ckeditor/samples/inlineall.html
new file mode 100644
index 0000000..fc33619
--- /dev/null
+++ b/js/ckeditor/samples/inlineall.html
@@ -0,0 +1,311 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/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="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="http://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="http://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="http://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="http://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="http://ckeditor.com/">
+ http://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2015, <a class="samples" href="http://cksource.com/">CKSource</a>
+ - Frederico Knabben. All rights reserved.
+ </p>
+</div>
+</body>
+</html>
diff --git a/js/ckeditor/samples/inlinebycode.html b/js/ckeditor/samples/inlinebycode.html
new file mode 100644
index 0000000..c1df0e9
--- /dev/null
+++ b/js/ckeditor/samples/inlinebycode.html
@@ -0,0 +1,121 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/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="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="http://ckeditor.com/">
+ http://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2015, <a class="samples" href="http://cksource.com/">CKSource</a>
+ - Frederico Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+</html>
diff --git a/js/ckeditor/samples/inlinetextarea.html b/js/ckeditor/samples/inlinetextarea.html
new file mode 100644
index 0000000..9e3d077
--- /dev/null
+++ b/js/ckeditor/samples/inlinetextarea.html
@@ -0,0 +1,110 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/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="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="http://ckeditor.com/">
+ http://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2015, <a class="samples" href="http://cksource.com/">CKSource</a>
+ - Frederico Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+</html>
diff --git a/js/ckeditor/samples/jquery.html b/js/ckeditor/samples/jquery.html
new file mode 100644
index 0000000..74e128a
--- /dev/null
+++ b/js/ckeditor/samples/jquery.html
@@ -0,0 +1,100 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/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>
+ <form action="sample_posteddata.php" method="post">
+ <div class="description">
+ <p>
+ This sample shows how to use the <a href="http://docs.ckeditor.com/#!/guide/dev_jquery">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="/ckeditor/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="http://ckeditor.com/">http://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2015, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+</html>
diff --git a/js/ckeditor/samples/plugins/dialog/assets/my_dialog.js b/js/ckeditor/samples/plugins/dialog/assets/my_dialog.js
new file mode 100644
index 0000000..8a9ea63
--- /dev/null
+++ b/js/ckeditor/samples/plugins/dialog/assets/my_dialog.js
@@ -0,0 +1,48 @@
+/**
+ * Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md or http://ckeditor.com/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/js/ckeditor/samples/plugins/dialog/dialog.html b/js/ckeditor/samples/plugins/dialog/dialog.html
new file mode 100644
index 0000000..a85c566
--- /dev/null
+++ b/js/ckeditor/samples/plugins/dialog/dialog.html
@@ -0,0 +1,187 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/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/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/index.html">CKEditor Samples</a> &raquo; Using CKEditor Dialog API
+ </h1>
+ <div class="description">
+ <p>
+ This sample shows how to use the
+ <a class="samples" href="http://docs.ckeditor.com/#!/api/CKEDITOR.dialog">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="http://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="http://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="http://ckeditor.com/">http://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2015, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+</html>
diff --git a/js/ckeditor/samples/plugins/enterkey/enterkey.html b/js/ckeditor/samples/plugins/enterkey/enterkey.html
new file mode 100644
index 0000000..61fbc72
--- /dev/null
+++ b/js/ckeditor/samples/plugins/enterkey/enterkey.html
@@ -0,0 +1,103 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <title>ENTER Key Configuration &mdash; CKEditor Sample</title>
+ <script src="../../../ckeditor.js"></script>
+ <link href="../../../samples/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/index.html">CKEditor Samples</a> &raquo; ENTER Key Configuration
+ </h1>
+ <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="http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-enterMode"><code>enterMode</code></a>
+ and <a class="samples" href="http://docs.ckeditor.com/#!/api/CKEDITOR.config-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="http://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="http://ckeditor.com/">http://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2015, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+</html>
diff --git a/js/ckeditor/samples/plugins/htmlwriter/assets/outputforflash/outputforflash.fla b/js/ckeditor/samples/plugins/htmlwriter/assets/outputforflash/outputforflash.fla
new file mode 100644
index 0000000..27e68cc
--- /dev/null
+++ b/js/ckeditor/samples/plugins/htmlwriter/assets/outputforflash/outputforflash.fla
Binary files differ
diff --git a/js/ckeditor/samples/plugins/htmlwriter/assets/outputforflash/outputforflash.swf b/js/ckeditor/samples/plugins/htmlwriter/assets/outputforflash/outputforflash.swf
new file mode 100644
index 0000000..dbe17b6
--- /dev/null
+++ b/js/ckeditor/samples/plugins/htmlwriter/assets/outputforflash/outputforflash.swf
Binary files differ
diff --git a/js/ckeditor/samples/plugins/htmlwriter/assets/outputforflash/swfobject.js b/js/ckeditor/samples/plugins/htmlwriter/assets/outputforflash/swfobject.js
new file mode 100644
index 0000000..95fdf0a
--- /dev/null
+++ b/js/ckeditor/samples/plugins/htmlwriter/assets/outputforflash/swfobject.js
@@ -0,0 +1,18 @@
+var swfobject=function(){function u(){if(!s){try{var a=d.getElementsByTagName("body")[0].appendChild(d.createElement("span"));a.parentNode.removeChild(a)}catch(b){return}s=!0;for(var a=x.length,c=0;c<a;c++)x[c]()}}function L(a){s?a():x[x.length]=a}function M(a){if(typeof m.addEventListener!=i)m.addEventListener("load",a,!1);else if(typeof d.addEventListener!=i)d.addEventListener("load",a,!1);else if(typeof m.attachEvent!=i)U(m,"onload",a);else if("function"==typeof m.onload){var b=m.onload;m.onload=
+function(){b();a()}}else m.onload=a}function V(){var a=d.getElementsByTagName("body")[0],b=d.createElement(r);b.setAttribute("type",y);var c=a.appendChild(b);if(c){var f=0;(function(){if(typeof c.GetVariable!=i){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;D()})()}else D()}function D(){var a=p.length;if(0<a)for(var b=0;b<a;b++){var c=p[b].id,
+f=p[b].callbackFn,g={success:!1,id:c};if(0<e.pv[0]){var d=n(c);if(d)if(z(p[b].swfVersion)&&!(e.wk&&312>e.wk))t(c,!0),f&&(g.success=!0,g.ref=E(c),f(g));else if(p[b].expressInstall&&F()){g={};g.data=p[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"),j=d.length,k=0;k<j;k++)"movie"!=d[k].getAttribute("name").toLowerCase()&&
+(h[d[k].getAttribute("name")]=d[k].getAttribute("value"));G(g,h,c,f)}else W(d),f&&f(g)}else if(t(c,!0),f){if((c=E(c))&&typeof c.SetVariable!=i)g.success=!0,g.ref=c;f(g)}}}function E(a){var b=null;if((a=n(a))&&"OBJECT"==a.nodeName)typeof a.SetVariable!=i?b=a:(a=a.getElementsByTagName(r)[0])&&(b=a);return b}function F(){return!A&&z("6.0.65")&&(e.win||e.mac)&&!(e.wk&&312>e.wk)}function G(a,b,c,f){A=!0;H=f||null;N={success:!1,id:c};var g=n(c);if(g){"OBJECT"==g.nodeName?(w=I(g),B=null):(w=g,B=c);a.id=
+O;if(typeof a.width==i||!/%$/.test(a.width)&&310>parseInt(a.width,10))a.width="310";if(typeof a.height==i||!/%$/.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="+m.location.toString().replace(/&/g,"%26")+"&MMplayerType="+f+"&MMdoctitle="+d.title;b.flashvars=typeof b.flashvars!=i?b.flashvars+("&"+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(){g.readyState==4?g.parentNode.removeChild(g):setTimeout(arguments.callee,10)}());J(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(I(a),b);a.style.display="none";(function(){4==a.readyState?a.parentNode.removeChild(a):setTimeout(arguments.callee,10)})()}else a.parentNode.replaceChild(I(a),a)}function I(a){var b=d.createElement("div");if(e.win&&
+e.ie)b.innerHTML=a.innerHTML;else if(a=a.getElementsByTagName(r)[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 J(a,b,c){var f,g=n(c);if(e.wk&&312>e.wk)return f;if(g)if(typeof a.id==i&&(a.id=c),e.ie&&e.win){var o="",h;for(h in a)a[h]!=Object.prototype[h]&&("data"==h.toLowerCase()?b.movie=a[h]:"styleclass"==h.toLowerCase()?o+=' class="'+a[h]+'"':"classid"!=h.toLowerCase()&&(o+=" "+
+h+'="'+a[h]+'"'));h="";for(var j in b)b[j]!=Object.prototype[j]&&(h+='<param name="'+j+'" value="'+b[j]+'" />');g.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'+o+">"+h+"</object>";C[C.length]=a.id;f=n(a.id)}else{j=d.createElement(r);j.setAttribute("type",y);for(var k in a)a[k]!=Object.prototype[k]&&("styleclass"==k.toLowerCase()?j.setAttribute("class",a[k]):"classid"!=k.toLowerCase()&&j.setAttribute(k,a[k]));for(o in b)b[o]!=Object.prototype[o]&&"movie"!=o.toLowerCase()&&
+(a=j,h=o,k=b[o],c=d.createElement("param"),c.setAttribute("name",h),c.setAttribute("value",k),a.appendChild(c));g.parentNode.replaceChild(j,g);f=j}return f}function P(a){var b=n(a);b&&"OBJECT"==b.nodeName&&(e.ie&&e.win?(b.style.display="none",function(){if(4==b.readyState){var c=n(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 n(a){var b=null;try{b=d.getElementById(a)}catch(c){}return b}
+function U(a,b,c){a.attachEvent(b,c);v[v.length]=[a,b,c]}function z(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];if(g){c=c&&"string"==typeof c?c:"screen";f&&(K=l=null);if(!l||K!=c)f=d.createElement("style"),f.setAttribute("type","text/css"),f.setAttribute("media",c),l=g.appendChild(f),
+e.ie&&(e.win&&typeof d.styleSheets!=i&&0<d.styleSheets.length)&&(l=d.styleSheets[d.styleSheets.length-1]),K=c;e.ie&&e.win?l&&typeof l.addRule==r&&l.addRule(a,b):l&&typeof d.createTextNode!=i&&l.appendChild(d.createTextNode(a+" {"+b+"}"))}}}function t(a,b){if(R){var c=b?"visible":"hidden";s&&n(a)?n(a).style.visibility=c:Q("#"+a,"visibility:"+c)}}function S(a){return null!=/[\\\"<>\.;]/.exec(a)&&typeof encodeURIComponent!=i?encodeURIComponent(a):a}var i="undefined",r="object",y="application/x-shockwave-flash",
+O="SWFObjectExprInst",m=window,d=document,q=navigator,T=!1,x=[function(){T?V():D()}],p=[],C=[],v=[],w,B,H,N,s=!1,A=!1,l,K,R=!0,e=function(){var a=typeof d.getElementById!=i&&typeof d.getElementsByTagName!=i&&typeof d.createElement!=i,b=q.userAgent.toLowerCase(),c=q.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(typeof q.plugins!=i&&typeof q.plugins["Shockwave Flash"]==
+r){if((h=q.plugins["Shockwave Flash"].description)&&!(typeof q.mimeTypes!=i&&q.mimeTypes[y]&&!q.mimeTypes[y].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(typeof m.ActiveXObject!=i)try{var j=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");if(j&&(h=j.GetVariable("$version")))g=!0,h=h.split(" ")[1].split(","),
+e=[parseInt(h[0],10),parseInt(h[1],10),parseInt(h[2],10)]}catch(k){}return{w3:a,pv:e,wk:b,ie:g,win:f,mac:c}}();(function(){e.w3&&((typeof d.readyState!=i&&"complete"==d.readyState||typeof d.readyState==i&&(d.getElementsByTagName("body")[0]||d.body))&&u(),s||(typeof d.addEventListener!=i&&d.addEventListener("DOMContentLoaded",u,!1),e.ie&&e.win&&(d.attachEvent("onreadystatechange",function(){"complete"==d.readyState&&(d.detachEvent("onreadystatechange",arguments.callee),u())}),m==top&&function(){if(!s){try{d.documentElement.doScroll("left")}catch(a){setTimeout(arguments.callee,
+0);return}u()}}()),e.wk&&function(){s||(/loaded|complete/.test(d.readyState)?u():setTimeout(arguments.callee,0))}(),M(u)))})();(function(){e.ie&&e.win&&window.attachEvent("onunload",function(){for(var a=v.length,b=0;b<a;b++)v[b][0].detachEvent(v[b][1],v[b][2]);a=C.length;for(b=0;b<a;b++)P(C[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;p[p.length]=d;t(a,!1)}else f&&f({success:!1,id:a})},getObjectById:function(a){if(e.w3)return E(a)},embedSWF:function(a,b,c,d,g,o,h,j,k,m){var n={success:!1,id:b};e.w3&&!(e.wk&&312>e.wk)&&a&&b&&c&&d&&g?(t(b,!1),L(function(){c+="";d+="";var e={};if(k&&typeof k===r)for(var l in k)e[l]=k[l];e.data=a;e.width=c;e.height=d;l={};if(j&&typeof j===r)for(var p in j)l[p]=j[p];if(h&&typeof h===r)for(var q in h)l.flashvars=typeof l.flashvars!=i?l.flashvars+("&"+q+"="+h[q]):q+"="+h[q];if(z(g))p=J(e,l,b),e.id==
+b&&t(b,!0),n.success=!0,n.ref=p;else{if(o&&F()){e.data=o;G(e,l,b,m);return}t(b,!0)}m&&m(n)})):m&&m(n)},switchOffAutoHideShow:function(){R=!1},ua:e,getFlashPlayerVersion:function(){return{major:e.pv[0],minor:e.pv[1],release:e.pv[2]}},hasFlashPlayerVersion:z,createSWF:function(a,b,c){if(e.w3)return J(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:L,addLoadEvent:M,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("&"),c=0;c<b.length;c++)if(b[c].substring(0,b[c].indexOf("="))==a)return S(b[c].substring(b[c].indexOf("=")+1))}return""},expressInstallCallback:function(){if(A){var a=n(O);a&&w&&(a.parentNode.replaceChild(w,a),B&&(t(B,!0),e.ie&&e.win&&(w.style.display="block")),H&&H(N));A=!1}}}}(); \ No newline at end of file
diff --git a/js/ckeditor/samples/plugins/htmlwriter/outputforflash.html b/js/ckeditor/samples/plugins/htmlwriter/outputforflash.html
new file mode 100644
index 0000000..ddef541
--- /dev/null
+++ b/js/ckeditor/samples/plugins/htmlwriter/outputforflash.html
@@ -0,0 +1,280 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <title>Output for Flash &mdash; CKEditor Sample</title>
+ <script src="../../../ckeditor.js"></script>
+ <script src="../../../samples/sample.js"></script>
+ <script src="assets/outputforflash/swfobject.js"></script>
+ <link href="../../../samples/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/index.html">CKEditor Samples</a> &raquo; Producing Flash Compliant HTML Output
+ </h1>
+ <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;http://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="http://ckeditor.com/">http://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2015, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+</html>
diff --git a/js/ckeditor/samples/plugins/htmlwriter/outputhtml.html b/js/ckeditor/samples/plugins/htmlwriter/outputhtml.html
new file mode 100644
index 0000000..587988a
--- /dev/null
+++ b/js/ckeditor/samples/plugins/htmlwriter/outputhtml.html
@@ -0,0 +1,221 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <title>HTML Compliant Output &mdash; CKEditor Sample</title>
+ <script src="../../../ckeditor.js"></script>
+ <script src="../../../samples/sample.js"></script>
+ <link href="../../../samples/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/index.html">CKEditor Samples</a> &raquo; Producing HTML Compliant Output
+ </h1>
+ <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="http://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: http://docs.ckeditor.com/#!/guide/dev_advanced_content_filter
+ */
+ 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="http://ckeditor.com/">http://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2015, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+</html>
diff --git a/js/ckeditor/samples/plugins/magicline/magicline.html b/js/ckeditor/samples/plugins/magicline/magicline.html
new file mode 100644
index 0000000..996c3b9
--- /dev/null
+++ b/js/ckeditor/samples/plugins/magicline/magicline.html
@@ -0,0 +1,206 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/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/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/index.html">CKEditor Samples</a> &raquo; Using Magicline plugin
+ </h1>
+ <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="http://ckeditor.com/">http://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2015, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+</html>
diff --git a/js/ckeditor/samples/plugins/toolbar/toolbar.html b/js/ckeditor/samples/plugins/toolbar/toolbar.html
new file mode 100644
index 0000000..79d230b
--- /dev/null
+++ b/js/ckeditor/samples/plugins/toolbar/toolbar.html
@@ -0,0 +1,232 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/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/sample.css" rel="stylesheet">
+</head>
+<body>
+ <h1 class="samples">
+ <a href="../../../samples/index.html">CKEditor Samples</a> &raquo; Toolbar Configuration
+ </h1>
+ <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="http://docs.ckeditor.com/#!/api/CKEDITOR.config-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="http://docs.ckeditor.com/#!/api/CKEDITOR.config-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="http://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="http://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="http://ckeditor.com/">http://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2015, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+</html>
diff --git a/js/ckeditor/samples/plugins/wysiwygarea/fullpage.html b/js/ckeditor/samples/plugins/wysiwygarea/fullpage.html
new file mode 100644
index 0000000..66b3f12
--- /dev/null
+++ b/js/ckeditor/samples/plugins/wysiwygarea/fullpage.html
@@ -0,0 +1,77 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <title>Full Page Editing &mdash; CKEditor Sample</title>
+ <script src="../../../ckeditor.js"></script>
+ <script src="../../../samples/sample.js"></script>
+ <link rel="stylesheet" href="../../../samples/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/index.html">CKEditor Samples</a> &raquo; Full Page Editing
+ </h1>
+ <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/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="http://ckeditor.com/">http://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2015, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+</html>
diff --git a/js/ckeditor/samples/readonly.html b/js/ckeditor/samples/readonly.html
new file mode 100644
index 0000000..bbd9f69
--- /dev/null
+++ b/js/ckeditor/samples/readonly.html
@@ -0,0 +1,73 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/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.
+ // http://docs.ckeditor.com/#!/api/CKEDITOR.editor-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="description">
+ <p>
+ This sample shows how to use the
+ <code><a class="samples" href="http://docs.ckeditor.com/#!/api/CKEDITOR.editor-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="http://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="http://ckeditor.com/">http://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2015, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+</html>
diff --git a/js/ckeditor/samples/replacebyclass.html b/js/ckeditor/samples/replacebyclass.html
new file mode 100644
index 0000000..1547f33
--- /dev/null
+++ b/js/ckeditor/samples/replacebyclass.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/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="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="http://ckeditor.com/">http://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2015, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+</html>
diff --git a/js/ckeditor/samples/replacebycode.html b/js/ckeditor/samples/replacebycode.html
new file mode 100644
index 0000000..e25e915
--- /dev/null
+++ b/js/ckeditor/samples/replacebycode.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/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>
+ <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="http://ckeditor.com/">http://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2015, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+</html>
diff --git a/js/ckeditor/samples/sample.css b/js/ckeditor/samples/sample.css
new file mode 100644
index 0000000..4d138a8
--- /dev/null
+++ b/js/ckeditor/samples/sample.css
@@ -0,0 +1,365 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/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;
+ -o-tab-size: 4;
+ -webkit-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;
+
+ -moz-border-radius: 3px;
+ -webkit-border-radius: 3px;
+ 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;
+
+ -moz-border-radius: 3px;
+ -webkit-border-radius: 3px;
+ border-radius: 3px;
+}
+
+.new
+{
+ background: #FF7E00;
+ border: 1px solid #DA8028;
+ text-shadow: 0 1px 0 #C97626;
+
+ -moz-box-shadow: 0 2px 3px 0 #FFA54E inset;
+ -webkit-box-shadow: 0 2px 3px 0 #FFA54E inset;
+ box-shadow: 0 2px 3px 0 #FFA54E inset;
+}
+
+.beta
+{
+ background: #18C0DF;
+ border: 1px solid #19AAD8;
+ text-shadow: 0 1px 0 #048CAD;
+ font-style: italic;
+
+ -moz-box-shadow: 0 2px 3px 0 #50D4FD inset;
+ -webkit-box-shadow: 0 2px 3px 0 #50D4FD inset;
+ 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;
+}
+
+/* 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;
+}
diff --git a/js/ckeditor/samples/sample.js b/js/ckeditor/samples/sample.js
new file mode 100644
index 0000000..2bdcd98
--- /dev/null
+++ b/js/ckeditor/samples/sample.js
@@ -0,0 +1,50 @@
+/**
+ * Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md or http://ckeditor.com/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/js/ckeditor/samples/sample_posteddata.php b/js/ckeditor/samples/sample_posteddata.php
new file mode 100644
index 0000000..7775f07
--- /dev/null
+++ b/js/ckeditor/samples/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-2015, CKSource - Frederico Knabben. All rights reserved.
+ For licensing, see LICENSE.md or <a href="http://ckeditor.com/license">http://ckeditor.com/license</a>
+-------------------------------------------------------------------------------------------
+
+</pre><div style="display:none"></body> */ include "assets/posteddata.php"; ?>
diff --git a/js/ckeditor/samples/tabindex.html b/js/ckeditor/samples/tabindex.html
new file mode 100644
index 0000000..5d1ab63
--- /dev/null
+++ b/js/ckeditor/samples/tabindex.html
@@ -0,0 +1,75 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/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="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="http://ckeditor.com/">http://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2015, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+</html>
diff --git a/js/ckeditor/samples/uicolor.html b/js/ckeditor/samples/uicolor.html
new file mode 100644
index 0000000..d7c5dea
--- /dev/null
+++ b/js/ckeditor/samples/uicolor.html
@@ -0,0 +1,69 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/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="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="http://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="http://ckeditor.com/">http://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2015, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+</html>
diff --git a/js/ckeditor/samples/uilanguages.html b/js/ckeditor/samples/uilanguages.html
new file mode 100644
index 0000000..4e73dcc
--- /dev/null
+++ b/js/ckeditor/samples/uilanguages.html
@@ -0,0 +1,119 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/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="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="http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-language">language</a></code> and
+ <code><a class="samples" href="http://docs.ckeditor.com/#!/api/CKEDITOR.config-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="http://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="http://ckeditor.com/">http://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2015, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+</html>
diff --git a/js/ckeditor/samples/xhtmlstyle.html b/js/ckeditor/samples/xhtmlstyle.html
new file mode 100644
index 0000000..b53b431
--- /dev/null
+++ b/js/ckeditor/samples/xhtmlstyle.html
@@ -0,0 +1,231 @@
+<!DOCTYPE html>
+<!--
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/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="../samples/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="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="http://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="http://ckeditor.com/">http://ckeditor.com</a>
+ </p>
+ <p id="copy">
+ Copyright &copy; 2003-2015, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
+ Knabben. All rights reserved.
+ </p>
+ </div>
+</body>
+</html>
diff --git a/js/ckeditor/skins/moono/dialog.css b/js/ckeditor/skins/moono/dialog.css
new file mode 100644
index 0000000..8fdd5ab
--- /dev/null
+++ b/js/ckeditor/skins/moono/dialog.css
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5;opacity:.8;filter:alpha(opacity = 80)}.cke_dialog_close_button:hover{opacity:1;filter:alpha(opacity = 100)}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:4px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 10px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:18px;padding:0 12px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:3px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:25px;line-height:25px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:3px 3px 3px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%} \ No newline at end of file
diff --git a/js/ckeditor/skins/moono/dialog_ie.css b/js/ckeditor/skins/moono/dialog_ie.css
new file mode 100644
index 0000000..48c1b4b
--- /dev/null
+++ b/js/ckeditor/skins/moono/dialog_ie.css
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5;opacity:.8;filter:alpha(opacity = 80)}.cke_dialog_close_button:hover{opacity:1;filter:alpha(opacity = 100)}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:4px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 10px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:18px;padding:0 12px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:3px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:25px;line-height:25px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:3px 3px 3px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0} \ No newline at end of file
diff --git a/js/ckeditor/skins/moono/dialog_ie7.css b/js/ckeditor/skins/moono/dialog_ie7.css
new file mode 100644
index 0000000..bdc5a38
--- /dev/null
+++ b/js/ckeditor/skins/moono/dialog_ie7.css
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5;opacity:.8;filter:alpha(opacity = 80)}.cke_dialog_close_button:hover{opacity:1;filter:alpha(opacity = 100)}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:4px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 10px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:18px;padding:0 12px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:3px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:25px;line-height:25px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:3px 3px 3px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}.cke_dialog_title{zoom:1}.cke_dialog_footer{border-top:1px solid #bfbfbf}.cke_dialog_footer_buttons{position:static}.cke_dialog_footer_buttons a.cke_dialog_ui_button{vertical-align:top}.cke_dialog .cke_resizer_ltr{padding-left:4px}.cke_dialog .cke_resizer_rtl{padding-right:4px}.cke_dialog_ui_input_text,.cke_dialog_ui_input_password,.cke_dialog_ui_input_textarea,.cke_dialog_ui_input_select{padding:0!important}.cke_dialog_ui_checkbox_input,.cke_dialog_ui_ratio_input,.cke_btn_reset,.cke_btn_locked,.cke_btn_unlocked{border:1px solid transparent!important} \ No newline at end of file
diff --git a/js/ckeditor/skins/moono/dialog_ie8.css b/js/ckeditor/skins/moono/dialog_ie8.css
new file mode 100644
index 0000000..89b1664
--- /dev/null
+++ b/js/ckeditor/skins/moono/dialog_ie8.css
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5;opacity:.8;filter:alpha(opacity = 80)}.cke_dialog_close_button:hover{opacity:1;filter:alpha(opacity = 100)}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:4px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 10px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:18px;padding:0 12px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:3px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:25px;line-height:25px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:3px 3px 3px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{display:block} \ No newline at end of file
diff --git a/js/ckeditor/skins/moono/dialog_iequirks.css b/js/ckeditor/skins/moono/dialog_iequirks.css
new file mode 100644
index 0000000..a168d84
--- /dev/null
+++ b/js/ckeditor/skins/moono/dialog_iequirks.css
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5;opacity:.8;filter:alpha(opacity = 80)}.cke_dialog_close_button:hover{opacity:1;filter:alpha(opacity = 100)}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:4px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 10px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:18px;padding:0 12px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:3px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:25px;line-height:25px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:3px 3px 3px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}.cke_dialog_footer{filter:""} \ No newline at end of file
diff --git a/js/ckeditor/skins/moono/dialog_opera.css b/js/ckeditor/skins/moono/dialog_opera.css
new file mode 100644
index 0000000..2f5072d
--- /dev/null
+++ b/js/ckeditor/skins/moono/dialog_opera.css
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_browser_gecko19 .cke_dialog_body{position:relative}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff5f5f5',endColorstr='#ffcfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fffafafa',endColorstr='#ffededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:0 0;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:3px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffffff',endColorstr='#ffe4e4e4')}span.cke_dialog_ui_button{padding:0 12px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff2f2f2',endColorstr='#ffcccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}a.cke_dialog_ui_button_ok span,a.cke_dialog_ui_button_cancel span{color:inherit;font-size:12px;font-weight:bold;text-shadow:0 1px 0 #fff;line-height:20px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ff9ad717',endColorstr='#ff69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:2px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:24px;line-height:24px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:2px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background-position:0 -32px;background-image:url(images/mini.png);width:16px;height:16px;background-repeat:no-repeat;border:1px none;font-size:1px}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;background-position:0 0;background-image:url(images/mini.png);width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_unlocked{background-position:0 -16px;background-image:url(images/mini.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_dialog_footer{display:block;height:38px}.cke_ltr .cke_dialog_footer>*{float:right}.cke_rtl .cke_dialog_footer>*{float:left} \ No newline at end of file
diff --git a/js/ckeditor/skins/moono/editor.css b/js/ckeditor/skins/moono/editor.css
new file mode 100644
index 0000000..e3c946a
--- /dev/null
+++ b/js/ckeditor/skins/moono/editor.css
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_ltr .cke_button:last-child,.cke_rtl .cke_button:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_ltr .cke_button:first-child,.cke_rtl .cke_button:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_on{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png) no-repeat 0 -1032px !important;background-size: 16px !important;} \ No newline at end of file
diff --git a/js/ckeditor/skins/moono/editor_gecko.css b/js/ckeditor/skins/moono/editor_gecko.css
new file mode 100644
index 0000000..98fa259
--- /dev/null
+++ b/js/ckeditor/skins/moono/editor_gecko.css
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_ltr .cke_button:last-child,.cke_rtl .cke_button:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_ltr .cke_button:first-child,.cke_rtl .cke_button:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_on{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}.cke_bottom{padding-bottom:3px}.cke_combo_text{margin-bottom:-1px;margin-top:1px}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png) no-repeat 0 -1032px !important;background-size: 16px !important;} \ No newline at end of file
diff --git a/js/ckeditor/skins/moono/editor_ie.css b/js/ckeditor/skins/moono/editor_ie.css
new file mode 100644
index 0000000..fa4cf00
--- /dev/null
+++ b/js/ckeditor/skins/moono/editor_ie.css
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_ltr .cke_button:last-child,.cke_rtl .cke_button:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_ltr .cke_button:first-child,.cke_rtl .cke_button:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_on{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png) no-repeat 0 -1032px !important;background-size: 16px !important;} \ No newline at end of file
diff --git a/js/ckeditor/skins/moono/editor_ie7.css b/js/ckeditor/skins/moono/editor_ie7.css
new file mode 100644
index 0000000..fe43ce5
--- /dev/null
+++ b/js/ckeditor/skins/moono/editor_ie7.css
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_ltr .cke_button:last-child,.cke_rtl .cke_button:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_ltr .cke_button:first-child,.cke_rtl .cke_button:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_on{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_button,.cke_rtl .cke_button *,.cke_rtl .cke_combo,.cke_rtl .cke_combo *,.cke_rtl .cke_path_item,.cke_rtl .cke_path_item *,.cke_rtl .cke_path_empty{float:none}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_combo_button,.cke_rtl .cke_combo_button *,.cke_rtl .cke_button,.cke_rtl .cke_button_icon{display:inline-block;vertical-align:top}.cke_toolbox{display:inline-block;padding-bottom:5px;height:100%}.cke_rtl .cke_toolbox{padding-bottom:0}.cke_toolbar{margin-bottom:5px}.cke_rtl .cke_toolbar{margin-bottom:0}.cke_toolgroup{height:26px}.cke_toolgroup,.cke_combo{position:relative}a.cke_button{float:none;vertical-align:top}.cke_toolbar_separator{display:inline-block;float:none;vertical-align:top;background-color:#c0c0c0}.cke_toolbox_collapser .cke_arrow{margin-top:0}.cke_toolbox_collapser .cke_arrow{border-width:4px}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{border-width:3px}.cke_rtl .cke_button_arrow{padding-top:8px;margin-right:2px}.cke_rtl .cke_combo_inlinelabel{display:table-cell;vertical-align:middle}.cke_menubutton{display:block;height:24px}.cke_menubutton_inner{display:block;position:relative}.cke_menubutton_icon{height:16px;width:16px}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:inline-block}.cke_menubutton_label{width:auto;vertical-align:top;line-height:24px;height:24px;margin:0 10px 0 0}.cke_menuarrow{width:5px;height:6px;padding:0;position:absolute;right:8px;top:10px;background-position:0 0}.cke_rtl .cke_menubutton_icon{position:absolute;right:0;top:0}.cke_rtl .cke_menubutton_label{float:right;clear:both;margin:0 24px 0 10px}.cke_hc .cke_rtl .cke_menubutton_label{margin-right:0}.cke_rtl .cke_menuarrow{left:8px;right:auto;background-position:0 -24px}.cke_hc .cke_menuarrow{top:5px;padding:0 5px}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{position:relative}.cke_wysiwyg_div{padding-top:0!important;padding-bottom:0!important}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png) no-repeat 0 -1032px !important;background-size: 16px !important;} \ No newline at end of file
diff --git a/js/ckeditor/skins/moono/editor_ie8.css b/js/ckeditor/skins/moono/editor_ie8.css
new file mode 100644
index 0000000..e5174c7
--- /dev/null
+++ b/js/ckeditor/skins/moono/editor_ie8.css
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_ltr .cke_button:last-child,.cke_rtl .cke_button:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_ltr .cke_button:first-child,.cke_rtl .cke_button:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_on{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_toolbox_collapser .cke_arrow{border-width:4px}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{border-width:3px}.cke_toolbox_collapser .cke_arrow{margin-top:0}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png) no-repeat 0 -1032px !important;background-size: 16px !important;} \ No newline at end of file
diff --git a/js/ckeditor/skins/moono/editor_iequirks.css b/js/ckeditor/skins/moono/editor_iequirks.css
new file mode 100644
index 0000000..4048b69
--- /dev/null
+++ b/js/ckeditor/skins/moono/editor_iequirks.css
@@ -0,0 +1,5 @@
+/*
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.md or http://ckeditor.com/license
+*/
+.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_ltr .cke_button:last-child,.cke_rtl .cke_button:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_ltr .cke_button:first-child,.cke_rtl .cke_button:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_on{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_top,.cke_contents,.cke_bottom{width:100%}.cke_button_arrow{font-size:0}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_button,.cke_rtl .cke_button *,.cke_rtl .cke_combo,.cke_rtl .cke_combo *,.cke_rtl .cke_path_item,.cke_rtl .cke_path_item *,.cke_rtl .cke_path_empty{float:none}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_combo_button,.cke_rtl .cke_combo_button *,.cke_rtl .cke_button,.cke_rtl .cke_button_icon{display:inline-block;vertical-align:top}.cke_rtl .cke_button_icon{float:none}.cke_resizer{width:10px}.cke_source{white-space:normal}.cke_bottom{position:static}.cke_colorbox{font-size:0}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png) no-repeat 0 -1032px !important;background-size: 16px !important;} \ No newline at end of file
diff --git a/js/ckeditor/skins/moono/icons.png b/js/ckeditor/skins/moono/icons.png
new file mode 100644
index 0000000..ee02970
--- /dev/null
+++ b/js/ckeditor/skins/moono/icons.png
Binary files differ
diff --git a/js/ckeditor/skins/moono/icons_hidpi.png b/js/ckeditor/skins/moono/icons_hidpi.png
new file mode 100644
index 0000000..0466c2b
--- /dev/null
+++ b/js/ckeditor/skins/moono/icons_hidpi.png
Binary files differ
diff --git a/js/ckeditor/skins/moono/images/arrow.png b/js/ckeditor/skins/moono/images/arrow.png
new file mode 100644
index 0000000..d72b5f3
--- /dev/null
+++ b/js/ckeditor/skins/moono/images/arrow.png
Binary files differ
diff --git a/js/ckeditor/skins/moono/images/close.png b/js/ckeditor/skins/moono/images/close.png
new file mode 100644
index 0000000..6a04ab5
--- /dev/null
+++ b/js/ckeditor/skins/moono/images/close.png
Binary files differ
diff --git a/js/ckeditor/skins/moono/images/hidpi/close.png b/js/ckeditor/skins/moono/images/hidpi/close.png
new file mode 100644
index 0000000..e406c2c
--- /dev/null
+++ b/js/ckeditor/skins/moono/images/hidpi/close.png
Binary files differ
diff --git a/js/ckeditor/skins/moono/images/hidpi/lock-open.png b/js/ckeditor/skins/moono/images/hidpi/lock-open.png
new file mode 100644
index 0000000..edbd12f
--- /dev/null
+++ b/js/ckeditor/skins/moono/images/hidpi/lock-open.png
Binary files differ
diff --git a/js/ckeditor/skins/moono/images/hidpi/lock.png b/js/ckeditor/skins/moono/images/hidpi/lock.png
new file mode 100644
index 0000000..1b87bbb
--- /dev/null
+++ b/js/ckeditor/skins/moono/images/hidpi/lock.png
Binary files differ
diff --git a/js/ckeditor/skins/moono/images/hidpi/refresh.png b/js/ckeditor/skins/moono/images/hidpi/refresh.png
new file mode 100644
index 0000000..c6c2b86
--- /dev/null
+++ b/js/ckeditor/skins/moono/images/hidpi/refresh.png
Binary files differ
diff --git a/js/ckeditor/skins/moono/images/lock-open.png b/js/ckeditor/skins/moono/images/lock-open.png
new file mode 100644
index 0000000..0476987
--- /dev/null
+++ b/js/ckeditor/skins/moono/images/lock-open.png
Binary files differ
diff --git a/js/ckeditor/skins/moono/images/lock.png b/js/ckeditor/skins/moono/images/lock.png
new file mode 100644
index 0000000..c5a1440
--- /dev/null
+++ b/js/ckeditor/skins/moono/images/lock.png
Binary files differ
diff --git a/js/ckeditor/skins/moono/images/mini.png b/js/ckeditor/skins/moono/images/mini.png
new file mode 100644
index 0000000..3e65bd5
--- /dev/null
+++ b/js/ckeditor/skins/moono/images/mini.png
Binary files differ
diff --git a/js/ckeditor/skins/moono/images/refresh.png b/js/ckeditor/skins/moono/images/refresh.png
new file mode 100644
index 0000000..1ff63c3
--- /dev/null
+++ b/js/ckeditor/skins/moono/images/refresh.png
Binary files differ
diff --git a/js/ckeditor/skins/moono/readme.md b/js/ckeditor/skins/moono/readme.md
new file mode 100644
index 0000000..e3abd58
--- /dev/null
+++ b/js/ckeditor/skins/moono/readme.md
@@ -0,0 +1,51 @@
+"Moono" Skin
+====================
+
+This skin has been chosen for the **default skin** of CKEditor 4.x, elected from the CKEditor
+[skin contest](http://ckeditor.com/blog/new_ckeditor_4_skin) and further shaped by
+the CKEditor team. "Moono" is maintained by the core developers.
+
+For more information about skins, please check the [CKEditor Skin SDK](http://docs.cksource.com/CKEditor_4.x/Skin_SDK)
+documentation.
+
+Features
+-------------------
+"Moono" is a monochromatic skin, which offers a modern look coupled with gradients and transparency.
+It comes with the following features:
+
+- Chameleon feature with brightness,
+- high-contrast compatibility,
+- graphics source provided in SVG.
+
+Directory Structure
+-------------------
+
+CSS parts:
+- **editor.css**: the main CSS file. It's simply loading several other files, for easier maintenance,
+- **mainui.css**: the file contains styles of entire editor outline structures,
+- **toolbar.css**: the file contains styles of the editor toolbar space (top),
+- **richcombo.css**: the file contains styles of the rich combo ui elements on toolbar,
+- **panel.css**: the file contains styles of the rich combo drop-down, it's not loaded
+until the first panel open up,
+- **elementspath.css**: the file contains styles of the editor elements path bar (bottom),
+- **menu.css**: the file contains styles of all editor menus including context menu and button drop-down,
+it's not loaded until the first menu open up,
+- **dialog.css**: the CSS files for the dialog UI, it's not loaded until the first dialog open,
+- **reset.css**: the file defines the basis of style resets among all editor UI spaces,
+- **preset.css**: the file defines the default styles of some UI elements reflecting the skin preference,
+- **editor_XYZ.css** and **dialog_XYZ.css**: browser specific CSS hacks.
+
+Other parts:
+- **skin.js**: the only JavaScript part of the skin that registers the skin, its browser specific files and its icons and defines the Chameleon feature,
+- **icons/**: contains all skin defined icons,
+- **images/**: contains a fill general used images,
+- **dev/**: contains SVG source of the skin icons.
+
+License
+-------
+
+Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+
+Licensed under the terms of any of the following licenses at your choice: [GPL](http://www.gnu.org/licenses/gpl.html), [LGPL](http://www.gnu.org/licenses/lgpl.html) and [MPL](http://www.mozilla.org/MPL/MPL-1.1.html).
+
+See LICENSE.md for more information.
diff --git a/js/ckeditor/styles.js b/js/ckeditor/styles.js
new file mode 100644
index 0000000..38bb680
--- /dev/null
+++ b/js/ckeditor/styles.js
@@ -0,0 +1,111 @@
+/**
+ * Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md or http://ckeditor.com/license
+ */
+
+// This file contains style definitions that can be used by CKEditor plugins.
+//
+// The most common use for it is the "stylescombo" plugin, which shows a combo
+// in the editor toolbar, containing all styles. Other plugins instead, like
+// the div plugin, use a subset of the styles on their feature.
+//
+// If you don't have plugins that depend on this file, you can simply ignore it.
+// Otherwise it is strongly recommended to customize this file to match your
+// website requirements and design properly.
+
+CKEDITOR.stylesSet.add( 'default', [
+ /* Block Styles */
+
+ // These styles are already available in the "Format" combo ("format" plugin),
+ // so they are not needed here by default. You may enable them to avoid
+ // placing the "Format" combo in the toolbar, maintaining the same features.
+ /*
+ { name: 'Paragraph', element: 'p' },
+ { name: 'Heading 1', element: 'h1' },
+ { name: 'Heading 2', element: 'h2' },
+ { name: 'Heading 3', element: 'h3' },
+ { name: 'Heading 4', element: 'h4' },
+ { name: 'Heading 5', element: 'h5' },
+ { name: 'Heading 6', element: 'h6' },
+ { name: 'Preformatted Text',element: 'pre' },
+ { name: 'Address', element: 'address' },
+ */
+
+ { name: 'Italic Title', element: 'h2', styles: { 'font-style': 'italic' } },
+ { name: 'Subtitle', element: 'h3', styles: { 'color': '#aaa', 'font-style': 'italic' } },
+ {
+ name: 'Special Container',
+ element: 'div',
+ styles: {
+ padding: '5px 10px',
+ background: '#eee',
+ border: '1px solid #ccc'
+ }
+ },
+
+ /* Inline Styles */
+
+ // These are core styles available as toolbar buttons. You may opt enabling
+ // some of them in the Styles combo, removing them from the toolbar.
+ // (This requires the "stylescombo" plugin)
+ /*
+ { name: 'Strong', element: 'strong', overrides: 'b' },
+ { name: 'Emphasis', element: 'em' , overrides: 'i' },
+ { name: 'Underline', element: 'u' },
+ { name: 'Strikethrough', element: 'strike' },
+ { name: 'Subscript', element: 'sub' },
+ { name: 'Superscript', element: 'sup' },
+ */
+
+ { name: 'Marker', element: 'span', attributes: { 'class': 'marker' } },
+
+ { name: 'Big', element: 'big' },
+ { name: 'Small', element: 'small' },
+ { name: 'Typewriter', element: 'tt' },
+
+ { 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' },
+
+ { name: 'Language: RTL', element: 'span', attributes: { 'dir': 'rtl' } },
+ { name: 'Language: LTR', element: 'span', attributes: { 'dir': 'ltr' } },
+
+ /* Object Styles */
+
+ {
+ name: 'Styled image (left)',
+ element: 'img',
+ attributes: { 'class': 'left' }
+ },
+
+ {
+ name: 'Styled image (right)',
+ element: 'img',
+ attributes: { 'class': 'right' }
+ },
+
+ {
+ name: 'Compact table',
+ element: 'table',
+ attributes: {
+ cellpadding: '5',
+ cellspacing: '0',
+ border: '1',
+ bordercolor: '#ccc'
+ },
+ styles: {
+ 'border-collapse': 'collapse'
+ }
+ },
+
+ { name: 'Borderless Table', element: 'table', styles: { 'border-style': 'hidden', 'background-color': '#E6E6FA' } },
+ { name: 'Square Bulleted List', element: 'ul', styles: { 'list-style-type': 'square' } }
+] );
+
diff --git a/js/details.js b/js/details.js
new file mode 100644
index 0000000..6ee1472
--- /dev/null
+++ b/js/details.js
@@ -0,0 +1,46 @@
+Event.observe(window,'load',detailsInit);
+
+function detailsInit() {
+
+ // set current task
+ var title = document.getElementsByTagName('title')[0];
+ title = title.textContent || title.text; //IE uses .text
+ var arr = /(#)(\d+)/.exec(title);
+ if( arr != null){
+ sessionStorage.setItem('current_task', arr[2]);
+
+ // make sure the page is not in edit mode, 'details' is id of description textarea
+ if (!document.getElementById('details')) {
+ Event.observe(document,'keydown',keyboardNavigation);
+ }
+ }
+}
+function keyboardNavigation(e) {
+ var src = Event.element(e);
+ if (/input|select|textarea/.test(src.nodeName.toLowerCase())) {
+ // don't do anything if key is pressed in input, select or textarea
+ return;
+ }
+ if ((useAltForKeyboardNavigation && !e.altKey) ||
+ e.ctrlKey || e.shiftKey) {
+ return;
+ }
+ switch (e.keyCode) {
+ case 85: // "u" get back to task list
+ window.location = $('indexlink').href;
+ Event.stop(e);
+ break;
+ case 80: // "p" move to previous task
+ if ($('prev')) {
+ window.location = $('prev').href;
+ Event.stop(e);
+ }
+ break;
+ case 78: // "n" move to next task
+ if ($('next')) {
+ window.location = $('next').href;
+ Event.stop(e);
+ }
+ break;
+ }
+}
diff --git a/js/functions.js b/js/functions.js
new file mode 100644
index 0000000..6df60e2
--- /dev/null
+++ b/js/functions.js
@@ -0,0 +1,576 @@
+// Set up the task list onclick handler
+addEvent(window,'load',setUpTasklistTable);
+function Disable(formid)
+{
+ document.formid.buSubmit.disabled = true;
+ document.formid.submit();
+}
+
+function showstuff(boxid, type){
+ if (!type) type = 'block';
+ $(boxid).style.display= type;
+ $(boxid).style.visibility='visible';
+}
+
+function hidestuff(boxid){
+ $(boxid).style.display='none';
+}
+
+function hidestuff_e(e, boxid){
+ e = e || window.event;
+ if (Event.element(e).getAttribute('id') !== 'lastsearchlink' ||
+ (Event.element(e).getAttribute('id') === 'lastsearchlink' && $('lastsearchlink').className == 'inactive')) {
+ if (!Position.within($(boxid), Event.pointerX(e), Event.pointerY(e))) {
+ //Event.stop(e);
+ if (boxid === 'mysearches') {
+ activelink('lastsearchlink');
+ }
+ $(boxid).style.visibility='hidden';
+ $(boxid).style.display='none';
+ document.onmouseup = null;
+ }
+ }
+}
+
+function showhidestuff(boxid) {
+ if (boxid === 'mysearches') {
+ activelink('lastsearchlink');
+ }
+ switch ($(boxid).style.visibility) {
+ case '':
+ $(boxid).style.visibility='visible';
+ break;
+ case 'hidden':
+ $(boxid).style.visibility='visible';
+ break;
+ case 'visible':
+ $(boxid).style.visibility='hidden';
+ break;
+ }
+ switch ($(boxid).style.display) {
+ case '':
+ $(boxid).style.display='block';
+ document.onmouseup = function(e) { hidestuff_e(e, boxid); };
+ break;
+ case 'none':
+ $(boxid).style.display='block';
+ document.onmouseup = function(e) { hidestuff_e(e, boxid); };
+ break;
+ case 'block':
+ $(boxid).style.display='none';
+ document.onmouseup = null;
+ break;
+ case 'inline':
+ $(boxid).style.display='none';
+ document.onmouseup = null;
+ break;
+ }
+}
+function setUpTasklistTable() {
+ if (!$('tasklist_table')) {
+ // No tasklist on the page
+ return;
+ }
+ var table = $('tasklist_table');
+ // deactivated 201508: when users click on cells with property, IMHO it should go to property or filter list by property, not open task details view.
+ //addEvent(table,'click',tasklistTableClick);
+}
+function tasklistTableClick(e) {
+ var src = eventGetSrc(e);
+ if (src.nodeName != 'TD') {
+ return;
+ }
+ if (src.hasChildNodes()) {
+ var checkBoxes = src.getElementsByTagName('input');
+ if (checkBoxes.length > 0) {
+ // User clicked the cell where the task select checkbox is
+ if (checkBoxes[0].checked) {
+ checkBoxes[0].checked = false;
+ } else {
+ checkBoxes[0].checked = true;
+ }
+ return;
+ }
+ }
+ var row = src.parentNode;
+ var aElements = row.getElementsByTagName('A');
+ if (aElements.length > 0) {
+ window.location = aElements[0].href;
+ } else {
+ // If both the task id and the task summary columns are non-visible
+ // just use the good old way to get to the task
+ window.location = '?do=details&task_id=' + row.id.substr(4);
+ }
+}
+
+function eventGetSrc(e) {
+ if (e.target) {
+ return e.target;
+ } else if (window.event) {
+ return window.event.srcElement;
+ } else {
+ return;
+ }
+}
+
+function ToggleSelected(id) {
+ var inputs = $(id).getElementsByTagName('input');
+ for (var i = 0; i < inputs.length; i++) {
+ if(inputs[i].type == 'checkbox'){
+ inputs[i].checked = !(inputs[i].checked);
+ }
+ }
+}
+
+function addUploadFields(id) {
+ if (!id) {
+ id = 'uploadfilebox';
+ }
+ var el = $(id);
+ var span = el.getElementsByTagName('span')[0];
+ if ('none' == span.style.display) {
+ // Show the file upload box
+ span.style.display = 'inline';
+ // Switch the buttns
+ $(id + '_attachafile').style.display = 'none';
+ $(id + '_attachanotherfile').style.display = 'inline';
+
+ } else {
+ // Copy the first file upload box and clear it's value
+ var newBox = span.cloneNode(true);
+ newBox.getElementsByTagName('input')[0].value = '';
+ el.appendChild(newBox);
+ }
+}
+
+function addLinkField(id) {
+ if(!id) {
+ id = 'addlinkbox';
+ }
+ var el = $(id);
+ var span = el.getElementsByTagName('span')[0];
+ if('none' == span.style.display) {
+
+ span.style.display = 'inline';
+
+ $(id + '_addalink').style.display = 'none';
+ $(id + '_addanotherlink').style.display = 'inline';
+ } else {
+
+ var newBox = span.cloneNode(true);
+ newBox.getElementsByTagName('input')[0].value = '';
+ el.appendChild(newBox);
+ }
+}
+
+function checkok(url, message, form) {
+
+ var myAjax = new Ajax.Request(url, {method: 'get', onComplete:function(originalRequest)
+ {
+ if(originalRequest.responseText == 'ok' || confirm(message)) {
+ $(form).submit();
+ }
+ }});
+ return false;
+}
+
+function removeUploadField(element, id) {
+ if (!id) {
+ id = 'uploadfilebox';
+ }
+ var el = $(id);
+ var span = el.getElementsByTagName('span');
+ if (1 == span.length) {
+ // Clear and hide the box
+ span[0].style.display='none';
+ span[0].getElementsByTagName('input')[0].value = '';
+ // Switch the buttons
+ $(id + '_attachafile').style.display = 'inline';
+ $(id + '_attachanotherfile').style.display = 'none';
+ } else {
+ el.removeChild(element.parentNode);
+ }
+}
+
+function removeLinkField(element, id) {
+ if(!id) {
+ id = 'addlinkbox';
+ }
+ var el = $(id);
+ var span = el.getElementsByTagName('span');
+ if (1 == span.length) {
+ span[0].style.display='none';
+ span[0].getElementsByTagName('input')[0].value = '';
+
+ $(id + '_addalink').style.display = 'inline';
+ $(id + '_addanotherlink').style.display = 'none';
+ } else {
+ el.removeChild(element.parentNode);
+ }
+}
+
+function updateDualSelectValue(id)
+{
+ var rt = $('r'+id);
+ var val = $('v'+id);
+ val.value = '';
+
+ var i;
+ for (i=0; i < rt.options.length; i++) {
+ val.value += (i > 0 ? ' ' : '') + rt.options[i].value;
+ }
+}
+function dualSelect(from, to, id) {
+ if (typeof(from) == 'string') {
+ from = $(from+id);
+ }
+ if (typeof(to) == 'string') {
+ var to_el = $(to+id);
+ // if (!to_el) alert("no element with id '" + (to+id) + "'");
+ to = to_el;
+ }
+
+ var i;
+ var len = from.options.length;
+ for(i=0;i<len;++i) {
+ if (!from.options[i].selected) continue;
+ if (to && to.options)
+ to.appendChild(from.options[i]);
+ else
+ from.removeChild(from.options[i]);
+ // make the option that is slid down selected (if any)
+ if (len > 1)
+ from.options[i == len - 1 ? len - 2 : i].selected = true;
+ break;
+ }
+
+ updateDualSelectValue(id);
+}
+
+function selectMove(id, step) {
+ var sel = $('r'+id);
+
+ var i = 0;
+
+ while (i < sel.options.length) {
+ if (sel.options[i].selected) {
+ if (i+step < 0 || i+step >= sel.options.length) {
+ return;
+ }
+ if (i + step == sel.options.length - 1)
+ sel.appendChild(sel.options[i]);
+ else if (step < 0)
+ sel.insertBefore(sel.options[i], sel.options[i+step]);
+ else
+ sel.insertBefore(sel.options[i], sel.options[i+step+1]);
+ updateDualSelectValue(id);
+ return;
+ }
+ i++;
+ }
+}
+var Cookie = {
+ getVar: function(name) {
+ var cookie = document.cookie;
+ if (cookie.length > 0) {
+ cookie += ';';
+ }
+ re = new RegExp(name + '\=(.*?);' );
+ if (cookie.match(re)) {
+ return RegExp.$1;
+ } else {
+ return '';
+ }
+ },
+ setVar: function(name,value,expire,path) {
+ document.cookie = name + '=' + value;
+ },
+ removeVar: function(name) {
+ var date = new Date(12);
+ document.cookie = name + '=;expires=' + date.toUTCString();
+ }
+};
+
+function deletesearch(id, url) {
+ $('rs' + id).getElementsByTagName('i')[0].className='fa fa-spinner fa-spin fa-lg';
+ url = url + 'js/callbacks/deletesearches.php';
+ var myAjax = new Ajax.Request(url, {
+ method: 'post',
+ parameters: { 'id': id, 'csrftoken': document.getElementById('deletesearchtoken').value },
+ onSuccess:function()
+ {
+ var oNodeToRemove = $('rs' + id);
+ oNodeToRemove.parentNode.removeChild(oNodeToRemove);
+ var table = $('mysearchestable');
+ if(table.rows.length > 0) {
+ table.getElementsByTagName('tr')[table.rows.length-1].style.borderBottom = '0';
+ } else {
+ showstuff('nosearches');
+ }
+ }
+ });
+}
+function savesearch(query, baseurl, savetext, csrftoken) {
+ url = baseurl + 'js/callbacks/savesearches.php';
+ if($('save_search').value != '') {
+ var old_text = $('lblsaveas').firstChild.nodeValue;
+ $('lblsaveas').firstChild.nodeValue = savetext;
+ var myAjax = new Ajax.Request(url, {
+ method: 'post',
+ parameters: query + '&search_name=' + encodeURIComponent($('save_search').value) + '&csrftoken=' + csrftoken,
+ onComplete:function()
+ {
+ $('lblsaveas').firstChild.nodeValue=old_text;
+ var myAjax2 = new Ajax.Updater('mysearches', baseurl + 'js/callbacks/getsearches.php', { method: 'get'});
+ }
+ });
+ }
+}
+function activelink(id) {
+ if($(id).className == 'active') {
+ $(id).className = 'inactive';
+ } else {
+ $(id).className = 'active';
+ }
+}
+var useAltForKeyboardNavigation = false; // Set this to true if you don't want to kill
+ // Firefox's find as you type
+
+function emptyElement(el) {
+ while(el.firstChild) {
+ emptyElement(el.firstChild);
+ var oNodeToRemove = el.firstChild;
+ oNodeToRemove.parentNode.removeChild(oNodeToRemove);
+ }
+}
+function showPreview(textfield, baseurl, field)
+{
+ var preview = $(field);
+ emptyElement(preview);
+
+ var img = document.createElement('i');
+ //img.src = baseurl + 'themes/CleanFS/ajax_load.gif';
+ img.className='fa fa-spinner fa-spin fa-lg'; // fontawesome animated fonticon
+ img.id = 'temp_img';
+ img.alt = 'Loading...';
+ preview.appendChild(img);
+
+ var text = $(textfield).value;
+ text = encodeURIComponent(text);
+ var url = baseurl + 'js/callbacks/getpreview.php';
+ var myAjax = new Ajax.Updater(field, url, {parameters:'text=' + text, method: 'post'});
+
+ if (text == '') {
+ hidestuff(field);
+ } else {
+ showstuff(field);
+ }
+}
+function checkname(value){
+ var re=/^[A-Za-z0-9_\.\-]*$/;
+
+ if (re.test(value)==false)
+ {
+ $('username').style.color ='red';
+ $('buSubmit').style.visibility = 'hidden';
+ // TODO an available translation array
+ // maybe provided by something like js/translations.php?lang=de
+ $('errormessage').innerHTML = 'invalid username';
+ }
+ // Otherwise check if username already exists
+ else
+ {
+ new Ajax.Request('js/callbacks/searchnames.php?name='+value, {onSuccess: function(t){ allow(t.responseText); } });
+ }
+}
+function allow(booler){
+ if(booler.indexOf('false') > -1) {
+ $('username').style.color ='red';
+ $('buSubmit').style.visibility = 'hidden';
+ // text after 'false|'
+ $('errormessage').innerHTML = booler.substring(6,booler.length);
+ }
+ else {
+ $('username').style.color ='green';
+ $('buSubmit').style.visibility = 'visible';
+ $('errormessage').innerHTML = '';
+ }
+}
+function getHistory(task_id, baseurl, field, details)
+{
+ var url = baseurl + 'js/callbacks/gethistory.php?task_id=' + task_id;
+ if (details) {
+ url += '&details=' + details;
+ }
+ var myAjax = new Ajax.Updater(field, url, { method: 'get'});
+}
+
+/********* Permissions popup ***********/
+
+function createClosure(obj, method) {
+ return (function() { obj[method](); });
+}
+
+function Perms(id) {
+ this.div = $(id);
+}
+
+Perms.prototype.timeout = null;
+Perms.prototype.div = null;
+
+Perms.prototype.clearTimeout = function() {
+ if (this.timeout) {
+ clearTimeout(this.timeout);
+ this.timeout = null;
+ }
+}
+
+Perms.prototype.do_later = function(action) {
+ this.clearTimeout();
+ closure = createClosure(this, action);
+ this.timeout = setTimeout(closure, 400);
+}
+
+Perms.prototype.show = function() {
+ this.clearTimeout();
+ this.div.style.display = 'block';
+ this.div.style.visibility = 'visible';
+}
+
+Perms.prototype.hide = function() {
+ this.clearTimeout();
+ this.div.style.display = 'none';
+}
+
+// Replaces the currently selected text with the passed text.
+function replaceText(text, textarea)
+{
+ textarea = document.getElementById( textarea );
+ // Attempt to create a text range (IE).
+ if (typeof(textarea.caretPos) != "undefined" && textarea.createTextRange)
+ {
+ var caretPos = textarea.caretPos;
+
+ caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == ' ' ? text + ' ' : text;
+ caretPos.select();
+ }
+ // Mozilla text range replace.
+ else if (typeof(textarea.selectionStart) != "undefined")
+ {
+ var begin = textarea.value.substr(0, textarea.selectionStart);
+ var end = textarea.value.substr(textarea.selectionEnd);
+ var scrollPos = textarea.scrollTop;
+
+ textarea.value = begin + text + end;
+
+ if (textarea.setSelectionRange)
+ {
+ textarea.focus();
+ textarea.setSelectionRange(begin.length + text.length, begin.length + text.length);
+ }
+ textarea.scrollTop = scrollPos;
+ }
+ else if (document.selection) {
+ textarea.focus();
+ sel=document.selection.createRange();
+ sel.text=text;
+ }
+ // Just put it on the end.
+ else
+ {
+ textarea.value += text;
+ textarea.focus(textarea.value.length - 1);
+ }
+}
+
+
+// Surrounds the selected text with text1 and text2.
+function surroundText(text1, text2, textarea)
+{
+ textarea = document.getElementById( textarea );
+ // Can a text range be created?
+ if (typeof(textarea.caretPos) != "undefined" && textarea.createTextRange)
+ {
+ var caretPos = textarea.caretPos;
+
+ caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == ' ' ? text1 + caretPos.text + text2 + ' ' : text1 + caretPos.text + text2;
+ caretPos.select();
+ }
+ // Mozilla text range wrap.
+ else if (typeof(textarea.selectionStart) != "undefined")
+ {
+ var begin = textarea.value.substr(0, textarea.selectionStart);
+ var selection = textarea.value.substr(textarea.selectionStart, textarea.selectionEnd - textarea.selectionStart);
+ var end = textarea.value.substr(textarea.selectionEnd);
+ var newCursorPos = textarea.selectionStart;
+ var scrollPos = textarea.scrollTop;
+
+ textarea.value = begin + text1 + selection + text2 + end;
+
+ if (textarea.setSelectionRange)
+ {
+ if (selection.length == 0)
+ textarea.setSelectionRange(newCursorPos + text1.length, newCursorPos + text1.length);
+ else
+ textarea.setSelectionRange(newCursorPos, newCursorPos + text1.length + selection.length + text2.length);
+ textarea.focus();
+ }
+ textarea.scrollTop = scrollPos;
+ }
+ else if(document.selection) {
+ textarea.focus();
+ var sampleText = 'TEXT';
+ var currentRange = document.selection.createRange();
+ var selection = currentRange.text;
+ var replaced = true;
+ if(!selection) {
+ replaced=false;
+ selection = sampleText;
+ }
+ if(selection.charAt(selection.length-1)==" "){
+ selection=selection.substring(0,selection.length-1);
+ currentRange.text = text1 + selection + text2 + " ";
+ }
+ else
+ {
+ currentRange.text = text1 + selection + text2;
+ }
+ if(!replaced){
+ // If putting in sample text (i.e. insert) adjust range start and end
+ currentRange.moveStart('character',-text.length-text2.length);
+ currentRange.moveEnd('character',-text2.length);
+ }
+ currentRange.select();
+ }
+ // Just put them on the end, then.
+ else
+ {
+ textarea.value += text1 + text2;
+ textarea.focus(textarea.value.length - 1);
+ }
+}
+
+function stopBubble(e) {
+ if (!e) { var e = window.event; }
+ e.cancelBubble = true;
+ if (e.stopPropagation) { e.stopPropagation(); }
+}
+
+//login box toggling
+login_box_status = false;
+var toggleLoginBox = function(el){
+ //this would turn the box on
+ if(login_box_status == false){
+ el.addClassName('active');
+ showstuff('loginbox');
+ //this would turn the box off
+ } else {
+ el.removeClassName('active');
+ hidestuff('loginbox');
+ }
+ //toggle functionality
+ if(login_box_status == true) login_box_status = false;
+ else login_box_status = true;
+ //return false to stop event bubbling
+ return false;
+}
diff --git a/js/index.js b/js/index.js
new file mode 100644
index 0000000..ae0586b
--- /dev/null
+++ b/js/index.js
@@ -0,0 +1,91 @@
+Event.observe(window,'load',tasklistInit);
+Event.observe(window,'load',searchInit);
+
+function tasklistInit() {
+ Caret.init();
+}
+function searchInit() {
+ if (navigator.appVersion.match(/\bMSIE 6\.0\b/) && $('searchthisproject') && $('reset')) {
+ Event.observe('searchthisproject','click',function() {$('reset').remove();});
+ }
+}
+var Caret = {
+ init: function () {
+ var task = sessionStorage.getItem('current_task') || 'top';
+ if (task == 'bottom' || task == 'top') {
+ var tab = $('tasklist_table');
+ var rows = tab ? tab.getElementsByTagName('tbody')[0].getElementsByTagName('tr') : [];
+ Caret.currentRow = (task == 'top' || rows.length == 0) ? rows[0] : rows[rows.length-1];
+ }
+ else {
+ Caret.currentRow = $('task'+task);
+ }
+ if (Caret.currentRow) {
+ Element.addClassName(Caret.currentRow,'current_row');
+ Event.observe(document,'keydown',Caret.keypress);
+ }
+ },
+ keypress: function (e) {
+ var src = Event.element(e);
+ if (/input|select|textarea/.test(src.nodeName.toLowerCase())) {
+ // don't do anything if key is pressed in input, select or textarea
+ return;
+ }
+ if ((useAltForKeyboardNavigation && !e.altKey) ||
+ (!useAltForKeyboardNavigation && e.altKey) ||
+ e.ctrlKey || e.shiftKey) {
+ return;
+ }
+ switch (e.keyCode) {
+ case 74: // user pressed "j" move down
+ Element.removeClassName(Caret.currentRow,'current_row');
+ Caret.nextRow();
+ Element.addClassName(Caret.currentRow,'current_row');
+ Event.stop(e);
+ break;
+ case 75: // user pressed "k" move up
+ Element.removeClassName(Caret.currentRow,'current_row');
+ Caret.previousRow();
+ Element.addClassName(Caret.currentRow,'current_row');
+ Event.stop(e);
+ break;
+ case 79: // user pressed "o" open task
+ window.location = Caret.currentRow.getElementsByTagName('a')[0].href; // FIXME ambiguous in future: if first a is not a link to the task, e.g. a column with link to task opener
+ Event.stop(e);
+ break;
+ }
+ },
+ nextRow: function () {
+ var row = Caret.currentRow;
+ while ((row = row.nextSibling)) {
+ if ('tr' == row.nodeName.toLowerCase()) {
+ Caret.currentRow = row;
+ return;
+ }
+ }
+ // we've reached the bottom of the list
+ if ($('next')) {
+ //Cookie.setVar('current_task','top'); // doesn't work well on multitab multiproject usage
+ sessionStorage.setItem('current_task','top');
+ window.location = $('next').href;
+ return;
+ }
+ },
+ previousRow: function () {
+ var row = Caret.currentRow;
+ while ((row = row.previousSibling)) {
+ if ('tr' == row.nodeName.toLowerCase()) {
+ Caret.currentRow = row;
+ return;
+ }
+ }
+ // we've reached the top of the list
+ if ($('previous')) {
+ //Cookie.setVar('current_task','bottom'); // doesn't work well on multitab multiproject usage
+ sessionStorage.setItem('current_task','bottom');
+ window.location = $('previous').href;
+ return;
+ }
+
+ }
+};
diff --git a/js/jit/jit.js b/js/jit/jit.js
new file mode 100644
index 0000000..d417d79
--- /dev/null
+++ b/js/jit/jit.js
@@ -0,0 +1,16841 @@
+/*
+ Copyright (c) 2010, Nicolas Garcia Belmonte
+ 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.
+ > * Neither the name of the organization nor the
+ > names of its contributors may be used to endorse or promote products
+ > derived from this software without specific prior written permission.
+ >
+ > THIS SOFTWARE IS PROVIDED BY NICOLAS GARCIA BELMONTE ``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 NICOLAS GARCIA BELMONTE 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.
+ */
+ (function () {
+
+/*
+ File: Core.js
+
+ */
+
+/*
+ Object: $jit
+
+ Defines the namespace for all library Classes and Objects.
+ This variable is the *only* global variable defined in the Toolkit.
+ There are also other interesting properties attached to this variable described below.
+ */
+window.$jit = function(w) {
+ w = w || window;
+ for(var k in $jit) {
+ if($jit[k].$extend) {
+ w[k] = $jit[k];
+ }
+ }
+};
+
+$jit.version = '2.0.0b';
+/*
+ Object: $jit.id
+
+ Works just like *document.getElementById*
+
+ Example:
+ (start code js)
+ var element = $jit.id('elementId');
+ (end code)
+
+*/
+
+/*
+ Object: $jit.util
+
+ Contains utility functions.
+
+ Some of the utility functions and the Class system were based in the MooTools Framework
+ <http://mootools.net>. Copyright (c) 2006-2010 Valerio Proietti, <http://mad4milk.net/>.
+ MIT license <http://mootools.net/license.txt>.
+
+ These methods are generally also implemented in DOM manipulation frameworks like JQuery, MooTools and Prototype.
+ I'd suggest you to use the functions from those libraries instead of using these, since their functions
+ are widely used and tested in many different platforms/browsers. Use these functions only if you have to.
+
+ */
+var $ = function(d) {
+ return document.getElementById(d);
+};
+
+$.empty = function() {
+};
+
+/*
+ Method: extend
+
+ Augment an object by appending another object's properties.
+
+ Parameters:
+
+ original - (object) The object to be extended.
+ extended - (object) An object which properties are going to be appended to the original object.
+
+ Example:
+ (start code js)
+ $jit.util.extend({ 'a': 1, 'b': 2 }, { 'b': 3, 'c': 4 }); //{ 'a':1, 'b': 3, 'c': 4 }
+ (end code)
+*/
+$.extend = function(original, extended) {
+ for ( var key in (extended || {}))
+ original[key] = extended[key];
+ return original;
+};
+
+$.lambda = function(value) {
+ return (typeof value == 'function') ? value : function() {
+ return value;
+ };
+};
+
+$.time = Date.now || function() {
+ return +new Date;
+};
+
+/*
+ Method: splat
+
+ Returns an array wrapping *obj* if *obj* is not an array. Returns *obj* otherwise.
+
+ Parameters:
+
+ obj - (mixed) The object to be wrapped in an array.
+
+ Example:
+ (start code js)
+ $jit.util.splat(3); //[3]
+ $jit.util.splat([3]); //[3]
+ (end code)
+*/
+$.splat = function(obj) {
+ var type = $.type(obj);
+ return type ? ((type != 'array') ? [ obj ] : obj) : [];
+};
+
+$.type = function(elem) {
+ var type = $.type.s.call(elem).match(/^\[object\s(.*)\]$/)[1].toLowerCase();
+ if(type != 'object') return type;
+ if(elem && elem.$$family) return elem.$$family;
+ return (elem && elem.nodeName && elem.nodeType == 1)? 'element' : type;
+};
+$.type.s = Object.prototype.toString;
+
+/*
+ Method: each
+
+ Iterates through an iterable applying *f*.
+
+ Parameters:
+
+ iterable - (array) The original array.
+ fn - (function) The function to apply to the array elements.
+
+ Example:
+ (start code js)
+ $jit.util.each([3, 4, 5], function(n) { alert('number ' + n); });
+ (end code)
+*/
+$.each = function(iterable, fn) {
+ var type = $.type(iterable);
+ if (type == 'object') {
+ for ( var key in iterable)
+ fn(iterable[key], key);
+ } else {
+ for ( var i = 0, l = iterable.length; i < l; i++)
+ fn(iterable[i], i);
+ }
+};
+
+$.indexOf = function(array, item) {
+ if(Array.indexOf) return array.indexOf(item);
+ for(var i=0,l=array.length; i<l; i++) {
+ if(array[i] === item) return i;
+ }
+ return -1;
+};
+
+/*
+ Method: map
+
+ Maps or collects an array by applying *f*.
+
+ Parameters:
+
+ array - (array) The original array.
+ f - (function) The function to apply to the array elements.
+
+ Example:
+ (start code js)
+ $jit.util.map([3, 4, 5], function(n) { return n*n; }); //[9, 16, 25]
+ (end code)
+*/
+$.map = function(array, f) {
+ var ans = [];
+ $.each(array, function(elem, i) {
+ ans.push(f(elem, i));
+ });
+ return ans;
+};
+
+/*
+ Method: reduce
+
+ Iteratively applies the binary function *f* storing the result in an accumulator.
+
+ Parameters:
+
+ array - (array) The original array.
+ f - (function) The function to apply to the array elements.
+ opt - (optional|mixed) The starting value for the acumulator.
+
+ Example:
+ (start code js)
+ $jit.util.reduce([3, 4, 5], function(x, y) { return x + y; }, 0); //12
+ (end code)
+*/
+$.reduce = function(array, f, opt) {
+ var l = array.length;
+ if(l==0) return opt;
+ var acum = arguments.length == 3? opt : array[--l];
+ while(l--) {
+ acum = f(acum, array[l]);
+ }
+ return acum;
+};
+
+/*
+ Method: merge
+
+ Merges n-objects and their sub-objects creating a new, fresh object.
+
+ Parameters:
+
+ An arbitrary number of objects.
+
+ Example:
+ (start code js)
+ $jit.util.merge({ 'a': 1, 'b': 2 }, { 'b': 3, 'c': 4 }); //{ 'a':1, 'b': 3, 'c': 4 }
+ (end code)
+*/
+$.merge = function() {
+ var mix = {};
+ for ( var i = 0, l = arguments.length; i < l; i++) {
+ var object = arguments[i];
+ if ($.type(object) != 'object')
+ continue;
+ for ( var key in object) {
+ var op = object[key], mp = mix[key];
+ mix[key] = (mp && $.type(op) == 'object' && $.type(mp) == 'object') ? $
+ .merge(mp, op) : $.unlink(op);
+ }
+ }
+ return mix;
+};
+
+$.unlink = function(object) {
+ var unlinked;
+ switch ($.type(object)) {
+ case 'object':
+ unlinked = {};
+ for ( var p in object)
+ unlinked[p] = $.unlink(object[p]);
+ break;
+ case 'array':
+ unlinked = [];
+ for ( var i = 0, l = object.length; i < l; i++)
+ unlinked[i] = $.unlink(object[i]);
+ break;
+ default:
+ return object;
+ }
+ return unlinked;
+};
+
+$.zip = function() {
+ if(arguments.length === 0) return [];
+ for(var j=0, ans=[], l=arguments.length, ml=arguments[0].length; j<ml; j++) {
+ for(var i=0, row=[]; i<l; i++) {
+ row.push(arguments[i][j]);
+ }
+ ans.push(row);
+ }
+ return ans;
+};
+
+/*
+ Method: rgbToHex
+
+ Converts an RGB array into a Hex string.
+
+ Parameters:
+
+ srcArray - (array) An array with R, G and B values
+
+ Example:
+ (start code js)
+ $jit.util.rgbToHex([255, 255, 255]); //'#ffffff'
+ (end code)
+*/
+$.rgbToHex = function(srcArray, array) {
+ if (srcArray.length < 3)
+ return null;
+ if (srcArray.length == 4 && srcArray[3] == 0 && !array)
+ return 'transparent';
+ var hex = [];
+ for ( var i = 0; i < 3; i++) {
+ var bit = (srcArray[i] - 0).toString(16);
+ hex.push(bit.length == 1 ? '0' + bit : bit);
+ }
+ return array ? hex : '#' + hex.join('');
+};
+
+/*
+ Method: hexToRgb
+
+ Converts an Hex color string into an RGB array.
+
+ Parameters:
+
+ hex - (string) A color hex string.
+
+ Example:
+ (start code js)
+ $jit.util.hexToRgb('#fff'); //[255, 255, 255]
+ (end code)
+*/
+$.hexToRgb = function(hex) {
+ if (hex.length != 7) {
+ hex = hex.match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/);
+ hex.shift();
+ if (hex.length != 3)
+ return null;
+ var rgb = [];
+ for ( var i = 0; i < 3; i++) {
+ var value = hex[i];
+ if (value.length == 1)
+ value += value;
+ rgb.push(parseInt(value, 16));
+ }
+ return rgb;
+ } else {
+ hex = parseInt(hex.slice(1), 16);
+ return [ hex >> 16, hex >> 8 & 0xff, hex & 0xff ];
+ }
+};
+
+$.destroy = function(elem) {
+ $.clean(elem);
+ if (elem.parentNode)
+ elem.parentNode.removeChild(elem);
+ if (elem.clearAttributes)
+ elem.clearAttributes();
+};
+
+$.clean = function(elem) {
+ for (var ch = elem.childNodes, i = 0, l = ch.length; i < l; i++) {
+ $.destroy(ch[i]);
+ }
+};
+
+/*
+ Method: addEvent
+
+ Cross-browser add event listener.
+
+ Parameters:
+
+ obj - (obj) The Element to attach the listener to.
+ type - (string) The listener type. For example 'click', or 'mousemove'.
+ fn - (function) The callback function to be used when the event is fired.
+
+ Example:
+ (start code js)
+ $jit.util.addEvent(elem, 'click', function(){ alert('hello'); });
+ (end code)
+*/
+$.addEvent = function(obj, type, fn) {
+ if (obj.addEventListener)
+ obj.addEventListener(type, fn, false);
+ else
+ obj.attachEvent('on' + type, fn);
+};
+
+$.addEvents = function(obj, typeObj) {
+ for(var type in typeObj) {
+ $.addEvent(obj, type, typeObj[type]);
+ }
+};
+
+$.hasClass = function(obj, klass) {
+ return (' ' + obj.className + ' ').indexOf(' ' + klass + ' ') > -1;
+};
+
+$.addClass = function(obj, klass) {
+ if (!$.hasClass(obj, klass))
+ obj.className = (obj.className + " " + klass);
+};
+
+$.removeClass = function(obj, klass) {
+ obj.className = obj.className.replace(new RegExp(
+ '(^|\\s)' + klass + '(?:\\s|$)'), '$1');
+};
+
+$.getPos = function(elem) {
+ var offset = getOffsets(elem);
+ var scroll = getScrolls(elem);
+ return {
+ x: offset.x - scroll.x,
+ y: offset.y - scroll.y
+ };
+
+ function getOffsets(elem) {
+ var position = {
+ x: 0,
+ y: 0
+ };
+ while (elem && !isBody(elem)) {
+ position.x += elem.offsetLeft;
+ position.y += elem.offsetTop;
+ elem = elem.offsetParent;
+ }
+ return position;
+ }
+
+ function getScrolls(elem) {
+ var position = {
+ x: 0,
+ y: 0
+ };
+ while (elem && !isBody(elem)) {
+ position.x += elem.scrollLeft;
+ position.y += elem.scrollTop;
+ elem = elem.parentNode;
+ }
+ return position;
+ }
+
+ function isBody(element) {
+ return (/^(?:body|html)$/i).test(element.tagName);
+ }
+};
+
+$.event = {
+ get: function(e, win) {
+ win = win || window;
+ return e || win.event;
+ },
+ getWheel: function(e) {
+ return e.wheelDelta? e.wheelDelta / 120 : -(e.detail || 0) / 3;
+ },
+ isRightClick: function(e) {
+ return (e.which == 3 || e.button == 2);
+ },
+ getPos: function(e, win) {
+ // get mouse position
+ win = win || window;
+ e = e || win.event;
+ var doc = win.document;
+ doc = doc.documentElement || doc.body;
+ //TODO(nico): make touch event handling better
+ if(e.touches && e.touches.length) {
+ e = e.touches[0];
+ }
+ var page = {
+ x: e.pageX || (e.clientX + doc.scrollLeft),
+ y: e.pageY || (e.clientY + doc.scrollTop)
+ };
+ return page;
+ },
+ stop: function(e) {
+ if (e.stopPropagation) e.stopPropagation();
+ e.cancelBubble = true;
+ if (e.preventDefault) e.preventDefault();
+ else e.returnValue = false;
+ }
+};
+
+$jit.util = $jit.id = $;
+
+var Class = function(properties) {
+ properties = properties || {};
+ var klass = function() {
+ for ( var key in this) {
+ if (typeof this[key] != 'function')
+ this[key] = $.unlink(this[key]);
+ }
+ this.constructor = klass;
+ if (Class.prototyping)
+ return this;
+ var instance = this.initialize ? this.initialize.apply(this, arguments)
+ : this;
+ //typize
+ this.$$family = 'class';
+ return instance;
+ };
+
+ for ( var mutator in Class.Mutators) {
+ if (!properties[mutator])
+ continue;
+ properties = Class.Mutators[mutator](properties, properties[mutator]);
+ delete properties[mutator];
+ }
+
+ $.extend(klass, this);
+ klass.constructor = Class;
+ klass.prototype = properties;
+ return klass;
+};
+
+Class.Mutators = {
+
+ Implements: function(self, klasses) {
+ $.each($.splat(klasses), function(klass) {
+ Class.prototyping = klass;
+ var instance = (typeof klass == 'function') ? new klass : klass;
+ for ( var prop in instance) {
+ if (!(prop in self)) {
+ self[prop] = instance[prop];
+ }
+ }
+ delete Class.prototyping;
+ });
+ return self;
+ }
+
+};
+
+$.extend(Class, {
+
+ inherit: function(object, properties) {
+ for ( var key in properties) {
+ var override = properties[key];
+ var previous = object[key];
+ var type = $.type(override);
+ if (previous && type == 'function') {
+ if (override != previous) {
+ Class.override(object, key, override);
+ }
+ } else if (type == 'object') {
+ object[key] = $.merge(previous, override);
+ } else {
+ object[key] = override;
+ }
+ }
+ return object;
+ },
+
+ override: function(object, name, method) {
+ var parent = Class.prototyping;
+ if (parent && object[name] != parent[name])
+ parent = null;
+ var override = function() {
+ var previous = this.parent;
+ this.parent = parent ? parent[name] : object[name];
+ var value = method.apply(this, arguments);
+ this.parent = previous;
+ return value;
+ };
+ object[name] = override;
+ }
+
+});
+
+Class.prototype.implement = function() {
+ var proto = this.prototype;
+ $.each(Array.prototype.slice.call(arguments || []), function(properties) {
+ Class.inherit(proto, properties);
+ });
+ return this;
+};
+
+$jit.Class = Class;
+
+/*
+ Object: $jit.json
+
+ Provides JSON utility functions.
+
+ Most of these functions are JSON-tree traversal and manipulation functions.
+*/
+$jit.json = {
+ /*
+ Method: prune
+
+ Clears all tree nodes having depth greater than maxLevel.
+
+ Parameters:
+
+ tree - (object) A JSON tree object. For more information please see <Loader.loadJSON>.
+ maxLevel - (number) An integer specifying the maximum level allowed for this tree. All nodes having depth greater than max level will be deleted.
+
+ */
+ prune: function(tree, maxLevel) {
+ this.each(tree, function(elem, i) {
+ if (i == maxLevel && elem.children) {
+ delete elem.children;
+ elem.children = [];
+ }
+ });
+ },
+ /*
+ Method: getParent
+
+ Returns the parent node of the node having _id_ as id.
+
+ Parameters:
+
+ tree - (object) A JSON tree object. See also <Loader.loadJSON>.
+ id - (string) The _id_ of the child node whose parent will be returned.
+
+ Returns:
+
+ A tree JSON node if any, or false otherwise.
+
+ */
+ getParent: function(tree, id) {
+ if (tree.id == id)
+ return false;
+ var ch = tree.children;
+ if (ch && ch.length > 0) {
+ for ( var i = 0; i < ch.length; i++) {
+ if (ch[i].id == id)
+ return tree;
+ else {
+ var ans = this.getParent(ch[i], id);
+ if (ans)
+ return ans;
+ }
+ }
+ }
+ return false;
+ },
+ /*
+ Method: getSubtree
+
+ Returns the subtree that matches the given id.
+
+ Parameters:
+
+ tree - (object) A JSON tree object. See also <Loader.loadJSON>.
+ id - (string) A node *unique* identifier.
+
+ Returns:
+
+ A subtree having a root node matching the given id. Returns null if no subtree matching the id is found.
+
+ */
+ getSubtree: function(tree, id) {
+ if (tree.id == id)
+ return tree;
+ for ( var i = 0, ch = tree.children; i < ch.length; i++) {
+ var t = this.getSubtree(ch[i], id);
+ if (t != null)
+ return t;
+ }
+ return null;
+ },
+ /*
+ Method: eachLevel
+
+ Iterates on tree nodes with relative depth less or equal than a specified level.
+
+ Parameters:
+
+ tree - (object) A JSON tree or subtree. See also <Loader.loadJSON>.
+ initLevel - (number) An integer specifying the initial relative level. Usually zero.
+ toLevel - (number) An integer specifying a top level. This method will iterate only through nodes with depth less than or equal this number.
+ action - (function) A function that receives a node and an integer specifying the actual level of the node.
+
+ Example:
+ (start code js)
+ $jit.json.eachLevel(tree, 0, 3, function(node, depth) {
+ alert(node.name + ' ' + depth);
+ });
+ (end code)
+ */
+ eachLevel: function(tree, initLevel, toLevel, action) {
+ if (initLevel <= toLevel) {
+ action(tree, initLevel);
+ if(!tree.children) return;
+ for ( var i = 0, ch = tree.children; i < ch.length; i++) {
+ this.eachLevel(ch[i], initLevel + 1, toLevel, action);
+ }
+ }
+ },
+ /*
+ Method: each
+
+ A JSON tree iterator.
+
+ Parameters:
+
+ tree - (object) A JSON tree or subtree. See also <Loader.loadJSON>.
+ action - (function) A function that receives a node.
+
+ Example:
+ (start code js)
+ $jit.json.each(tree, function(node) {
+ alert(node.name);
+ });
+ (end code)
+
+ */
+ each: function(tree, action) {
+ this.eachLevel(tree, 0, Number.MAX_VALUE, action);
+ }
+};
+
+
+/*
+ An object containing multiple type of transformations.
+*/
+
+$jit.Trans = {
+ $extend: true,
+
+ linear: function(p){
+ return p;
+ }
+};
+
+var Trans = $jit.Trans;
+
+(function(){
+
+ var makeTrans = function(transition, params){
+ params = $.splat(params);
+ return $.extend(transition, {
+ easeIn: function(pos){
+ return transition(pos, params);
+ },
+ easeOut: function(pos){
+ return 1 - transition(1 - pos, params);
+ },
+ easeInOut: function(pos){
+ return (pos <= 0.5)? transition(2 * pos, params) / 2 : (2 - transition(
+ 2 * (1 - pos), params)) / 2;
+ }
+ });
+ };
+
+ var transitions = {
+
+ Pow: function(p, x){
+ return Math.pow(p, x[0] || 6);
+ },
+
+ Expo: function(p){
+ return Math.pow(2, 8 * (p - 1));
+ },
+
+ Circ: function(p){
+ return 1 - Math.sin(Math.acos(p));
+ },
+
+ Sine: function(p){
+ return 1 - Math.sin((1 - p) * Math.PI / 2);
+ },
+
+ Back: function(p, x){
+ x = x[0] || 1.618;
+ return Math.pow(p, 2) * ((x + 1) * p - x);
+ },
+
+ Bounce: function(p){
+ var value;
+ for ( var a = 0, b = 1; 1; a += b, b /= 2) {
+ if (p >= (7 - 4 * a) / 11) {
+ value = b * b - Math.pow((11 - 6 * a - 11 * p) / 4, 2);
+ break;
+ }
+ }
+ return value;
+ },
+
+ Elastic: function(p, x){
+ return Math.pow(2, 10 * --p)
+ * Math.cos(20 * p * Math.PI * (x[0] || 1) / 3);
+ }
+
+ };
+
+ $.each(transitions, function(val, key){
+ Trans[key] = makeTrans(val);
+ });
+
+ $.each( [
+ 'Quad', 'Cubic', 'Quart', 'Quint'
+ ], function(elem, i){
+ Trans[elem] = makeTrans(function(p){
+ return Math.pow(p, [
+ i + 2
+ ]);
+ });
+ });
+
+})();
+
+/*
+ A Class that can perform animations for generic objects.
+
+ If you are looking for animation transitions please take a look at the <Trans> object.
+
+ Used by:
+
+ <Graph.Plot>
+
+ Based on:
+
+ The Animation class is based in the MooTools Framework <http://mootools.net>. Copyright (c) 2006-2009 Valerio Proietti, <http://mad4milk.net/>. MIT license <http://mootools.net/license.txt>.
+
+*/
+
+var Animation = new Class( {
+
+ initialize: function(options){
+ this.setOptions(options);
+ },
+
+ setOptions: function(options){
+ var opt = {
+ duration: 2500,
+ fps: 40,
+ transition: Trans.Quart.easeInOut,
+ compute: $.empty,
+ complete: $.empty,
+ link: 'ignore'
+ };
+ this.opt = $.merge(opt, options || {});
+ return this;
+ },
+
+ step: function(){
+ var time = $.time(), opt = this.opt;
+ if (time < this.time + opt.duration) {
+ var delta = opt.transition((time - this.time) / opt.duration);
+ opt.compute(delta);
+ } else {
+ this.timer = clearInterval(this.timer);
+ opt.compute(1);
+ opt.complete();
+ }
+ },
+
+ start: function(){
+ if (!this.check())
+ return this;
+ this.time = 0;
+ this.startTimer();
+ return this;
+ },
+
+ startTimer: function(){
+ var that = this, fps = this.opt.fps;
+ if (this.timer)
+ return false;
+ this.time = $.time() - this.time;
+ this.timer = setInterval((function(){
+ that.step();
+ }), Math.round(1000 / fps));
+ return true;
+ },
+
+ pause: function(){
+ this.stopTimer();
+ return this;
+ },
+
+ resume: function(){
+ this.startTimer();
+ return this;
+ },
+
+ stopTimer: function(){
+ if (!this.timer)
+ return false;
+ this.time = $.time() - this.time;
+ this.timer = clearInterval(this.timer);
+ return true;
+ },
+
+ check: function(){
+ if (!this.timer)
+ return true;
+ if (this.opt.link == 'cancel') {
+ this.stopTimer();
+ return true;
+ }
+ return false;
+ }
+});
+
+
+var Options = function() {
+ var args = arguments;
+ for(var i=0, l=args.length, ans={}; i<l; i++) {
+ var opt = Options[args[i]];
+ if(opt.$extend) {
+ $.extend(ans, opt);
+ } else {
+ ans[args[i]] = opt;
+ }
+ }
+ return ans;
+};
+
+/*
+ * File: Options.AreaChart.js
+ *
+*/
+
+/*
+ Object: Options.AreaChart
+
+ <AreaChart> options.
+ Other options included in the AreaChart are <Options.Canvas>, <Options.Label>, <Options.Margin>, <Options.Tips> and <Options.Events>.
+
+ Syntax:
+
+ (start code js)
+
+ Options.AreaChart = {
+ animate: true,
+ labelOffset: 3,
+ type: 'stacked',
+ selectOnHover: true,
+ showAggregates: true,
+ showLabels: true,
+ filterOnClick: false,
+ restoreOnRightClick: false
+ };
+
+ (end code)
+
+ Example:
+
+ (start code js)
+
+ var areaChart = new $jit.AreaChart({
+ animate: true,
+ type: 'stacked:gradient',
+ selectOnHover: true,
+ filterOnClick: true,
+ restoreOnRightClick: true
+ });
+
+ (end code)
+
+ Parameters:
+
+ animate - (boolean) Default's *true*. Whether to add animated transitions when filtering/restoring stacks.
+ labelOffset - (number) Default's *3*. Adds margin between the label and the default place where it should be drawn.
+ type - (string) Default's *'stacked'*. Stack style. Posible values are 'stacked', 'stacked:gradient' to add gradients.
+ selectOnHover - (boolean) Default's *true*. If true, it will add a mark to the hovered stack.
+ showAggregates - (boolean) Default's *true*. Display the sum of the values of the different stacks.
+ showLabels - (boolean) Default's *true*. Display the name of the slots.
+ filterOnClick - (boolean) Default's *true*. Select the clicked stack by hiding all other stacks.
+ restoreOnRightClick - (boolean) Default's *true*. Show all stacks by right clicking.
+
+*/
+
+Options.AreaChart = {
+ $extend: true,
+
+ animate: true,
+ labelOffset: 3, // label offset
+ type: 'stacked', // gradient
+ Tips: {
+ enable: false,
+ onShow: $.empty,
+ onHide: $.empty
+ },
+ Events: {
+ enable: false,
+ onClick: $.empty
+ },
+ selectOnHover: true,
+ showAggregates: true,
+ showLabels: true,
+ filterOnClick: false,
+ restoreOnRightClick: false
+};
+
+/*
+ * File: Options.Margin.js
+ *
+*/
+
+/*
+ Object: Options.Margin
+
+ Canvas drawing margins.
+
+ Syntax:
+
+ (start code js)
+
+ Options.Margin = {
+ top: 0,
+ left: 0,
+ right: 0,
+ bottom: 0
+ };
+
+ (end code)
+
+ Example:
+
+ (start code js)
+
+ var viz = new $jit.Viz({
+ Margin: {
+ right: 10,
+ bottom: 20
+ }
+ });
+
+ (end code)
+
+ Parameters:
+
+ top - (number) Default's *0*. Top margin.
+ left - (number) Default's *0*. Left margin.
+ right - (number) Default's *0*. Right margin.
+ bottom - (number) Default's *0*. Bottom margin.
+
+*/
+
+Options.Margin = {
+ $extend: false,
+
+ top: 0,
+ left: 0,
+ right: 0,
+ bottom: 0
+};
+
+/*
+ * File: Options.Canvas.js
+ *
+*/
+
+/*
+ Object: Options.Canvas
+
+ These are Canvas general options, like where to append it in the DOM, its dimensions, background,
+ and other more advanced options.
+
+ Syntax:
+
+ (start code js)
+
+ Options.Canvas = {
+ injectInto: 'id',
+ width: false,
+ height: false,
+ useCanvas: false,
+ withLabels: true,
+ background: false
+ };
+ (end code)
+
+ Example:
+
+ (start code js)
+ var viz = new $jit.Viz({
+ injectInto: 'someContainerId',
+ width: 500,
+ height: 700
+ });
+ (end code)
+
+ Parameters:
+
+ injectInto - *required* (string|element) The id of the DOM container for the visualization. It can also be an Element provided that it has an id.
+ width - (number) Default's to the *container's offsetWidth*. The width of the canvas.
+ height - (number) Default's to the *container's offsetHeight*. The height of the canvas.
+ useCanvas - (boolean|object) Default's *false*. You can pass another <Canvas> instance to be used by the visualization.
+ withLabels - (boolean) Default's *true*. Whether to use a label container for the visualization.
+ background - (boolean|object) Default's *false*. An object containing information about the rendering of a background canvas.
+*/
+
+Options.Canvas = {
+ $extend: true,
+
+ injectInto: 'id',
+ width: false,
+ height: false,
+ useCanvas: false,
+ withLabels: true,
+ background: false
+};
+
+/*
+ * File: Options.Tree.js
+ *
+*/
+
+/*
+ Object: Options.Tree
+
+ Options related to (strict) Tree layout algorithms. These options are used by the <ST> visualization.
+
+ Syntax:
+
+ (start code js)
+ Options.Tree = {
+ orientation: "left",
+ subtreeOffset: 8,
+ siblingOffset: 5,
+ indent:10,
+ multitree: false,
+ align:"center"
+ };
+ (end code)
+
+ Example:
+
+ (start code js)
+ var st = new $jit.ST({
+ orientation: 'left',
+ subtreeOffset: 1,
+ siblingOFfset: 5,
+ multitree: true
+ });
+ (end code)
+
+ Parameters:
+
+ subtreeOffset - (number) Default's 8. Separation offset between subtrees.
+ siblingOffset - (number) Default's 5. Separation offset between siblings.
+ orientation - (string) Default's 'left'. Tree orientation layout. Possible values are 'left', 'top', 'right', 'bottom'.
+ align - (string) Default's *center*. Whether the tree alignment is 'left', 'center' or 'right'.
+ indent - (number) Default's 10. Used when *align* is left or right and shows an indentation between parent and children.
+ multitree - (boolean) Default's *false*. Used with the node $orn data property for creating multitrees.
+
+*/
+Options.Tree = {
+ $extend: true,
+
+ orientation: "left",
+ subtreeOffset: 8,
+ siblingOffset: 5,
+ indent:10,
+ multitree: false,
+ align:"center"
+};
+
+
+/*
+ * File: Options.Node.js
+ *
+*/
+
+/*
+ Object: Options.Node
+
+ Provides Node rendering options for Tree and Graph based visualizations.
+
+ Syntax:
+
+ (start code js)
+ Options.Node = {
+ overridable: false,
+ type: 'circle',
+ color: '#ccb',
+ alpha: 1,
+ dim: 3,
+ height: 20,
+ width: 90,
+ autoHeight: false,
+ autoWidth: false,
+ lineWidth: 1,
+ transform: true,
+ align: "center",
+ angularWidth:1,
+ span:1,
+ CanvasStyles: {}
+ };
+ (end code)
+
+ Example:
+
+ (start code js)
+ var viz = new $jit.Viz({
+ Node: {
+ overridable: true,
+ width: 30,
+ autoHeight: true,
+ type: 'rectangle'
+ }
+ });
+ (end code)
+
+ Parameters:
+
+ overridable - (boolean) Default's *false*. Determine whether or not general node properties can be overridden by a particular <Graph.Node>.
+ type - (string) Default's *circle*. Node's shape. Node built-in types include 'circle', 'rectangle', 'square', 'ellipse', 'triangle', 'star'. The default Node type might vary in each visualization. You can also implement (non built-in) custom Node types into your visualizations.
+ color - (string) Default's *#ccb*. Node color.
+ alpha - (number) Default's *1*. The Node's alpha value. *1* is for full opacity.
+ dim - (number) Default's *3*. An extra parameter used by other node shapes such as circle or square, to determine the shape's diameter.
+ height - (number) Default's *20*. Used by 'rectangle' and 'ellipse' node types. The height of the node shape.
+ width - (number) Default's *90*. Used by 'rectangle' and 'ellipse' node types. The width of the node shape.
+ autoHeight - (boolean) Default's *false*. Whether to set an auto height for the node depending on the content of the Node's label.
+ autoWidth - (boolean) Default's *false*. Whether to set an auto width for the node depending on the content of the Node's label.
+ lineWidth - (number) Default's *1*. Used only by some Node shapes. The line width of the strokes of a node.
+ transform - (boolean) Default's *true*. Only used by the <Hypertree> visualization. Whether to scale the nodes according to the moebius transformation.
+ align - (string) Default's *center*. Possible values are 'center', 'left' or 'right'. Used only by the <ST> visualization, these parameters are used for aligning nodes when some of they dimensions vary.
+ angularWidth - (number) Default's *1*. Used in radial layouts (like <RGraph> or <Sunburst> visualizations). The amount of relative 'space' set for a node.
+ span - (number) Default's *1*. Used in radial layouts (like <RGraph> or <Sunburst> visualizations). The angle span amount set for a node.
+ CanvasStyles - (object) Default's an empty object (i.e. {}). Attach any other canvas specific property that you'd set to the canvas context before plotting a Node.
+
+*/
+Options.Node = {
+ $extend: false,
+
+ overridable: false,
+ type: 'circle',
+ color: '#ccb',
+ alpha: 1,
+ dim: 3,
+ height: 20,
+ width: 90,
+ autoHeight: false,
+ autoWidth: false,
+ lineWidth: 1,
+ transform: true,
+ align: "center",
+ angularWidth:1,
+ span:1,
+ //Raw canvas styles to be
+ //applied to the context instance
+ //before plotting a node
+ CanvasStyles: {}
+};
+
+
+/*
+ * File: Options.Edge.js
+ *
+*/
+
+/*
+ Object: Options.Edge
+
+ Provides Edge rendering options for Tree and Graph based visualizations.
+
+ Syntax:
+
+ (start code js)
+ Options.Edge = {
+ overridable: false,
+ type: 'line',
+ color: '#ccb',
+ lineWidth: 1,
+ dim:15,
+ alpha: 1,
+ CanvasStyles: {}
+ };
+ (end code)
+
+ Example:
+
+ (start code js)
+ var viz = new $jit.Viz({
+ Edge: {
+ overridable: true,
+ type: 'line',
+ color: '#fff',
+ CanvasStyles: {
+ shadowColor: '#ccc',
+ shadowBlur: 10
+ }
+ }
+ });
+ (end code)
+
+ Parameters:
+
+ overridable - (boolean) Default's *false*. Determine whether or not general edges properties can be overridden by a particular <Graph.Adjacence>.
+ type - (string) Default's 'line'. Edge styles include 'line', 'hyperline', 'arrow'. The default Edge type might vary in each visualization. You can also implement custom Edge types.
+ color - (string) Default's '#ccb'. Edge color.
+ lineWidth - (number) Default's *1*. Line/Edge width.
+ alpha - (number) Default's *1*. The Edge's alpha value. *1* is for full opacity.
+ dim - (number) Default's *15*. An extra parameter used by other complex shapes such as quadratic, bezier or arrow, to determine the shape's diameter.
+ epsilon - (number) Default's *7*. Only used when using *enableForEdges* in <Options.Events>. This dimension is used to create an area for the line where the contains method for the edge returns *true*.
+ CanvasStyles - (object) Default's an empty object (i.e. {}). Attach any other canvas specific property that you'd set to the canvas context before plotting an Edge.
+
+ See also:
+
+ If you want to know more about how to customize Node/Edge data per element, in the JSON or programmatically, take a look at this article.
+*/
+Options.Edge = {
+ $extend: false,
+
+ overridable: false,
+ type: 'line',
+ color: '#ccb',
+ lineWidth: 1,
+ dim:15,
+ alpha: 1,
+ epsilon: 7,
+
+ //Raw canvas styles to be
+ //applied to the context instance
+ //before plotting an edge
+ CanvasStyles: {}
+};
+
+
+/*
+ * File: Options.Fx.js
+ *
+*/
+
+/*
+ Object: Options.Fx
+
+ Provides animation options like duration of the animations, frames per second and animation transitions.
+
+ Syntax:
+
+ (start code js)
+ Options.Fx = {
+ fps:40,
+ duration: 2500,
+ transition: $jit.Trans.Quart.easeInOut,
+ clearCanvas: true
+ };
+ (end code)
+
+ Example:
+
+ (start code js)
+ var viz = new $jit.Viz({
+ duration: 1000,
+ fps: 35,
+ transition: $jit.Trans.linear
+ });
+ (end code)
+
+ Parameters:
+
+ clearCanvas - (boolean) Default's *true*. Whether to clear the frame/canvas when the viz is plotted or animated.
+ duration - (number) Default's *2500*. Duration of the animation in milliseconds.
+ fps - (number) Default's *40*. Frames per second.
+ transition - (object) Default's *$jit.Trans.Quart.easeInOut*. The transition used for the animations. See below for a more detailed explanation.
+
+ Object: $jit.Trans
+
+ This object is used for specifying different animation transitions in all visualizations.
+
+ There are many different type of animation transitions.
+
+ linear:
+
+ Displays a linear transition
+
+ >Trans.linear
+
+ (see Linear.png)
+
+ Quad:
+
+ Displays a Quadratic transition.
+
+ >Trans.Quad.easeIn
+ >Trans.Quad.easeOut
+ >Trans.Quad.easeInOut
+
+ (see Quad.png)
+
+ Cubic:
+
+ Displays a Cubic transition.
+
+ >Trans.Cubic.easeIn
+ >Trans.Cubic.easeOut
+ >Trans.Cubic.easeInOut
+
+ (see Cubic.png)
+
+ Quart:
+
+ Displays a Quartetic transition.
+
+ >Trans.Quart.easeIn
+ >Trans.Quart.easeOut
+ >Trans.Quart.easeInOut
+
+ (see Quart.png)
+
+ Quint:
+
+ Displays a Quintic transition.
+
+ >Trans.Quint.easeIn
+ >Trans.Quint.easeOut
+ >Trans.Quint.easeInOut
+
+ (see Quint.png)
+
+ Expo:
+
+ Displays an Exponential transition.
+
+ >Trans.Expo.easeIn
+ >Trans.Expo.easeOut
+ >Trans.Expo.easeInOut
+
+ (see Expo.png)
+
+ Circ:
+
+ Displays a Circular transition.
+
+ >Trans.Circ.easeIn
+ >Trans.Circ.easeOut
+ >Trans.Circ.easeInOut
+
+ (see Circ.png)
+
+ Sine:
+
+ Displays a Sineousidal transition.
+
+ >Trans.Sine.easeIn
+ >Trans.Sine.easeOut
+ >Trans.Sine.easeInOut
+
+ (see Sine.png)
+
+ Back:
+
+ >Trans.Back.easeIn
+ >Trans.Back.easeOut
+ >Trans.Back.easeInOut
+
+ (see Back.png)
+
+ Bounce:
+
+ Bouncy transition.
+
+ >Trans.Bounce.easeIn
+ >Trans.Bounce.easeOut
+ >Trans.Bounce.easeInOut
+
+ (see Bounce.png)
+
+ Elastic:
+
+ Elastic curve.
+
+ >Trans.Elastic.easeIn
+ >Trans.Elastic.easeOut
+ >Trans.Elastic.easeInOut
+
+ (see Elastic.png)
+
+ Based on:
+
+ Easing and Transition animation methods are based in the MooTools Framework <http://mootools.net>. Copyright (c) 2006-2010 Valerio Proietti, <http://mad4milk.net/>. MIT license <http://mootools.net/license.txt>.
+
+
+*/
+Options.Fx = {
+ $extend: true,
+
+ fps:40,
+ duration: 2500,
+ transition: $jit.Trans.Quart.easeInOut,
+ clearCanvas: true
+};
+
+/*
+ * File: Options.Label.js
+ *
+*/
+/*
+ Object: Options.Label
+
+ Provides styling for Labels such as font size, family, etc. Also sets Node labels as HTML, SVG or Native canvas elements.
+
+ Syntax:
+
+ (start code js)
+ Options.Label = {
+ overridable: false,
+ type: 'HTML', //'SVG', 'Native'
+ style: ' ',
+ size: 10,
+ family: 'sans-serif',
+ textAlign: 'center',
+ textBaseline: 'alphabetic',
+ color: '#fff'
+ };
+ (end code)
+
+ Example:
+
+ (start code js)
+ var viz = new $jit.Viz({
+ Label: {
+ type: 'Native',
+ size: 11,
+ color: '#ccc'
+ }
+ });
+ (end code)
+
+ Parameters:
+
+ overridable - (boolean) Default's *false*. Determine whether or not general label properties can be overridden by a particular <Graph.Node>.
+ type - (string) Default's *HTML*. The type for the labels. Can be 'HTML', 'SVG' or 'Native' canvas labels.
+ style - (string) Default's *empty string*. Can be 'italic' or 'bold'. This parameter is only taken into account when using 'Native' canvas labels. For DOM based labels the className *node* is added to the DOM element for styling via CSS. You can also use <Options.Controller> methods to style individual labels.
+ size - (number) Default's *10*. The font's size. This parameter is only taken into account when using 'Native' canvas labels. For DOM based labels the className *node* is added to the DOM element for styling via CSS. You can also use <Options.Controller> methods to style individual labels.
+ family - (string) Default's *sans-serif*. The font's family. This parameter is only taken into account when using 'Native' canvas labels. For DOM based labels the className *node* is added to the DOM element for styling via CSS. You can also use <Options.Controller> methods to style individual labels.
+ color - (string) Default's *#fff*. The font's color. This parameter is only taken into account when using 'Native' canvas labels. For DOM based labels the className *node* is added to the DOM element for styling via CSS. You can also use <Options.Controller> methods to style individual labels.
+*/
+Options.Label = {
+ $extend: false,
+
+ overridable: false,
+ type: 'HTML', //'SVG', 'Native'
+ style: ' ',
+ size: 10,
+ family: 'sans-serif',
+ textAlign: 'center',
+ textBaseline: 'alphabetic',
+ color: '#fff'
+};
+
+
+/*
+ * File: Options.Tips.js
+ *
+ */
+
+/*
+ Object: Options.Tips
+
+ Tips options
+
+ Syntax:
+
+ (start code js)
+ Options.Tips = {
+ enable: false,
+ type: 'auto',
+ offsetX: 20,
+ offsetY: 20,
+ onShow: $.empty,
+ onHide: $.empty
+ };
+ (end code)
+
+ Example:
+
+ (start code js)
+ var viz = new $jit.Viz({
+ Tips: {
+ enable: true,
+ type: 'Native',
+ offsetX: 10,
+ offsetY: 10,
+ onShow: function(tip, node) {
+ tip.innerHTML = node.name;
+ }
+ }
+ });
+ (end code)
+
+ Parameters:
+
+ enable - (boolean) Default's *false*. If *true*, a tooltip will be shown when a node is hovered. The tooltip is a div DOM element having "tip" as CSS class.
+ type - (string) Default's *auto*. Defines where to attach the MouseEnter/Leave tooltip events. Possible values are 'Native' to attach them to the canvas or 'HTML' to attach them to DOM label elements (if defined). 'auto' sets this property to the value of <Options.Label>'s *type* property.
+ offsetX - (number) Default's *20*. An offset added to the current tooltip x-position (which is the same as the current mouse position). Default's 20.
+ offsetY - (number) Default's *20*. An offset added to the current tooltip y-position (which is the same as the current mouse position). Default's 20.
+ onShow(tip, node) - This callack is used right before displaying a tooltip. The first formal parameter is the tip itself (which is a DivElement). The second parameter may be a <Graph.Node> for graph based visualizations or an object with label, value properties for charts.
+ onHide() - This callack is used when hiding a tooltip.
+
+*/
+Options.Tips = {
+ $extend: false,
+
+ enable: false,
+ type: 'auto',
+ offsetX: 20,
+ offsetY: 20,
+ force: false,
+ onShow: $.empty,
+ onHide: $.empty
+};
+
+
+/*
+ * File: Options.NodeStyles.js
+ *
+ */
+
+/*
+ Object: Options.NodeStyles
+
+ Apply different styles when a node is hovered or selected.
+
+ Syntax:
+
+ (start code js)
+ Options.NodeStyles = {
+ enable: false,
+ type: 'auto',
+ stylesHover: false,
+ stylesClick: false
+ };
+ (end code)
+
+ Example:
+
+ (start code js)
+ var viz = new $jit.Viz({
+ NodeStyles: {
+ enable: true,
+ type: 'Native',
+ stylesHover: {
+ dim: 30,
+ color: '#fcc'
+ },
+ duration: 600
+ }
+ });
+ (end code)
+
+ Parameters:
+
+ enable - (boolean) Default's *false*. Whether to enable this option.
+ type - (string) Default's *auto*. Use this to attach the hover/click events in the nodes or the nodes labels (if they have been defined as DOM elements: 'HTML' or 'SVG', see <Options.Label> for more details). The default 'auto' value will set NodeStyles to the same type defined for <Options.Label>.
+ stylesHover - (boolean|object) Default's *false*. An object with node styles just like the ones defined for <Options.Node> or *false* otherwise.
+ stylesClick - (boolean|object) Default's *false*. An object with node styles just like the ones defined for <Options.Node> or *false* otherwise.
+*/
+
+Options.NodeStyles = {
+ $extend: false,
+
+ enable: false,
+ type: 'auto',
+ stylesHover: false,
+ stylesClick: false
+};
+
+
+/*
+ * File: Options.Events.js
+ *
+*/
+
+/*
+ Object: Options.Events
+
+ Configuration for adding mouse/touch event handlers to Nodes.
+
+ Syntax:
+
+ (start code js)
+ Options.Events = {
+ enable: false,
+ enableForEdges: false,
+ type: 'auto',
+ onClick: $.empty,
+ onRightClick: $.empty,
+ onMouseMove: $.empty,
+ onMouseEnter: $.empty,
+ onMouseLeave: $.empty,
+ onDragStart: $.empty,
+ onDragMove: $.empty,
+ onDragCancel: $.empty,
+ onDragEnd: $.empty,
+ onTouchStart: $.empty,
+ onTouchMove: $.empty,
+ onTouchEnd: $.empty,
+ onTouchCancel: $.empty,
+ onMouseWheel: $.empty
+ };
+ (end code)
+
+ Example:
+
+ (start code js)
+ var viz = new $jit.Viz({
+ Events: {
+ enable: true,
+ onClick: function(node, eventInfo, e) {
+ viz.doSomething();
+ },
+ onMouseEnter: function(node, eventInfo, e) {
+ viz.canvas.getElement().style.cursor = 'pointer';
+ },
+ onMouseLeave: function(node, eventInfo, e) {
+ viz.canvas.getElement().style.cursor = '';
+ }
+ }
+ });
+ (end code)
+
+ Parameters:
+
+ enable - (boolean) Default's *false*. Whether to enable the Event system.
+ enableForEdges - (boolean) Default's *false*. Whether to track events also in arcs. If *true* the same callbacks -described below- are used for nodes *and* edges. A simple duck type check for edges is to check for *node.nodeFrom*.
+ type - (string) Default's 'auto'. Whether to attach the events onto the HTML labels (via event delegation) or to use the custom 'Native' canvas Event System of the library. 'auto' is set when you let the <Options.Label> *type* parameter decide this.
+ onClick(node, eventInfo, e) - Triggered when a user performs a click in the canvas. *node* is the <Graph.Node> clicked or false if no node has been clicked. *e* is the grabbed event (should return the native event in a cross-browser manner). *eventInfo* is an object containing useful methods like *getPos* to get the mouse position relative to the canvas.
+ onRightClick(node, eventInfo, e) - Triggered when a user performs a right click in the canvas. *node* is the <Graph.Node> right clicked or false if no node has been clicked. *e* is the grabbed event (should return the native event in a cross-browser manner). *eventInfo* is an object containing useful methods like *getPos* to get the mouse position relative to the canvas.
+ onMouseMove(node, eventInfo, e) - Triggered when the user moves the mouse. *node* is the <Graph.Node> under the cursor as it's moving over the canvas or false if no node has been clicked. *e* is the grabbed event (should return the native event in a cross-browser manner). *eventInfo* is an object containing useful methods like *getPos* to get the mouse position relative to the canvas.
+ onMouseEnter(node, eventInfo, e) - Triggered when a user moves the mouse over a node. *node* is the <Graph.Node> that the mouse just entered. *e* is the grabbed event (should return the native event in a cross-browser manner). *eventInfo* is an object containing useful methods like *getPos* to get the mouse position relative to the canvas.
+ onMouseLeave(node, eventInfo, e) - Triggered when the user mouse-outs a node. *node* is the <Graph.Node> 'mouse-outed'. *e* is the grabbed event (should return the native event in a cross-browser manner). *eventInfo* is an object containing useful methods like *getPos* to get the mouse position relative to the canvas.
+ onDragStart(node, eventInfo, e) - Triggered when the user mouse-downs over a node. *node* is the <Graph.Node> being pressed. *e* is the grabbed event (should return the native event in a cross-browser manner). *eventInfo* is an object containing useful methods like *getPos* to get the mouse position relative to the canvas.
+ onDragMove(node, eventInfo, e) - Triggered when a user, after pressing the mouse button over a node, moves the mouse around. *node* is the <Graph.Node> being dragged. *e* is the grabbed event (should return the native event in a cross-browser manner). *eventInfo* is an object containing useful methods like *getPos* to get the mouse position relative to the canvas.
+ onDragEnd(node, eventInfo, e) - Triggered when a user finished dragging a node. *node* is the <Graph.Node> being dragged. *e* is the grabbed event (should return the native event in a cross-browser manner). *eventInfo* is an object containing useful methods like *getPos* to get the mouse position relative to the canvas.
+ onDragCancel(node, eventInfo, e) - Triggered when the user releases the mouse button over a <Graph.Node> that wasn't dragged (i.e. the user didn't perform any mouse movement after pressing the mouse button). *node* is the <Graph.Node> being dragged. *e* is the grabbed event (should return the native event in a cross-browser manner). *eventInfo* is an object containing useful methods like *getPos* to get the mouse position relative to the canvas.
+ onTouchStart(node, eventInfo, e) - Behaves just like onDragStart.
+ onTouchMove(node, eventInfo, e) - Behaves just like onDragMove.
+ onTouchEnd(node, eventInfo, e) - Behaves just like onDragEnd.
+ onTouchCancel(node, eventInfo, e) - Behaves just like onDragCancel.
+ onMouseWheel(delta, e) - Triggered when the user uses the mouse scroll over the canvas. *delta* is 1 or -1 depending on the sense of the mouse scroll.
+*/
+
+Options.Events = {
+ $extend: false,
+
+ enable: false,
+ enableForEdges: false,
+ type: 'auto',
+ onClick: $.empty,
+ onRightClick: $.empty,
+ onMouseMove: $.empty,
+ onMouseEnter: $.empty,
+ onMouseLeave: $.empty,
+ onDragStart: $.empty,
+ onDragMove: $.empty,
+ onDragCancel: $.empty,
+ onDragEnd: $.empty,
+ onTouchStart: $.empty,
+ onTouchMove: $.empty,
+ onTouchEnd: $.empty,
+ onMouseWheel: $.empty
+};
+
+/*
+ * File: Options.Navigation.js
+ *
+*/
+
+/*
+ Object: Options.Navigation
+
+ Panning and zooming options for Graph/Tree based visualizations. These options are implemented
+ by all visualizations except charts (<AreaChart>, <BarChart> and <PieChart>).
+
+ Syntax:
+
+ (start code js)
+
+ Options.Navigation = {
+ enable: false,
+ type: 'auto',
+ panning: false, //true, 'avoid nodes'
+ zooming: false
+ };
+
+ (end code)
+
+ Example:
+
+ (start code js)
+ var viz = new $jit.Viz({
+ Navigation: {
+ enable: true,
+ panning: 'avoid nodes',
+ zooming: 20
+ }
+ });
+ (end code)
+
+ Parameters:
+
+ enable - (boolean) Default's *false*. Whether to enable Navigation capabilities.
+ panning - (boolean|string) Default's *false*. Set this property to *true* if you want to add Drag and Drop panning support to the visualization. You can also set this parameter to 'avoid nodes' to enable DnD panning but disable it if the DnD is taking place over a node. This is useful when some other events like Drag & Drop for nodes are added to <Graph.Nodes>.
+ zooming - (boolean|number) Default's *false*. Set this property to a numeric value to turn mouse-scroll zooming on. The number will be proportional to the mouse-scroll sensitivity.
+
+*/
+
+Options.Navigation = {
+ $extend: false,
+
+ enable: false,
+ type: 'auto',
+ panning: false, //true | 'avoid nodes'
+ zooming: false
+};
+
+/*
+ * File: Options.Controller.js
+ *
+*/
+
+/*
+ Object: Options.Controller
+
+ Provides controller methods. Controller methods are callback functions that get called at different stages
+ of the animation, computing or plotting of the visualization.
+
+ Implemented by:
+
+ All visualizations except charts (<AreaChart>, <BarChart> and <PieChart>).
+
+ Syntax:
+
+ (start code js)
+
+ Options.Controller = {
+ onBeforeCompute: $.empty,
+ onAfterCompute: $.empty,
+ onCreateLabel: $.empty,
+ onPlaceLabel: $.empty,
+ onComplete: $.empty,
+ onBeforePlotLine:$.empty,
+ onAfterPlotLine: $.empty,
+ onBeforePlotNode:$.empty,
+ onAfterPlotNode: $.empty,
+ request: false
+ };
+
+ (end code)
+
+ Example:
+
+ (start code js)
+ var viz = new $jit.Viz({
+ onBeforePlotNode: function(node) {
+ if(node.selected) {
+ node.setData('color', '#ffc');
+ } else {
+ node.removeData('color');
+ }
+ },
+ onBeforePlotLine: function(adj) {
+ if(adj.nodeFrom.selected && adj.nodeTo.selected) {
+ adj.setData('color', '#ffc');
+ } else {
+ adj.removeData('color');
+ }
+ },
+ onAfterCompute: function() {
+ alert("computed!");
+ }
+ });
+ (end code)
+
+ Parameters:
+
+ onBeforeCompute(node) - This method is called right before performing all computations and animations. The selected <Graph.Node> is passed as parameter.
+ onAfterCompute() - This method is triggered after all animations or computations ended.
+ onCreateLabel(domElement, node) - This method receives a new label DIV element as first parameter, and the corresponding <Graph.Node> as second parameter. This method will only be called once for each label. This method is useful when adding events or styles to the labels used by the JIT.
+ onPlaceLabel(domElement, node) - This method receives a label DIV element as first parameter and the corresponding <Graph.Node> as second parameter. This method is called each time a label has been placed in the visualization, for example at each step of an animation, and thus it allows you to update the labels properties, such as size or position. Note that onPlaceLabel will be triggered after updating the labels positions. That means that, for example, the left and top css properties are already updated to match the nodes positions. Width and height properties are not set however.
+ onBeforePlotNode(node) - This method is triggered right before plotting each <Graph.Node>. This method is useful for changing a node style right before plotting it.
+ onAfterPlotNode(node) - This method is triggered right after plotting each <Graph.Node>.
+ onBeforePlotLine(adj) - This method is triggered right before plotting a <Graph.Adjacence>. This method is useful for adding some styles to a particular edge before being plotted.
+ onAfterPlotLine(adj) - This method is triggered right after plotting a <Graph.Adjacence>.
+
+ *Used in <ST>, <TM.Base> and <Icicle> visualizations*
+
+ request(nodeId, level, onComplete) - This method is used for buffering information into the visualization. When clicking on an empty node, the visualization will make a request for this node's subtrees, specifying a given level for this subtree (defined by _levelsToShow_). Once the request is completed, the onComplete callback should be called with the given result. This is useful to provide on-demand information into the visualizations withought having to load the entire information from start. The parameters used by this method are _nodeId_, which is the id of the root of the subtree to request, _level_ which is the depth of the subtree to be requested (0 would mean just the root node). _onComplete_ is an object having the callback method _onComplete.onComplete(json)_ that should be called once the json has been retrieved.
+
+ */
+Options.Controller = {
+ $extend: true,
+
+ onBeforeCompute: $.empty,
+ onAfterCompute: $.empty,
+ onCreateLabel: $.empty,
+ onPlaceLabel: $.empty,
+ onComplete: $.empty,
+ onBeforePlotLine:$.empty,
+ onAfterPlotLine: $.empty,
+ onBeforePlotNode:$.empty,
+ onAfterPlotNode: $.empty,
+ request: false
+};
+
+
+/*
+ * File: Extras.js
+ *
+ * Provides Extras such as Tips and Style Effects.
+ *
+ * Description:
+ *
+ * Provides the <Tips> and <NodeStyles> classes and functions.
+ *
+ */
+
+/*
+ * Manager for mouse events (clicking and mouse moving).
+ *
+ * This class is used for registering objects implementing onClick
+ * and onMousemove methods. These methods are called when clicking or
+ * moving the mouse around the Canvas.
+ * For now, <Tips> and <NodeStyles> are classes implementing these methods.
+ *
+ */
+var ExtrasInitializer = {
+ initialize: function(className, viz) {
+ this.viz = viz;
+ this.canvas = viz.canvas;
+ this.config = viz.config[className];
+ this.nodeTypes = viz.fx.nodeTypes;
+ var type = this.config.type;
+ this.dom = type == 'auto'? (viz.config.Label.type != 'Native') : (type != 'Native');
+ this.labelContainer = this.dom && viz.labels.getLabelContainer();
+ this.isEnabled() && this.initializePost();
+ },
+ initializePost: $.empty,
+ setAsProperty: $.lambda(false),
+ isEnabled: function() {
+ return this.config.enable;
+ },
+ isLabel: function(e, win) {
+ e = $.event.get(e, win);
+ var labelContainer = this.labelContainer,
+ target = e.target || e.srcElement;
+ if(target && target.parentNode == labelContainer)
+ return target;
+ return false;
+ }
+};
+
+var EventsInterface = {
+ onMouseUp: $.empty,
+ onMouseDown: $.empty,
+ onMouseMove: $.empty,
+ onMouseOver: $.empty,
+ onMouseOut: $.empty,
+ onMouseWheel: $.empty,
+ onTouchStart: $.empty,
+ onTouchMove: $.empty,
+ onTouchEnd: $.empty,
+ onTouchCancel: $.empty
+};
+
+var MouseEventsManager = new Class({
+ initialize: function(viz) {
+ this.viz = viz;
+ this.canvas = viz.canvas;
+ this.node = false;
+ this.edge = false;
+ this.registeredObjects = [];
+ this.attachEvents();
+ },
+
+ attachEvents: function() {
+ var htmlCanvas = this.canvas.getElement(),
+ that = this;
+ htmlCanvas.oncontextmenu = $.lambda(false);
+ $.addEvents(htmlCanvas, {
+ 'mouseup': function(e, win) {
+ var event = $.event.get(e, win);
+ that.handleEvent('MouseUp', e, win,
+ that.makeEventObject(e, win),
+ $.event.isRightClick(event));
+ },
+ 'mousedown': function(e, win) {
+ var event = $.event.get(e, win);
+ that.handleEvent('MouseDown', e, win, that.makeEventObject(e, win),
+ $.event.isRightClick(event));
+ },
+ 'mousemove': function(e, win) {
+ that.handleEvent('MouseMove', e, win, that.makeEventObject(e, win));
+ },
+ 'mouseover': function(e, win) {
+ that.handleEvent('MouseOver', e, win, that.makeEventObject(e, win));
+ },
+ 'mouseout': function(e, win) {
+ that.handleEvent('MouseOut', e, win, that.makeEventObject(e, win));
+ },
+ 'touchstart': function(e, win) {
+ that.handleEvent('TouchStart', e, win, that.makeEventObject(e, win));
+ },
+ 'touchmove': function(e, win) {
+ that.handleEvent('TouchMove', e, win, that.makeEventObject(e, win));
+ },
+ 'touchend': function(e, win) {
+ that.handleEvent('TouchEnd', e, win, that.makeEventObject(e, win));
+ }
+ });
+ //attach mousewheel event
+ var handleMouseWheel = function(e, win) {
+ var event = $.event.get(e, win);
+ var wheel = $.event.getWheel(event);
+ that.handleEvent('MouseWheel', e, win, wheel);
+ };
+ //TODO(nico): this is a horrible check for non-gecko browsers!
+ if(!document.getBoxObjectFor && window.mozInnerScreenX == null) {
+ $.addEvent(htmlCanvas, 'mousewheel', handleMouseWheel);
+ } else {
+ htmlCanvas.addEventListener('DOMMouseScroll', handleMouseWheel, false);
+ }
+ },
+
+ register: function(obj) {
+ this.registeredObjects.push(obj);
+ },
+
+ handleEvent: function() {
+ var args = Array.prototype.slice.call(arguments),
+ type = args.shift();
+ for(var i=0, regs=this.registeredObjects, l=regs.length; i<l; i++) {
+ regs[i]['on' + type].apply(regs[i], args);
+ }
+ },
+
+ makeEventObject: function(e, win) {
+ var that = this,
+ graph = this.viz.graph,
+ fx = this.viz.fx,
+ ntypes = fx.nodeTypes,
+ etypes = fx.edgeTypes;
+ return {
+ pos: false,
+ node: false,
+ edge: false,
+ contains: false,
+ getNodeCalled: false,
+ getEdgeCalled: false,
+ getPos: function() {
+ //TODO(nico): check why this can't be cache anymore when using edge detection
+ //if(this.pos) return this.pos;
+ var canvas = that.viz.canvas,
+ s = canvas.getSize(),
+ p = canvas.getPos(),
+ ox = canvas.translateOffsetX,
+ oy = canvas.translateOffsetY,
+ sx = canvas.scaleOffsetX,
+ sy = canvas.scaleOffsetY,
+ pos = $.event.getPos(e, win);
+ this.pos = {
+ x: (pos.x - p.x - s.width/2 - ox) * 1/sx,
+ y: (pos.y - p.y - s.height/2 - oy) * 1/sy
+ };
+ return this.pos;
+ },
+ getNode: function() {
+ if(this.getNodeCalled) return this.node;
+ this.getNodeCalled = true;
+ for(var id in graph.nodes) {
+ var n = graph.nodes[id],
+ geom = n && ntypes[n.getData('type')],
+ contains = geom && geom.contains && geom.contains.call(fx, n, this.getPos());
+ if(contains) {
+ this.contains = contains;
+ return that.node = this.node = n;
+ }
+ }
+ return that.node = this.node = false;
+ },
+ getEdge: function() {
+ if(this.getEdgeCalled) return this.edge;
+ this.getEdgeCalled = true;
+ var hashset = {};
+ for(var id in graph.edges) {
+ var edgeFrom = graph.edges[id];
+ hashset[id] = true;
+ for(var edgeId in edgeFrom) {
+ if(edgeId in hashset) continue;
+ var e = edgeFrom[edgeId],
+ geom = e && etypes[e.getData('type')],
+ contains = geom && geom.contains && geom.contains.call(fx, e, this.getPos());
+ if(contains) {
+ this.contains = contains;
+ return that.edge = this.edge = e;
+ }
+ }
+ }
+ return that.edge = this.edge = false;
+ },
+ getContains: function() {
+ if(this.getNodeCalled) return this.contains;
+ this.getNode();
+ return this.contains;
+ }
+ };
+ }
+});
+
+/*
+ * Provides the initialization function for <NodeStyles> and <Tips> implemented
+ * by all main visualizations.
+ *
+ */
+var Extras = {
+ initializeExtras: function() {
+ var mem = new MouseEventsManager(this), that = this;
+ $.each(['NodeStyles', 'Tips', 'Navigation', 'Events'], function(k) {
+ var obj = new Extras.Classes[k](k, that);
+ if(obj.isEnabled()) {
+ mem.register(obj);
+ }
+ if(obj.setAsProperty()) {
+ that[k.toLowerCase()] = obj;
+ }
+ });
+ }
+};
+
+Extras.Classes = {};
+/*
+ Class: Events
+
+ This class defines an Event API to be accessed by the user.
+ The methods implemented are the ones defined in the <Options.Events> object.
+*/
+
+Extras.Classes.Events = new Class({
+ Implements: [ExtrasInitializer, EventsInterface],
+
+ initializePost: function() {
+ this.fx = this.viz.fx;
+ this.ntypes = this.viz.fx.nodeTypes;
+ this.etypes = this.viz.fx.edgeTypes;
+
+ this.hovered = false;
+ this.pressed = false;
+ this.touched = false;
+
+ this.touchMoved = false;
+ this.moved = false;
+
+ },
+
+ setAsProperty: $.lambda(true),
+
+ onMouseUp: function(e, win, event, isRightClick) {
+ var evt = $.event.get(e, win);
+ if(!this.moved) {
+ if(isRightClick) {
+ this.config.onRightClick(this.hovered, event, evt);
+ } else {
+ this.config.onClick(this.pressed, event, evt);
+ }
+ }
+ if(this.pressed) {
+ if(this.moved) {
+ this.config.onDragEnd(this.pressed, event, evt);
+ } else {
+ this.config.onDragCancel(this.pressed, event, evt);
+ }
+ this.pressed = this.moved = false;
+ }
+ },
+
+ onMouseOut: function(e, win, event) {
+ //mouseout a label
+ var evt = $.event.get(e, win), label;
+ if(this.dom && (label = this.isLabel(e, win))) {
+ this.config.onMouseLeave(this.viz.graph.getNode(label.id),
+ event, evt);
+ this.hovered = false;
+ return;
+ }
+ //mouseout canvas
+ var rt = evt.relatedTarget,
+ canvasWidget = this.canvas.getElement();
+ while(rt && rt.parentNode) {
+ if(canvasWidget == rt.parentNode) return;
+ rt = rt.parentNode;
+ }
+ if(this.hovered) {
+ this.config.onMouseLeave(this.hovered,
+ event, evt);
+ this.hovered = false;
+ }
+ },
+
+ onMouseOver: function(e, win, event) {
+ //mouseover a label
+ var evt = $.event.get(e, win), label;
+ if(this.dom && (label = this.isLabel(e, win))) {
+ this.hovered = this.viz.graph.getNode(label.id);
+ this.config.onMouseEnter(this.hovered,
+ event, evt);
+ }
+ },
+
+ onMouseMove: function(e, win, event) {
+ var label, evt = $.event.get(e, win);
+ if(this.pressed) {
+ this.moved = true;
+ this.config.onDragMove(this.pressed, event, evt);
+ return;
+ }
+ if(this.dom) {
+ this.config.onMouseMove(this.hovered,
+ event, evt);
+ } else {
+ if(this.hovered) {
+ var hn = this.hovered;
+ var geom = hn.nodeFrom? this.etypes[hn.getData('type')] : this.ntypes[hn.getData('type')];
+ var contains = geom && geom.contains
+ && geom.contains.call(this.fx, hn, event.getPos());
+ if(contains) {
+ this.config.onMouseMove(hn, event, evt);
+ return;
+ } else {
+ this.config.onMouseLeave(hn, event, evt);
+ this.hovered = false;
+ }
+ }
+ if(this.hovered = (event.getNode() || (this.config.enableForEdges && event.getEdge()))) {
+ this.config.onMouseEnter(this.hovered, event, evt);
+ } else {
+ this.config.onMouseMove(false, event, evt);
+ }
+ }
+ },
+
+ onMouseWheel: function(e, win, delta) {
+ this.config.onMouseWheel(delta, $.event.get(e, win));
+ },
+
+ onMouseDown: function(e, win, event) {
+ var evt = $.event.get(e, win);
+ this.pressed = event.getNode() || (this.config.enableForEdges && event.getEdge());
+ this.config.onDragStart(this.pressed, event, evt);
+ },
+
+ onTouchStart: function(e, win, event) {
+ var evt = $.event.get(e, win);
+ this.touched = event.getNode() || (this.config.enableForEdges && event.getEdge());
+ this.config.onTouchStart(this.touched, event, evt);
+ },
+
+ onTouchMove: function(e, win, event) {
+ var evt = $.event.get(e, win);
+ if(this.touched) {
+ this.touchMoved = true;
+ this.config.onTouchMove(this.touched, event, evt);
+ }
+ },
+
+ onTouchEnd: function(e, win, event) {
+ var evt = $.event.get(e, win);
+ if(this.touched) {
+ if(this.touchMoved) {
+ this.config.onTouchEnd(this.touched, event, evt);
+ } else {
+ this.config.onTouchCancel(this.touched, event, evt);
+ }
+ this.touched = this.touchMoved = false;
+ }
+ }
+});
+
+/*
+ Class: Tips
+
+ A class containing tip related functions. This class is used internally.
+
+ Used by:
+
+ <ST>, <Sunburst>, <Hypertree>, <RGraph>, <TM>, <ForceDirected>, <Icicle>
+
+ See also:
+
+ <Options.Tips>
+*/
+
+Extras.Classes.Tips = new Class({
+ Implements: [ExtrasInitializer, EventsInterface],
+
+ initializePost: function() {
+ //add DOM tooltip
+ if(document.body) {
+ var tip = $('_tooltip') || document.createElement('div');
+ tip.id = '_tooltip';
+ tip.className = 'tip';
+ $.extend(tip.style, {
+ position: 'absolute',
+ display: 'none',
+ zIndex: 13000
+ });
+ document.body.appendChild(tip);
+ this.tip = tip;
+ this.node = false;
+ }
+ },
+
+ setAsProperty: $.lambda(true),
+
+ onMouseOut: function(e, win) {
+ //mouseout a label
+ if(this.dom && this.isLabel(e, win)) {
+ this.hide(true);
+ return;
+ }
+ //mouseout canvas
+ var rt = e.relatedTarget,
+ canvasWidget = this.canvas.getElement();
+ while(rt && rt.parentNode) {
+ if(canvasWidget == rt.parentNode) return;
+ rt = rt.parentNode;
+ }
+ this.hide(false);
+ },
+
+ onMouseOver: function(e, win) {
+ //mouseover a label
+ var label;
+ if(this.dom && (label = this.isLabel(e, win))) {
+ this.node = this.viz.graph.getNode(label.id);
+ this.config.onShow(this.tip, this.node, label);
+ }
+ },
+
+ onMouseMove: function(e, win, opt) {
+ if(this.dom && this.isLabel(e, win)) {
+ this.setTooltipPosition($.event.getPos(e, win));
+ }
+ if(!this.dom) {
+ var node = opt.getNode();
+ if(!node) {
+ this.hide(true);
+ return;
+ }
+ if(this.config.force || !this.node || this.node.id != node.id) {
+ this.node = node;
+ this.config.onShow(this.tip, node, opt.getContains());
+ }
+ this.setTooltipPosition($.event.getPos(e, win));
+ }
+ },
+
+ setTooltipPosition: function(pos) {
+ var tip = this.tip,
+ style = tip.style,
+ cont = this.config;
+ style.display = '';
+ //get window dimensions
+ var win = {
+ 'height': document.body.clientHeight,
+ 'width': document.body.clientWidth
+ };
+ //get tooltip dimensions
+ var obj = {
+ 'width': tip.offsetWidth,
+ 'height': tip.offsetHeight
+ };
+ //set tooltip position
+ var x = cont.offsetX, y = cont.offsetY;
+ style.top = ((pos.y + y + obj.height > win.height)?
+ (pos.y - obj.height - y) : pos.y + y) + 'px';
+ style.left = ((pos.x + obj.width + x > win.width)?
+ (pos.x - obj.width - x) : pos.x + x) + 'px';
+ },
+
+ hide: function(triggerCallback) {
+ this.tip.style.display = 'none';
+ triggerCallback && this.config.onHide();
+ }
+});
+
+/*
+ Class: NodeStyles
+
+ Change node styles when clicking or hovering a node. This class is used internally.
+
+ Used by:
+
+ <ST>, <Sunburst>, <Hypertree>, <RGraph>, <TM>, <ForceDirected>, <Icicle>
+
+ See also:
+
+ <Options.NodeStyles>
+*/
+Extras.Classes.NodeStyles = new Class({
+ Implements: [ExtrasInitializer, EventsInterface],
+
+ initializePost: function() {
+ this.fx = this.viz.fx;
+ this.types = this.viz.fx.nodeTypes;
+ this.nStyles = this.config;
+ this.nodeStylesOnHover = this.nStyles.stylesHover;
+ this.nodeStylesOnClick = this.nStyles.stylesClick;
+ this.hoveredNode = false;
+ this.fx.nodeFxAnimation = new Animation();
+
+ this.down = false;
+ this.move = false;
+ },
+
+ onMouseOut: function(e, win) {
+ this.down = this.move = false;
+ if(!this.hoveredNode) return;
+ //mouseout a label
+ if(this.dom && this.isLabel(e, win)) {
+ this.toggleStylesOnHover(this.hoveredNode, false);
+ }
+ //mouseout canvas
+ var rt = e.relatedTarget,
+ canvasWidget = this.canvas.getElement();
+ while(rt && rt.parentNode) {
+ if(canvasWidget == rt.parentNode) return;
+ rt = rt.parentNode;
+ }
+ this.toggleStylesOnHover(this.hoveredNode, false);
+ this.hoveredNode = false;
+ },
+
+ onMouseOver: function(e, win) {
+ //mouseover a label
+ var label;
+ if(this.dom && (label = this.isLabel(e, win))) {
+ var node = this.viz.graph.getNode(label.id);
+ if(node.selected) return;
+ this.hoveredNode = node;
+ this.toggleStylesOnHover(this.hoveredNode, true);
+ }
+ },
+
+ onMouseDown: function(e, win, event, isRightClick) {
+ if(isRightClick) return;
+ var label;
+ if(this.dom && (label = this.isLabel(e, win))) {
+ this.down = this.viz.graph.getNode(label.id);
+ } else if(!this.dom) {
+ this.down = event.getNode();
+ }
+ this.move = false;
+ },
+
+ onMouseUp: function(e, win, event, isRightClick) {
+ if(isRightClick) return;
+ if(!this.move) {
+ this.onClick(event.getNode());
+ }
+ this.down = this.move = false;
+ },
+
+ getRestoredStyles: function(node, type) {
+ var restoredStyles = {},
+ nStyles = this['nodeStylesOn' + type];
+ for(var prop in nStyles) {
+ restoredStyles[prop] = node.styles['$' + prop];
+ }
+ return restoredStyles;
+ },
+
+ toggleStylesOnHover: function(node, set) {
+ if(this.nodeStylesOnHover) {
+ this.toggleStylesOn('Hover', node, set);
+ }
+ },
+
+ toggleStylesOnClick: function(node, set) {
+ if(this.nodeStylesOnClick) {
+ this.toggleStylesOn('Click', node, set);
+ }
+ },
+
+ toggleStylesOn: function(type, node, set) {
+ var viz = this.viz;
+ var nStyles = this.nStyles;
+ if(set) {
+ var that = this;
+ if(!node.styles) {
+ node.styles = $.merge(node.data, {});
+ }
+ for(var s in this['nodeStylesOn' + type]) {
+ var $s = '$' + s;
+ if(!($s in node.styles)) {
+ node.styles[$s] = node.getData(s);
+ }
+ }
+ viz.fx.nodeFx($.extend({
+ 'elements': {
+ 'id': node.id,
+ 'properties': that['nodeStylesOn' + type]
+ },
+ transition: Trans.Quart.easeOut,
+ duration:300,
+ fps:40
+ }, this.config));
+ } else {
+ var restoredStyles = this.getRestoredStyles(node, type);
+ viz.fx.nodeFx($.extend({
+ 'elements': {
+ 'id': node.id,
+ 'properties': restoredStyles
+ },
+ transition: Trans.Quart.easeOut,
+ duration:300,
+ fps:40
+ }, this.config));
+ }
+ },
+
+ onClick: function(node) {
+ if(!node) return;
+ var nStyles = this.nodeStylesOnClick;
+ if(!nStyles) return;
+ //if the node is selected then unselect it
+ if(node.selected) {
+ this.toggleStylesOnClick(node, false);
+ delete node.selected;
+ } else {
+ //unselect all selected nodes...
+ this.viz.graph.eachNode(function(n) {
+ if(n.selected) {
+ for(var s in nStyles) {
+ n.setData(s, n.styles['$' + s], 'end');
+ }
+ delete n.selected;
+ }
+ });
+ //select clicked node
+ this.toggleStylesOnClick(node, true);
+ node.selected = true;
+ delete node.hovered;
+ this.hoveredNode = false;
+ }
+ },
+
+ onMouseMove: function(e, win, event) {
+ //if mouse button is down and moving set move=true
+ if(this.down) this.move = true;
+ //already handled by mouseover/out
+ if(this.dom && this.isLabel(e, win)) return;
+ var nStyles = this.nodeStylesOnHover;
+ if(!nStyles) return;
+
+ if(!this.dom) {
+ if(this.hoveredNode) {
+ var geom = this.types[this.hoveredNode.getData('type')];
+ var contains = geom && geom.contains && geom.contains.call(this.fx,
+ this.hoveredNode, event.getPos());
+ if(contains) return;
+ }
+ var node = event.getNode();
+ //if no node is being hovered then just exit
+ if(!this.hoveredNode && !node) return;
+ //if the node is hovered then exit
+ if(node.hovered) return;
+ //select hovered node
+ if(node && !node.selected) {
+ //check if an animation is running and exit it
+ this.fx.nodeFxAnimation.stopTimer();
+ //unselect all hovered nodes...
+ this.viz.graph.eachNode(function(n) {
+ if(n.hovered && !n.selected) {
+ for(var s in nStyles) {
+ n.setData(s, n.styles['$' + s], 'end');
+ }
+ delete n.hovered;
+ }
+ });
+ //select hovered node
+ node.hovered = true;
+ this.hoveredNode = node;
+ this.toggleStylesOnHover(node, true);
+ } else if(this.hoveredNode && !this.hoveredNode.selected) {
+ //check if an animation is running and exit it
+ this.fx.nodeFxAnimation.stopTimer();
+ //unselect hovered node
+ this.toggleStylesOnHover(this.hoveredNode, false);
+ delete this.hoveredNode.hovered;
+ this.hoveredNode = false;
+ }
+ }
+ }
+});
+
+Extras.Classes.Navigation = new Class({
+ Implements: [ExtrasInitializer, EventsInterface],
+
+ initializePost: function() {
+ this.pos = false;
+ this.pressed = false;
+ },
+
+ onMouseWheel: function(e, win, scroll) {
+ if(!this.config.zooming) return;
+ $.event.stop($.event.get(e, win));
+ var val = this.config.zooming / 1000,
+ ans = 1 + scroll * val;
+ this.canvas.scale(ans, ans);
+ },
+
+ onMouseDown: function(e, win, eventInfo) {
+ if(!this.config.panning) return;
+ if(this.config.panning == 'avoid nodes' && eventInfo.getNode()) return;
+ this.pressed = true;
+ this.pos = eventInfo.getPos();
+ var canvas = this.canvas,
+ ox = canvas.translateOffsetX,
+ oy = canvas.translateOffsetY,
+ sx = canvas.scaleOffsetX,
+ sy = canvas.scaleOffsetY;
+ this.pos.x *= sx;
+ this.pos.x += ox;
+ this.pos.y *= sy;
+ this.pos.y += oy;
+ },
+
+ onMouseMove: function(e, win, eventInfo) {
+ if(!this.config.panning) return;
+ if(!this.pressed) return;
+ if(this.config.panning == 'avoid nodes' && eventInfo.getNode()) return;
+ var thispos = this.pos,
+ currentPos = eventInfo.getPos(),
+ canvas = this.canvas,
+ ox = canvas.translateOffsetX,
+ oy = canvas.translateOffsetY,
+ sx = canvas.scaleOffsetX,
+ sy = canvas.scaleOffsetY;
+ currentPos.x *= sx;
+ currentPos.y *= sy;
+ currentPos.x += ox;
+ currentPos.y += oy;
+ var x = currentPos.x - thispos.x,
+ y = currentPos.y - thispos.y;
+ this.pos = currentPos;
+ this.canvas.translate(x * 1/sx, y * 1/sy);
+ },
+
+ onMouseUp: function(e, win, eventInfo, isRightClick) {
+ if(!this.config.panning) return;
+ this.pressed = false;
+ }
+});
+
+
+/*
+ * File: Canvas.js
+ *
+ */
+
+/*
+ Class: Canvas
+
+ A canvas widget used by all visualizations. The canvas object can be accessed by doing *viz.canvas*. If you want to
+ know more about <Canvas> options take a look at <Options.Canvas>.
+
+ A canvas widget is a set of DOM elements that wrap the native canvas DOM Element providing a consistent API and behavior
+ across all browsers. It can also include Elements to add DOM (SVG or HTML) label support to all visualizations.
+
+ Example:
+
+ Suppose we have this HTML
+
+ (start code xml)
+ <div id="infovis"></div>
+ (end code)
+
+ Now we create a new Visualization
+
+ (start code js)
+ var viz = new $jit.Viz({
+ //Where to inject the canvas. Any div container will do.
+ 'injectInto':'infovis',
+ //width and height for canvas.
+ //Default's to the container offsetWidth and Height.
+ 'width': 900,
+ 'height':500
+ });
+ (end code)
+
+ The generated HTML will look like this
+
+ (start code xml)
+ <div id="infovis">
+ <div id="infovis-canvaswidget" style="position:relative;">
+ <canvas id="infovis-canvas" width=900 height=500
+ style="position:absolute; top:0; left:0; width:900px; height:500px;" />
+ <div id="infovis-label"
+ style="overflow:visible; position:absolute; top:0; left:0; width:900px; height:0px">
+ </div>
+ </div>
+ </div>
+ (end code)
+
+ As you can see, the generated HTML consists of a canvas DOM Element of id *infovis-canvas* and a div label container
+ of id *infovis-label*, wrapped in a main div container of id *infovis-canvaswidget*.
+ */
+
+var Canvas;
+(function() {
+ //check for native canvas support
+ var canvasType = typeof HTMLCanvasElement,
+ supportsCanvas = (canvasType == 'object' || canvasType == 'function');
+ //create element function
+ function $E(tag, props) {
+ var elem = document.createElement(tag);
+ for(var p in props) {
+ if(typeof props[p] == "object") {
+ $.extend(elem[p], props[p]);
+ } else {
+ elem[p] = props[p];
+ }
+ }
+ if (tag == "canvas" && !supportsCanvas && G_vmlCanvasManager) {
+ elem = G_vmlCanvasManager.initElement(document.body.appendChild(elem));
+ }
+ return elem;
+ }
+ //canvas widget which we will call just Canvas
+ $jit.Canvas = Canvas = new Class({
+ canvases: [],
+ pos: false,
+ element: false,
+ labelContainer: false,
+ translateOffsetX: 0,
+ translateOffsetY: 0,
+ scaleOffsetX: 1,
+ scaleOffsetY: 1,
+
+ initialize: function(viz, opt) {
+ this.viz = viz;
+ this.opt = opt;
+ var id = $.type(opt.injectInto) == 'string'?
+ opt.injectInto:opt.injectInto.id,
+ idLabel = id + "-label",
+ wrapper = $(id),
+ width = opt.width || wrapper.offsetWidth,
+ height = opt.height || wrapper.offsetHeight;
+ this.id = id;
+ //canvas options
+ var canvasOptions = {
+ injectInto: id,
+ width: width,
+ height: height
+ };
+ //create main wrapper
+ this.element = $E('div', {
+ 'id': id + '-canvaswidget',
+ 'style': {
+ 'position': 'relative',
+ 'width': width + 'px',
+ 'height': height + 'px'
+ }
+ });
+ //create label container
+ this.labelContainer = this.createLabelContainer(opt.Label.type,
+ idLabel, canvasOptions);
+ //create primary canvas
+ this.canvases.push(new Canvas.Base({
+ config: $.extend({idSuffix: '-canvas'}, canvasOptions),
+ plot: function(base) {
+ viz.fx.plot();
+ },
+ resize: function() {
+ viz.refresh();
+ }
+ }));
+ //create secondary canvas
+ var back = opt.background;
+ if(back) {
+ var backCanvas = new Canvas.Background[back.type](viz, $.extend(back, canvasOptions));
+ this.canvases.push(new Canvas.Base(backCanvas));
+ }
+ //insert canvases
+ var len = this.canvases.length;
+ while(len--) {
+ this.element.appendChild(this.canvases[len].canvas);
+ if(len > 0) {
+ this.canvases[len].plot();
+ }
+ }
+ this.element.appendChild(this.labelContainer);
+ wrapper.appendChild(this.element);
+ //Update canvas position when the page is scrolled.
+ var timer = null, that = this;
+ $.addEvent(window, 'scroll', function() {
+ clearTimeout(timer);
+ timer = setTimeout(function() {
+ that.getPos(true); //update canvas position
+ }, 500);
+ });
+ },
+ /*
+ Method: getCtx
+
+ Returns the main canvas context object
+
+ Example:
+
+ (start code js)
+ var ctx = canvas.getCtx();
+ //Now I can use the native canvas context
+ //and for example change some canvas styles
+ ctx.globalAlpha = 1;
+ (end code)
+ */
+ getCtx: function(i) {
+ return this.canvases[i || 0].getCtx();
+ },
+ /*
+ Method: getConfig
+
+ Returns the current Configuration for this Canvas Widget.
+
+ Example:
+
+ (start code js)
+ var config = canvas.getConfig();
+ (end code)
+ */
+ getConfig: function() {
+ return this.opt;
+ },
+ /*
+ Method: getElement
+
+ Returns the main Canvas DOM wrapper
+
+ Example:
+
+ (start code js)
+ var wrapper = canvas.getElement();
+ //Returns <div id="infovis-canvaswidget" ... >...</div> as element
+ (end code)
+ */
+ getElement: function() {
+ return this.element;
+ },
+ /*
+ Method: getSize
+
+ Returns canvas dimensions.
+
+ Returns:
+
+ An object with *width* and *height* properties.
+
+ Example:
+ (start code js)
+ canvas.getSize(); //returns { width: 900, height: 500 }
+ (end code)
+ */
+ getSize: function(i) {
+ return this.canvases[i || 0].getSize();
+ },
+ /*
+ Method: resize
+
+ Resizes the canvas.
+
+ Parameters:
+
+ width - New canvas width.
+ height - New canvas height.
+
+ Example:
+
+ (start code js)
+ canvas.resize(width, height);
+ (end code)
+
+ */
+ resize: function(width, height) {
+ this.getPos(true);
+ this.translateOffsetX = this.translateOffsetY = 0;
+ this.scaleOffsetX = this.scaleOffsetY = 1;
+ for(var i=0, l=this.canvases.length; i<l; i++) {
+ this.canvases[i].resize(width, height);
+ }
+ var style = this.element.style;
+ style.width = width + 'px';
+ style.height = height + 'px';
+ if(this.labelContainer)
+ this.labelContainer.style.width = width + 'px';
+ },
+ /*
+ Method: translate
+
+ Applies a translation to the canvas.
+
+ Parameters:
+
+ x - (number) x offset.
+ y - (number) y offset.
+ disablePlot - (boolean) Default's *false*. Set this to *true* if you don't want to refresh the visualization.
+
+ Example:
+
+ (start code js)
+ canvas.translate(30, 30);
+ (end code)
+
+ */
+ translate: function(x, y, disablePlot) {
+ this.translateOffsetX += x*this.scaleOffsetX;
+ this.translateOffsetY += y*this.scaleOffsetY;
+ for(var i=0, l=this.canvases.length; i<l; i++) {
+ this.canvases[i].translate(x, y, disablePlot);
+ }
+ },
+ /*
+ Method: scale
+
+ Scales the canvas.
+
+ Parameters:
+
+ x - (number) scale value.
+ y - (number) scale value.
+ disablePlot - (boolean) Default's *false*. Set this to *true* if you don't want to refresh the visualization.
+
+ Example:
+
+ (start code js)
+ canvas.scale(0.5, 0.5);
+ (end code)
+
+ */
+ scale: function(x, y, disablePlot) {
+ var px = this.scaleOffsetX * x,
+ py = this.scaleOffsetY * y;
+ var dx = this.translateOffsetX * (x -1) / px,
+ dy = this.translateOffsetY * (y -1) / py;
+ this.scaleOffsetX = px;
+ this.scaleOffsetY = py;
+ for(var i=0, l=this.canvases.length; i<l; i++) {
+ this.canvases[i].scale(x, y, true);
+ }
+ this.translate(dx, dy, false);
+ },
+ /*
+ Method: getPos
+
+ Returns the canvas position as an *x, y* object.
+
+ Parameters:
+
+ force - (boolean) Default's *false*. Set this to *true* if you want to recalculate the position without using any cache information.
+
+ Returns:
+
+ An object with *x* and *y* properties.
+
+ Example:
+ (start code js)
+ canvas.getPos(true); //returns { x: 900, y: 500 }
+ (end code)
+ */
+ getPos: function(force){
+ if(force || !this.pos) {
+ return this.pos = $.getPos(this.getElement());
+ }
+ return this.pos;
+ },
+ /*
+ Method: clear
+
+ Clears the canvas.
+ */
+ clear: function(i){
+ this.canvases[i||0].clear();
+ },
+
+ path: function(type, action){
+ var ctx = this.canvases[0].getCtx();
+ ctx.beginPath();
+ action(ctx);
+ ctx[type]();
+ ctx.closePath();
+ },
+
+ createLabelContainer: function(type, idLabel, dim) {
+ var NS = 'http://www.w3.org/2000/svg';
+ if(type == 'HTML' || type == 'Native') {
+ return $E('div', {
+ 'id': idLabel,
+ 'style': {
+ 'overflow': 'visible',
+ 'position': 'absolute',
+ 'top': 0,
+ 'left': 0,
+ 'width': dim.width + 'px',
+ 'height': 0
+ }
+ });
+ } else if(type == 'SVG') {
+ var svgContainer = document.createElementNS(NS, 'svg:svg');
+ svgContainer.setAttribute("width", dim.width);
+ svgContainer.setAttribute('height', dim.height);
+ var style = svgContainer.style;
+ style.position = 'absolute';
+ style.left = style.top = '0px';
+ var labelContainer = document.createElementNS(NS, 'svg:g');
+ labelContainer.setAttribute('width', dim.width);
+ labelContainer.setAttribute('height', dim.height);
+ labelContainer.setAttribute('x', 0);
+ labelContainer.setAttribute('y', 0);
+ labelContainer.setAttribute('id', idLabel);
+ svgContainer.appendChild(labelContainer);
+ return svgContainer;
+ }
+ }
+ });
+ //base canvas wrapper
+ Canvas.Base = new Class({
+ translateOffsetX: 0,
+ translateOffsetY: 0,
+ scaleOffsetX: 1,
+ scaleOffsetY: 1,
+
+ initialize: function(viz) {
+ this.viz = viz;
+ this.opt = viz.config;
+ this.size = false;
+ this.createCanvas();
+ this.translateToCenter();
+ },
+ createCanvas: function() {
+ var opt = this.opt,
+ width = opt.width,
+ height = opt.height;
+ this.canvas = $E('canvas', {
+ 'id': opt.injectInto + opt.idSuffix,
+ 'width': width,
+ 'height': height,
+ 'style': {
+ 'position': 'absolute',
+ 'top': 0,
+ 'left': 0,
+ 'width': width + 'px',
+ 'height': height + 'px'
+ }
+ });
+ },
+ getCtx: function() {
+ if(!this.ctx)
+ return this.ctx = this.canvas.getContext('2d');
+ return this.ctx;
+ },
+ getSize: function() {
+ if(this.size) return this.size;
+ var canvas = this.canvas;
+ return this.size = {
+ width: canvas.width,
+ height: canvas.height
+ };
+ },
+ translateToCenter: function(ps) {
+ var size = this.getSize(),
+ width = ps? (size.width - ps.width - this.translateOffsetX*2) : size.width;
+ height = ps? (size.height - ps.height - this.translateOffsetY*2) : size.height;
+ var ctx = this.getCtx();
+ ps && ctx.scale(1/this.scaleOffsetX, 1/this.scaleOffsetY);
+ ctx.translate(width/2, height/2);
+ },
+ resize: function(width, height) {
+ var size = this.getSize(),
+ canvas = this.canvas,
+ styles = canvas.style;
+ this.size = false;
+ canvas.width = width;
+ canvas.height = height;
+ styles.width = width + "px";
+ styles.height = height + "px";
+ //small ExCanvas fix
+ if(!supportsCanvas) {
+ this.translateToCenter(size);
+ } else {
+ this.translateToCenter();
+ }
+ this.translateOffsetX =
+ this.translateOffsetY = 0;
+ this.scaleOffsetX =
+ this.scaleOffsetY = 1;
+ this.clear();
+ this.viz.resize(width, height, this);
+ },
+ translate: function(x, y, disablePlot) {
+ var sx = this.scaleOffsetX,
+ sy = this.scaleOffsetY;
+ this.translateOffsetX += x*sx;
+ this.translateOffsetY += y*sy;
+ this.getCtx().translate(x, y);
+ !disablePlot && this.plot();
+ },
+ scale: function(x, y, disablePlot) {
+ this.scaleOffsetX *= x;
+ this.scaleOffsetY *= y;
+ this.getCtx().scale(x, y);
+ !disablePlot && this.plot();
+ },
+ clear: function(){
+ var size = this.getSize(),
+ ox = this.translateOffsetX,
+ oy = this.translateOffsetY,
+ sx = this.scaleOffsetX,
+ sy = this.scaleOffsetY;
+ this.getCtx().clearRect((-size.width / 2 - ox) * 1/sx,
+ (-size.height / 2 - oy) * 1/sy,
+ size.width * 1/sx, size.height * 1/sy);
+ },
+ plot: function() {
+ this.clear();
+ this.viz.plot(this);
+ }
+ });
+ //background canvases
+ //TODO(nico): document this!
+ Canvas.Background = {};
+ Canvas.Background.Circles = new Class({
+ initialize: function(viz, options) {
+ this.viz = viz;
+ this.config = $.merge({
+ idSuffix: '-bkcanvas',
+ levelDistance: 100,
+ numberOfCircles: 6,
+ CanvasStyles: {},
+ offset: 0
+ }, options);
+ },
+ resize: function(width, height, base) {
+ this.plot(base);
+ },
+ plot: function(base) {
+ var canvas = base.canvas,
+ ctx = base.getCtx(),
+ conf = this.config,
+ styles = conf.CanvasStyles;
+ //set canvas styles
+ for(var s in styles) ctx[s] = styles[s];
+ var n = conf.numberOfCircles,
+ rho = conf.levelDistance;
+ for(var i=1; i<=n; i++) {
+ ctx.beginPath();
+ ctx.arc(0, 0, rho * i, 0, 2 * Math.PI, false);
+ ctx.stroke();
+ ctx.closePath();
+ }
+ //TODO(nico): print labels too!
+ }
+ });
+})();
+
+
+/*
+ * File: Polar.js
+ *
+ * Defines the <Polar> class.
+ *
+ * Description:
+ *
+ * The <Polar> class, just like the <Complex> class, is used by the <Hypertree>, <ST> and <RGraph> as a 2D point representation.
+ *
+ * See also:
+ *
+ * <http://en.wikipedia.org/wiki/Polar_coordinates>
+ *
+*/
+
+/*
+ Class: Polar
+
+ A multi purpose polar representation.
+
+ Description:
+
+ The <Polar> class, just like the <Complex> class, is used by the <Hypertree>, <ST> and <RGraph> as a 2D point representation.
+
+ See also:
+
+ <http://en.wikipedia.org/wiki/Polar_coordinates>
+
+ Parameters:
+
+ theta - An angle.
+ rho - The norm.
+*/
+
+var Polar = function(theta, rho) {
+ this.theta = theta;
+ this.rho = rho;
+};
+
+$jit.Polar = Polar;
+
+Polar.prototype = {
+ /*
+ Method: getc
+
+ Returns a complex number.
+
+ Parameters:
+
+ simple - _optional_ If *true*, this method will return only an object holding x and y properties and not a <Complex> instance. Default's *false*.
+
+ Returns:
+
+ A complex number.
+ */
+ getc: function(simple) {
+ return this.toComplex(simple);
+ },
+
+ /*
+ Method: getp
+
+ Returns a <Polar> representation.
+
+ Returns:
+
+ A variable in polar coordinates.
+ */
+ getp: function() {
+ return this;
+ },
+
+
+ /*
+ Method: set
+
+ Sets a number.
+
+ Parameters:
+
+ v - A <Complex> or <Polar> instance.
+
+ */
+ set: function(v) {
+ v = v.getp();
+ this.theta = v.theta; this.rho = v.rho;
+ },
+
+ /*
+ Method: setc
+
+ Sets a <Complex> number.
+
+ Parameters:
+
+ x - A <Complex> number real part.
+ y - A <Complex> number imaginary part.
+
+ */
+ setc: function(x, y) {
+ this.rho = Math.sqrt(x * x + y * y);
+ this.theta = Math.atan2(y, x);
+ if(this.theta < 0) this.theta += Math.PI * 2;
+ },
+
+ /*
+ Method: setp
+
+ Sets a polar number.
+
+ Parameters:
+
+ theta - A <Polar> number angle property.
+ rho - A <Polar> number rho property.
+
+ */
+ setp: function(theta, rho) {
+ this.theta = theta;
+ this.rho = rho;
+ },
+
+ /*
+ Method: clone
+
+ Returns a copy of the current object.
+
+ Returns:
+
+ A copy of the real object.
+ */
+ clone: function() {
+ return new Polar(this.theta, this.rho);
+ },
+
+ /*
+ Method: toComplex
+
+ Translates from polar to cartesian coordinates and returns a new <Complex> instance.
+
+ Parameters:
+
+ simple - _optional_ If *true* this method will only return an object with x and y properties (and not the whole <Complex> instance). Default's *false*.
+
+ Returns:
+
+ A new <Complex> instance.
+ */
+ toComplex: function(simple) {
+ var x = Math.cos(this.theta) * this.rho;
+ var y = Math.sin(this.theta) * this.rho;
+ if(simple) return { 'x': x, 'y': y};
+ return new Complex(x, y);
+ },
+
+ /*
+ Method: add
+
+ Adds two <Polar> instances.
+
+ Parameters:
+
+ polar - A <Polar> number.
+
+ Returns:
+
+ A new Polar instance.
+ */
+ add: function(polar) {
+ return new Polar(this.theta + polar.theta, this.rho + polar.rho);
+ },
+
+ /*
+ Method: scale
+
+ Scales a polar norm.
+
+ Parameters:
+
+ number - A scale factor.
+
+ Returns:
+
+ A new Polar instance.
+ */
+ scale: function(number) {
+ return new Polar(this.theta, this.rho * number);
+ },
+
+ /*
+ Method: equals
+
+ Comparison method.
+
+ Returns *true* if the theta and rho properties are equal.
+
+ Parameters:
+
+ c - A <Polar> number.
+
+ Returns:
+
+ *true* if the theta and rho parameters for these objects are equal. *false* otherwise.
+ */
+ equals: function(c) {
+ return this.theta == c.theta && this.rho == c.rho;
+ },
+
+ /*
+ Method: $add
+
+ Adds two <Polar> instances affecting the current object.
+
+ Paramters:
+
+ polar - A <Polar> instance.
+
+ Returns:
+
+ The changed object.
+ */
+ $add: function(polar) {
+ this.theta = this.theta + polar.theta; this.rho += polar.rho;
+ return this;
+ },
+
+ /*
+ Method: $madd
+
+ Adds two <Polar> instances affecting the current object. The resulting theta angle is modulo 2pi.
+
+ Parameters:
+
+ polar - A <Polar> instance.
+
+ Returns:
+
+ The changed object.
+ */
+ $madd: function(polar) {
+ this.theta = (this.theta + polar.theta) % (Math.PI * 2); this.rho += polar.rho;
+ return this;
+ },
+
+
+ /*
+ Method: $scale
+
+ Scales a polar instance affecting the object.
+
+ Parameters:
+
+ number - A scaling factor.
+
+ Returns:
+
+ The changed object.
+ */
+ $scale: function(number) {
+ this.rho *= number;
+ return this;
+ },
+
+ /*
+ Method: interpolate
+
+ Calculates a polar interpolation between two points at a given delta moment.
+
+ Parameters:
+
+ elem - A <Polar> instance.
+ delta - A delta factor ranging [0, 1].
+
+ Returns:
+
+ A new <Polar> instance representing an interpolation between _this_ and _elem_
+ */
+ interpolate: function(elem, delta) {
+ var pi = Math.PI, pi2 = pi * 2;
+ var ch = function(t) {
+ var a = (t < 0)? (t % pi2) + pi2 : t % pi2;
+ return a;
+ };
+ var tt = this.theta, et = elem.theta;
+ var sum, diff = Math.abs(tt - et);
+ if(diff == pi) {
+ if(tt > et) {
+ sum = ch((et + ((tt - pi2) - et) * delta)) ;
+ } else {
+ sum = ch((et - pi2 + (tt - (et)) * delta));
+ }
+ } else if(diff >= pi) {
+ if(tt > et) {
+ sum = ch((et + ((tt - pi2) - et) * delta)) ;
+ } else {
+ sum = ch((et - pi2 + (tt - (et - pi2)) * delta));
+ }
+ } else {
+ sum = ch((et + (tt - et) * delta)) ;
+ }
+ var r = (this.rho - elem.rho) * delta + elem.rho;
+ return {
+ 'theta': sum,
+ 'rho': r
+ };
+ }
+};
+
+
+var $P = function(a, b) { return new Polar(a, b); };
+
+Polar.KER = $P(0, 0);
+
+
+
+/*
+ * File: Complex.js
+ *
+ * Defines the <Complex> class.
+ *
+ * Description:
+ *
+ * The <Complex> class, just like the <Polar> class, is used by the <Hypertree>, <ST> and <RGraph> as a 2D point representation.
+ *
+ * See also:
+ *
+ * <http://en.wikipedia.org/wiki/Complex_number>
+ *
+*/
+
+/*
+ Class: Complex
+
+ A multi-purpose Complex Class with common methods.
+
+ Description:
+
+ The <Complex> class, just like the <Polar> class, is used by the <Hypertree>, <ST> and <RGraph> as a 2D point representation.
+
+ See also:
+
+ <http://en.wikipedia.org/wiki/Complex_number>
+
+ Parameters:
+
+ x - _optional_ A Complex number real part.
+ y - _optional_ A Complex number imaginary part.
+
+*/
+
+var Complex = function(x, y) {
+ this.x = x;
+ this.y = y;
+};
+
+$jit.Complex = Complex;
+
+Complex.prototype = {
+ /*
+ Method: getc
+
+ Returns a complex number.
+
+ Returns:
+
+ A complex number.
+ */
+ getc: function() {
+ return this;
+ },
+
+ /*
+ Method: getp
+
+ Returns a <Polar> representation of this number.
+
+ Parameters:
+
+ simple - _optional_ If *true*, this method will return only an object holding theta and rho properties and not a <Polar> instance. Default's *false*.
+
+ Returns:
+
+ A variable in <Polar> coordinates.
+ */
+ getp: function(simple) {
+ return this.toPolar(simple);
+ },
+
+
+ /*
+ Method: set
+
+ Sets a number.
+
+ Parameters:
+
+ c - A <Complex> or <Polar> instance.
+
+ */
+ set: function(c) {
+ c = c.getc(true);
+ this.x = c.x;
+ this.y = c.y;
+ },
+
+ /*
+ Method: setc
+
+ Sets a complex number.
+
+ Parameters:
+
+ x - A <Complex> number Real part.
+ y - A <Complex> number Imaginary part.
+
+ */
+ setc: function(x, y) {
+ this.x = x;
+ this.y = y;
+ },
+
+ /*
+ Method: setp
+
+ Sets a polar number.
+
+ Parameters:
+
+ theta - A <Polar> number theta property.
+ rho - A <Polar> number rho property.
+
+ */
+ setp: function(theta, rho) {
+ this.x = Math.cos(theta) * rho;
+ this.y = Math.sin(theta) * rho;
+ },
+
+ /*
+ Method: clone
+
+ Returns a copy of the current object.
+
+ Returns:
+
+ A copy of the real object.
+ */
+ clone: function() {
+ return new Complex(this.x, this.y);
+ },
+
+ /*
+ Method: toPolar
+
+ Transforms cartesian to polar coordinates.
+
+ Parameters:
+
+ simple - _optional_ If *true* this method will only return an object with theta and rho properties (and not the whole <Polar> instance). Default's *false*.
+
+ Returns:
+
+ A new <Polar> instance.
+ */
+
+ toPolar: function(simple) {
+ var rho = this.norm();
+ var atan = Math.atan2(this.y, this.x);
+ if(atan < 0) atan += Math.PI * 2;
+ if(simple) return { 'theta': atan, 'rho': rho };
+ return new Polar(atan, rho);
+ },
+ /*
+ Method: norm
+
+ Calculates a <Complex> number norm.
+
+ Returns:
+
+ A real number representing the complex norm.
+ */
+ norm: function () {
+ return Math.sqrt(this.squaredNorm());
+ },
+
+ /*
+ Method: squaredNorm
+
+ Calculates a <Complex> number squared norm.
+
+ Returns:
+
+ A real number representing the complex squared norm.
+ */
+ squaredNorm: function () {
+ return this.x*this.x + this.y*this.y;
+ },
+
+ /*
+ Method: add
+
+ Returns the result of adding two complex numbers.
+
+ Does not alter the original object.
+
+ Parameters:
+
+ pos - A <Complex> instance.
+
+ Returns:
+
+ The result of adding two complex numbers.
+ */
+ add: function(pos) {
+ return new Complex(this.x + pos.x, this.y + pos.y);
+ },
+
+ /*
+ Method: prod
+
+ Returns the result of multiplying two <Complex> numbers.
+
+ Does not alter the original object.
+
+ Parameters:
+
+ pos - A <Complex> instance.
+
+ Returns:
+
+ The result of multiplying two complex numbers.
+ */
+ prod: function(pos) {
+ return new Complex(this.x*pos.x - this.y*pos.y, this.y*pos.x + this.x*pos.y);
+ },
+
+ /*
+ Method: conjugate
+
+ Returns the conjugate of this <Complex> number.
+
+ Does not alter the original object.
+
+ Returns:
+
+ The conjugate of this <Complex> number.
+ */
+ conjugate: function() {
+ return new Complex(this.x, -this.y);
+ },
+
+
+ /*
+ Method: scale
+
+ Returns the result of scaling a <Complex> instance.
+
+ Does not alter the original object.
+
+ Parameters:
+
+ factor - A scale factor.
+
+ Returns:
+
+ The result of scaling this complex to a factor.
+ */
+ scale: function(factor) {
+ return new Complex(this.x * factor, this.y * factor);
+ },
+
+ /*
+ Method: equals
+
+ Comparison method.
+
+ Returns *true* if both real and imaginary parts are equal.
+
+ Parameters:
+
+ c - A <Complex> instance.
+
+ Returns:
+
+ A boolean instance indicating if both <Complex> numbers are equal.
+ */
+ equals: function(c) {
+ return this.x == c.x && this.y == c.y;
+ },
+
+ /*
+ Method: $add
+
+ Returns the result of adding two <Complex> numbers.
+
+ Alters the original object.
+
+ Parameters:
+
+ pos - A <Complex> instance.
+
+ Returns:
+
+ The result of adding two complex numbers.
+ */
+ $add: function(pos) {
+ this.x += pos.x; this.y += pos.y;
+ return this;
+ },
+
+ /*
+ Method: $prod
+
+ Returns the result of multiplying two <Complex> numbers.
+
+ Alters the original object.
+
+ Parameters:
+
+ pos - A <Complex> instance.
+
+ Returns:
+
+ The result of multiplying two complex numbers.
+ */
+ $prod:function(pos) {
+ var x = this.x, y = this.y;
+ this.x = x*pos.x - y*pos.y;
+ this.y = y*pos.x + x*pos.y;
+ return this;
+ },
+
+ /*
+ Method: $conjugate
+
+ Returns the conjugate for this <Complex>.
+
+ Alters the original object.
+
+ Returns:
+
+ The conjugate for this complex.
+ */
+ $conjugate: function() {
+ this.y = -this.y;
+ return this;
+ },
+
+ /*
+ Method: $scale
+
+ Returns the result of scaling a <Complex> instance.
+
+ Alters the original object.
+
+ Parameters:
+
+ factor - A scale factor.
+
+ Returns:
+
+ The result of scaling this complex to a factor.
+ */
+ $scale: function(factor) {
+ this.x *= factor; this.y *= factor;
+ return this;
+ },
+
+ /*
+ Method: $div
+
+ Returns the division of two <Complex> numbers.
+
+ Alters the original object.
+
+ Parameters:
+
+ pos - A <Complex> number.
+
+ Returns:
+
+ The result of scaling this complex to a factor.
+ */
+ $div: function(pos) {
+ var x = this.x, y = this.y;
+ var sq = pos.squaredNorm();
+ this.x = x * pos.x + y * pos.y; this.y = y * pos.x - x * pos.y;
+ return this.$scale(1 / sq);
+ }
+};
+
+var $C = function(a, b) { return new Complex(a, b); };
+
+Complex.KER = $C(0, 0);
+
+
+
+/*
+ * File: Graph.js
+ *
+*/
+
+/*
+ Class: Graph
+
+ A Graph Class that provides useful manipulation functions. You can find more manipulation methods in the <Graph.Util> object.
+
+ An instance of this class can be accessed by using the *graph* parameter of any tree or graph visualization.
+
+ Example:
+
+ (start code js)
+ //create new visualization
+ var viz = new $jit.Viz(options);
+ //load JSON data
+ viz.loadJSON(json);
+ //access model
+ viz.graph; //<Graph> instance
+ (end code)
+
+ Implements:
+
+ The following <Graph.Util> methods are implemented in <Graph>
+
+ - <Graph.Util.getNode>
+ - <Graph.Util.eachNode>
+ - <Graph.Util.computeLevels>
+ - <Graph.Util.eachBFS>
+ - <Graph.Util.clean>
+ - <Graph.Util.getClosestNodeToPos>
+ - <Graph.Util.getClosestNodeToOrigin>
+
+*/
+
+$jit.Graph = new Class({
+
+ initialize: function(opt, Node, Edge, Label) {
+ var innerOptions = {
+ 'complex': false,
+ 'Node': {}
+ };
+ this.Node = Node;
+ this.Edge = Edge;
+ this.Label = Label;
+ this.opt = $.merge(innerOptions, opt || {});
+ this.nodes = {};
+ this.edges = {};
+
+ //add nodeList methods
+ var that = this;
+ this.nodeList = {};
+ for(var p in Accessors) {
+ that.nodeList[p] = (function(p) {
+ return function() {
+ var args = Array.prototype.slice.call(arguments);
+ that.eachNode(function(n) {
+ n[p].apply(n, args);
+ });
+ };
+ })(p);
+ }
+
+ },
+
+/*
+ Method: getNode
+
+ Returns a <Graph.Node> by *id*.
+
+ Parameters:
+
+ id - (string) A <Graph.Node> id.
+
+ Example:
+
+ (start code js)
+ var node = graph.getNode('nodeId');
+ (end code)
+*/
+ getNode: function(id) {
+ if(this.hasNode(id)) return this.nodes[id];
+ return false;
+ },
+
+ /*
+ Method: getByName
+
+ Returns a <Graph.Node> by *name*.
+
+ Parameters:
+
+ name - (string) A <Graph.Node> name.
+
+ Example:
+
+ (start code js)
+ var node = graph.getByName('someName');
+ (end code)
+ */
+ getByName: function(name) {
+ for(var id in this.nodes) {
+ var n = this.nodes[id];
+ if(n.name == name) return n;
+ }
+ return false;
+ },
+
+/*
+ Method: getAdjacence
+
+ Returns a <Graph.Adjacence> object connecting nodes with ids *id* and *id2*.
+
+ Parameters:
+
+ id - (string) A <Graph.Node> id.
+ id2 - (string) A <Graph.Node> id.
+*/
+ getAdjacence: function (id, id2) {
+ if(id in this.edges) {
+ return this.edges[id][id2];
+ }
+ return false;
+ },
+
+ /*
+ Method: addNode
+
+ Adds a node.
+
+ Parameters:
+
+ obj - An object with the properties described below
+
+ id - (string) A node id
+ name - (string) A node's name
+ data - (object) A node's data hash
+
+ See also:
+ <Graph.Node>
+
+ */
+ addNode: function(obj) {
+ if(!this.nodes[obj.id]) {
+ var edges = this.edges[obj.id] = {};
+ this.nodes[obj.id] = new Graph.Node($.extend({
+ 'id': obj.id,
+ 'name': obj.name,
+ 'data': $.merge(obj.data || {}, {}),
+ 'adjacencies': edges
+ }, this.opt.Node),
+ this.opt.complex,
+ this.Node,
+ this.Edge,
+ this.Label);
+ }
+ return this.nodes[obj.id];
+ },
+
+ /*
+ Method: addAdjacence
+
+ Connects nodes specified by *obj* and *obj2*. If not found, nodes are created.
+
+ Parameters:
+
+ obj - (object) A <Graph.Node> object.
+ obj2 - (object) Another <Graph.Node> object.
+ data - (object) A data object. Used to store some extra information in the <Graph.Adjacence> object created.
+
+ See also:
+
+ <Graph.Node>, <Graph.Adjacence>
+ */
+ addAdjacence: function (obj, obj2, data) {
+ if(!this.hasNode(obj.id)) { this.addNode(obj); }
+ if(!this.hasNode(obj2.id)) { this.addNode(obj2); }
+ obj = this.nodes[obj.id]; obj2 = this.nodes[obj2.id];
+ if(!obj.adjacentTo(obj2)) {
+ var adjsObj = this.edges[obj.id] = this.edges[obj.id] || {};
+ var adjsObj2 = this.edges[obj2.id] = this.edges[obj2.id] || {};
+ adjsObj[obj2.id] = adjsObj2[obj.id] = new Graph.Adjacence(obj, obj2, data, this.Edge, this.Label);
+ return adjsObj[obj2.id];
+ }
+ return this.edges[obj.id][obj2.id];
+ },
+
+ /*
+ Method: removeNode
+
+ Removes a <Graph.Node> matching the specified *id*.
+
+ Parameters:
+
+ id - (string) A node's id.
+
+ */
+ removeNode: function(id) {
+ if(this.hasNode(id)) {
+ delete this.nodes[id];
+ var adjs = this.edges[id];
+ for(var to in adjs) {
+ delete this.edges[to][id];
+ }
+ delete this.edges[id];
+ }
+ },
+
+/*
+ Method: removeAdjacence
+
+ Removes a <Graph.Adjacence> matching *id1* and *id2*.
+
+ Parameters:
+
+ id1 - (string) A <Graph.Node> id.
+ id2 - (string) A <Graph.Node> id.
+*/
+ removeAdjacence: function(id1, id2) {
+ delete this.edges[id1][id2];
+ delete this.edges[id2][id1];
+ },
+
+ /*
+ Method: hasNode
+
+ Returns a boolean indicating if the node belongs to the <Graph> or not.
+
+ Parameters:
+
+ id - (string) Node id.
+ */
+ hasNode: function(id) {
+ return id in this.nodes;
+ },
+
+ /*
+ Method: empty
+
+ Empties the Graph
+
+ */
+ empty: function() { this.nodes = {}; this.edges = {};}
+
+});
+
+var Graph = $jit.Graph;
+
+/*
+ Object: Accessors
+
+ Defines a set of methods for data, canvas and label styles manipulation implemented by <Graph.Node> and <Graph.Adjacence> instances.
+
+ */
+var Accessors;
+
+(function () {
+ var getDataInternal = function(prefix, prop, type, force, prefixConfig) {
+ var data;
+ type = type || 'current';
+ prefix = "$" + (prefix ? prefix + "-" : "");
+
+ if(type == 'current') {
+ data = this.data;
+ } else if(type == 'start') {
+ data = this.startData;
+ } else if(type == 'end') {
+ data = this.endData;
+ }
+
+ var dollar = prefix + prop;
+
+ if(force) {
+ return data[dollar];
+ }
+
+ if(!this.Config.overridable)
+ return prefixConfig[prop] || 0;
+
+ return (dollar in data) ?
+ data[dollar] : ((dollar in this.data) ? this.data[dollar] : (prefixConfig[prop] || 0));
+ }
+
+ var setDataInternal = function(prefix, prop, value, type) {
+ type = type || 'current';
+ prefix = '$' + (prefix ? prefix + '-' : '');
+
+ var data;
+
+ if(type == 'current') {
+ data = this.data;
+ } else if(type == 'start') {
+ data = this.startData;
+ } else if(type == 'end') {
+ data = this.endData;
+ }
+
+ data[prefix + prop] = value;
+ }
+
+ var removeDataInternal = function(prefix, properties) {
+ prefix = '$' + (prefix ? prefix + '-' : '');
+ var that = this;
+ $.each(properties, function(prop) {
+ var pref = prefix + prop;
+ delete that.data[pref];
+ delete that.endData[pref];
+ delete that.startData[pref];
+ });
+ }
+
+ Accessors = {
+ /*
+ Method: getData
+
+ Returns the specified data value property.
+ This is useful for querying special/reserved <Graph.Node> data properties
+ (i.e dollar prefixed properties).
+
+ Parameters:
+
+ prop - (string) The name of the property. The dollar sign is not needed. For
+ example *getData(width)* will return *data.$width*.
+ type - (string) The type of the data property queried. Default's "current". You can access *start* and *end*
+ data properties also. These properties are used when making animations.
+ force - (boolean) Whether to obtain the true value of the property (equivalent to
+ *data.$prop*) or to check for *node.overridable = true* first.
+
+ Returns:
+
+ The value of the dollar prefixed property or the global Node/Edge property
+ value if *overridable=false*
+
+ Example:
+ (start code js)
+ node.getData('width'); //will return node.data.$width if Node.overridable=true;
+ (end code)
+ */
+ getData: function(prop, type, force) {
+ return getDataInternal.call(this, "", prop, type, force, this.Config);
+ },
+
+
+ /*
+ Method: setData
+
+ Sets the current data property with some specific value.
+ This method is only useful for reserved (dollar prefixed) properties.
+
+ Parameters:
+
+ prop - (string) The name of the property. The dollar sign is not necessary. For
+ example *setData(width)* will set *data.$width*.
+ value - (mixed) The value to store.
+ type - (string) The type of the data property to store. Default's "current" but
+ can also be "start" or "end".
+
+ Example:
+
+ (start code js)
+ node.setData('width', 30);
+ (end code)
+
+ If we were to make an animation of a node/edge width then we could do
+
+ (start code js)
+ var node = viz.getNode('nodeId');
+ //set start and end values
+ node.setData('width', 10, 'start');
+ node.setData('width', 30, 'end');
+ //will animate nodes width property
+ viz.fx.animate({
+ modes: ['node-property:width'],
+ duration: 1000
+ });
+ (end code)
+ */
+ setData: function(prop, value, type) {
+ setDataInternal.call(this, "", prop, value, type);
+ },
+
+ /*
+ Method: setDataset
+
+ Convenience method to set multiple data values at once.
+
+ Parameters:
+
+ types - (array|string) A set of 'current', 'end' or 'start' values.
+ obj - (object) A hash containing the names and values of the properties to be altered.
+
+ Example:
+ (start code js)
+ node.setDataset(['current', 'end'], {
+ 'width': [100, 5],
+ 'color': ['#fff', '#ccc']
+ });
+ //...or also
+ node.setDataset('end', {
+ 'width': 5,
+ 'color': '#ccc'
+ });
+ (end code)
+
+ See also:
+
+ <Accessors.setData>
+
+ */
+ setDataset: function(types, obj) {
+ types = $.splat(types);
+ for(var attr in obj) {
+ for(var i=0, val = $.splat(obj[attr]), l=types.length; i<l; i++) {
+ this.setData(attr, val[i], types[i]);
+ }
+ }
+ },
+
+ /*
+ Method: removeData
+
+ Remove data properties.
+
+ Parameters:
+
+ One or more property names as arguments. The dollar sign is not needed.
+
+ Example:
+ (start code js)
+ node.removeData('width'); //now the default width value is returned
+ (end code)
+ */
+ removeData: function() {
+ removeDataInternal.call(this, "", Array.prototype.slice.call(arguments));
+ },
+
+ /*
+ Method: getCanvasStyle
+
+ Returns the specified canvas style data value property. This is useful for
+ querying special/reserved <Graph.Node> canvas style data properties (i.e.
+ dollar prefixed properties that match with $canvas-<name of canvas style>).
+
+ Parameters:
+
+ prop - (string) The name of the property. The dollar sign is not needed. For
+ example *getCanvasStyle(shadowBlur)* will return *data[$canvas-shadowBlur]*.
+ type - (string) The type of the data property queried. Default's *current*. You can access *start* and *end*
+ data properties also.
+
+ Example:
+ (start code js)
+ node.getCanvasStyle('shadowBlur');
+ (end code)
+
+ See also:
+
+ <Accessors.getData>
+ */
+ getCanvasStyle: function(prop, type, force) {
+ return getDataInternal.call(
+ this, 'canvas', prop, type, force, this.Config.CanvasStyles);
+ },
+
+ /*
+ Method: setCanvasStyle
+
+ Sets the canvas style data property with some specific value.
+ This method is only useful for reserved (dollar prefixed) properties.
+
+ Parameters:
+
+ prop - (string) Name of the property. Can be any canvas property like 'shadowBlur', 'shadowColor', 'strokeStyle', etc.
+ value - (mixed) The value to set to the property.
+ type - (string) Default's *current*. Whether to set *start*, *current* or *end* type properties.
+
+ Example:
+
+ (start code js)
+ node.setCanvasStyle('shadowBlur', 30);
+ (end code)
+
+ If we were to make an animation of a node/edge shadowBlur canvas style then we could do
+
+ (start code js)
+ var node = viz.getNode('nodeId');
+ //set start and end values
+ node.setCanvasStyle('shadowBlur', 10, 'start');
+ node.setCanvasStyle('shadowBlur', 30, 'end');
+ //will animate nodes canvas style property for nodes
+ viz.fx.animate({
+ modes: ['node-style:shadowBlur'],
+ duration: 1000
+ });
+ (end code)
+
+ See also:
+
+ <Accessors.setData>.
+ */
+ setCanvasStyle: function(prop, value, type) {
+ setDataInternal.call(this, 'canvas', prop, value, type);
+ },
+
+ /*
+ Method: setCanvasStyles
+
+ Convenience method to set multiple styles at once.
+
+ Parameters:
+
+ types - (array|string) A set of 'current', 'end' or 'start' values.
+ obj - (object) A hash containing the names and values of the properties to be altered.
+
+ See also:
+
+ <Accessors.setDataset>.
+ */
+ setCanvasStyles: function(types, obj) {
+ types = $.splat(types);
+ for(var attr in obj) {
+ for(var i=0, val = $.splat(obj[attr]), l=types.length; i<l; i++) {
+ this.setCanvasStyle(attr, val[i], types[i]);
+ }
+ }
+ },
+
+ /*
+ Method: removeCanvasStyle
+
+ Remove canvas style properties from data.
+
+ Parameters:
+
+ A variable number of canvas style strings.
+
+ See also:
+
+ <Accessors.removeData>.
+ */
+ removeCanvasStyle: function() {
+ removeDataInternal.call(this, 'canvas', Array.prototype.slice.call(arguments));
+ },
+
+ /*
+ Method: getLabelData
+
+ Returns the specified label data value property. This is useful for
+ querying special/reserved <Graph.Node> label options (i.e.
+ dollar prefixed properties that match with $label-<name of label style>).
+
+ Parameters:
+
+ prop - (string) The name of the property. The dollar sign prefix is not needed. For
+ example *getLabelData(size)* will return *data[$label-size]*.
+ type - (string) The type of the data property queried. Default's *current*. You can access *start* and *end*
+ data properties also.
+
+ See also:
+
+ <Accessors.getData>.
+ */
+ getLabelData: function(prop, type, force) {
+ return getDataInternal.call(
+ this, 'label', prop, type, force, this.Label);
+ },
+
+ /*
+ Method: setLabelData
+
+ Sets the current label data with some specific value.
+ This method is only useful for reserved (dollar prefixed) properties.
+
+ Parameters:
+
+ prop - (string) Name of the property. Can be any canvas property like 'shadowBlur', 'shadowColor', 'strokeStyle', etc.
+ value - (mixed) The value to set to the property.
+ type - (string) Default's *current*. Whether to set *start*, *current* or *end* type properties.
+
+ Example:
+
+ (start code js)
+ node.setLabelData('size', 30);
+ (end code)
+
+ If we were to make an animation of a node label size then we could do
+
+ (start code js)
+ var node = viz.getNode('nodeId');
+ //set start and end values
+ node.setLabelData('size', 10, 'start');
+ node.setLabelData('size', 30, 'end');
+ //will animate nodes label size
+ viz.fx.animate({
+ modes: ['label-property:size'],
+ duration: 1000
+ });
+ (end code)
+
+ See also:
+
+ <Accessors.setData>.
+ */
+ setLabelData: function(prop, value, type) {
+ setDataInternal.call(this, 'label', prop, value, type);
+ },
+
+ /*
+ Method: setLabelDataset
+
+ Convenience function to set multiple label data at once.
+
+ Parameters:
+
+ types - (array|string) A set of 'current', 'end' or 'start' values.
+ obj - (object) A hash containing the names and values of the properties to be altered.
+
+ See also:
+
+ <Accessors.setDataset>.
+ */
+ setLabelDataset: function(types, obj) {
+ types = $.splat(types);
+ for(var attr in obj) {
+ for(var i=0, val = $.splat(obj[attr]), l=types.length; i<l; i++) {
+ this.setLabelData(attr, val[i], types[i]);
+ }
+ }
+ },
+
+ /*
+ Method: removeLabelData
+
+ Remove label properties from data.
+
+ Parameters:
+
+ A variable number of label property strings.
+
+ See also:
+
+ <Accessors.removeData>.
+ */
+ removeLabelData: function() {
+ removeDataInternal.call(this, 'label', Array.prototype.slice.call(arguments));
+ }
+ };
+})();
+
+/*
+ Class: Graph.Node
+
+ A <Graph> node.
+
+ Implements:
+
+ <Accessors> methods.
+
+ The following <Graph.Util> methods are implemented by <Graph.Node>
+
+ - <Graph.Util.eachAdjacency>
+ - <Graph.Util.eachLevel>
+ - <Graph.Util.eachSubgraph>
+ - <Graph.Util.eachSubnode>
+ - <Graph.Util.anySubnode>
+ - <Graph.Util.getSubnodes>
+ - <Graph.Util.getParents>
+ - <Graph.Util.isDescendantOf>
+*/
+Graph.Node = new Class({
+
+ initialize: function(opt, complex, Node, Edge, Label) {
+ var innerOptions = {
+ 'id': '',
+ 'name': '',
+ 'data': {},
+ 'startData': {},
+ 'endData': {},
+ 'adjacencies': {},
+
+ 'selected': false,
+ 'drawn': false,
+ 'exist': false,
+
+ 'angleSpan': {
+ 'begin': 0,
+ 'end' : 0
+ },
+
+ 'pos': (complex && $C(0, 0)) || $P(0, 0),
+ 'startPos': (complex && $C(0, 0)) || $P(0, 0),
+ 'endPos': (complex && $C(0, 0)) || $P(0, 0)
+ };
+
+ $.extend(this, $.extend(innerOptions, opt));
+ this.Config = this.Node = Node;
+ this.Edge = Edge;
+ this.Label = Label;
+ },
+
+ /*
+ Method: adjacentTo
+
+ Indicates if the node is adjacent to the node specified by id
+
+ Parameters:
+
+ id - (string) A node id.
+
+ Example:
+ (start code js)
+ node.adjacentTo('nodeId') == true;
+ (end code)
+ */
+ adjacentTo: function(node) {
+ return node.id in this.adjacencies;
+ },
+
+ /*
+ Method: getAdjacency
+
+ Returns a <Graph.Adjacence> object connecting the current <Graph.Node> and the node having *id* as id.
+
+ Parameters:
+
+ id - (string) A node id.
+ */
+ getAdjacency: function(id) {
+ return this.adjacencies[id];
+ },
+
+ /*
+ Method: getPos
+
+ Returns the position of the node.
+
+ Parameters:
+
+ type - (string) Default's *current*. Possible values are "start", "end" or "current".
+
+ Returns:
+
+ A <Complex> or <Polar> instance.
+
+ Example:
+ (start code js)
+ var pos = node.getPos('end');
+ (end code)
+ */
+ getPos: function(type) {
+ type = type || "current";
+ if(type == "current") {
+ return this.pos;
+ } else if(type == "end") {
+ return this.endPos;
+ } else if(type == "start") {
+ return this.startPos;
+ }
+ },
+ /*
+ Method: setPos
+
+ Sets the node's position.
+
+ Parameters:
+
+ value - (object) A <Complex> or <Polar> instance.
+ type - (string) Default's *current*. Possible values are "start", "end" or "current".
+
+ Example:
+ (start code js)
+ node.setPos(new $jit.Complex(0, 0), 'end');
+ (end code)
+ */
+ setPos: function(value, type) {
+ type = type || "current";
+ var pos;
+ if(type == "current") {
+ pos = this.pos;
+ } else if(type == "end") {
+ pos = this.endPos;
+ } else if(type == "start") {
+ pos = this.startPos;
+ }
+ pos.set(value);
+ }
+});
+
+Graph.Node.implement(Accessors);
+
+/*
+ Class: Graph.Adjacence
+
+ A <Graph> adjacence (or edge) connecting two <Graph.Nodes>.
+
+ Implements:
+
+ <Accessors> methods.
+
+ See also:
+
+ <Graph>, <Graph.Node>
+
+ Properties:
+
+ nodeFrom - A <Graph.Node> connected by this edge.
+ nodeTo - Another <Graph.Node> connected by this edge.
+ data - Node data property containing a hash (i.e {}) with custom options.
+*/
+Graph.Adjacence = new Class({
+
+ initialize: function(nodeFrom, nodeTo, data, Edge, Label) {
+ this.nodeFrom = nodeFrom;
+ this.nodeTo = nodeTo;
+ this.data = data || {};
+ this.startData = {};
+ this.endData = {};
+ this.Config = this.Edge = Edge;
+ this.Label = Label;
+ }
+});
+
+Graph.Adjacence.implement(Accessors);
+
+/*
+ Object: Graph.Util
+
+ <Graph> traversal and processing utility object.
+
+ Note:
+
+ For your convenience some of these methods have also been appended to <Graph> and <Graph.Node> classes.
+*/
+Graph.Util = {
+ /*
+ filter
+
+ For internal use only. Provides a filtering function based on flags.
+ */
+ filter: function(param) {
+ if(!param || !($.type(param) == 'string')) return function() { return true; };
+ var props = param.split(" ");
+ return function(elem) {
+ for(var i=0; i<props.length; i++) {
+ if(elem[props[i]]) {
+ return false;
+ }
+ }
+ return true;
+ };
+ },
+ /*
+ Method: getNode
+
+ Returns a <Graph.Node> by *id*.
+
+ Also implemented by:
+
+ <Graph>
+
+ Parameters:
+
+ graph - (object) A <Graph> instance.
+ id - (string) A <Graph.Node> id.
+
+ Example:
+
+ (start code js)
+ $jit.Graph.Util.getNode(graph, 'nodeid');
+ //or...
+ graph.getNode('nodeid');
+ (end code)
+ */
+ getNode: function(graph, id) {
+ return graph.nodes[id];
+ },
+
+ /*
+ Method: eachNode
+
+ Iterates over <Graph> nodes performing an *action*.
+
+ Also implemented by:
+
+ <Graph>.
+
+ Parameters:
+
+ graph - (object) A <Graph> instance.
+ action - (function) A callback function having a <Graph.Node> as first formal parameter.
+
+ Example:
+ (start code js)
+ $jit.Graph.Util.eachNode(graph, function(node) {
+ alert(node.name);
+ });
+ //or...
+ graph.eachNode(function(node) {
+ alert(node.name);
+ });
+ (end code)
+ */
+ eachNode: function(graph, action, flags) {
+ var filter = this.filter(flags);
+ for(var i in graph.nodes) {
+ if(filter(graph.nodes[i])) action(graph.nodes[i]);
+ }
+ },
+
+ /*
+ Method: eachAdjacency
+
+ Iterates over <Graph.Node> adjacencies applying the *action* function.
+
+ Also implemented by:
+
+ <Graph.Node>.
+
+ Parameters:
+
+ node - (object) A <Graph.Node>.
+ action - (function) A callback function having <Graph.Adjacence> as first formal parameter.
+
+ Example:
+ (start code js)
+ $jit.Graph.Util.eachAdjacency(node, function(adj) {
+ alert(adj.nodeTo.name);
+ });
+ //or...
+ node.eachAdjacency(function(adj) {
+ alert(adj.nodeTo.name);
+ });
+ (end code)
+ */
+ eachAdjacency: function(node, action, flags) {
+ var adj = node.adjacencies, filter = this.filter(flags);
+ for(var id in adj) {
+ var a = adj[id];
+ if(filter(a)) {
+ if(a.nodeFrom != node) {
+ var tmp = a.nodeFrom;
+ a.nodeFrom = a.nodeTo;
+ a.nodeTo = tmp;
+ }
+ action(a, id);
+ }
+ }
+ },
+
+ /*
+ Method: computeLevels
+
+ Performs a BFS traversal setting the correct depth for each node.
+
+ Also implemented by:
+
+ <Graph>.
+
+ Note:
+
+ The depth of each node can then be accessed by
+ >node._depth
+
+ Parameters:
+
+ graph - (object) A <Graph>.
+ id - (string) A starting node id for the BFS traversal.
+ startDepth - (optional|number) A minimum depth value. Default's 0.
+
+ */
+ computeLevels: function(graph, id, startDepth, flags) {
+ startDepth = startDepth || 0;
+ var filter = this.filter(flags);
+ this.eachNode(graph, function(elem) {
+ elem._flag = false;
+ elem._depth = -1;
+ }, flags);
+ var root = graph.getNode(id);
+ root._depth = startDepth;
+ var queue = [root];
+ while(queue.length != 0) {
+ var node = queue.pop();
+ node._flag = true;
+ this.eachAdjacency(node, function(adj) {
+ var n = adj.nodeTo;
+ if(n._flag == false && filter(n)) {
+ if(n._depth < 0) n._depth = node._depth + 1 + startDepth;
+ queue.unshift(n);
+ }
+ }, flags);
+ }
+ },
+
+ /*
+ Method: eachBFS
+
+ Performs a BFS traversal applying *action* to each <Graph.Node>.
+
+ Also implemented by:
+
+ <Graph>.
+
+ Parameters:
+
+ graph - (object) A <Graph>.
+ id - (string) A starting node id for the BFS traversal.
+ action - (function) A callback function having a <Graph.Node> as first formal parameter.
+
+ Example:
+ (start code js)
+ $jit.Graph.Util.eachBFS(graph, 'mynodeid', function(node) {
+ alert(node.name);
+ });
+ //or...
+ graph.eachBFS('mynodeid', function(node) {
+ alert(node.name);
+ });
+ (end code)
+ */
+ eachBFS: function(graph, id, action, flags) {
+ var filter = this.filter(flags);
+ this.clean(graph);
+ var queue = [graph.getNode(id)];
+ while(queue.length != 0) {
+ var node = queue.pop();
+ node._flag = true;
+ action(node, node._depth);
+ this.eachAdjacency(node, function(adj) {
+ var n = adj.nodeTo;
+ if(n._flag == false && filter(n)) {
+ n._flag = true;
+ queue.unshift(n);
+ }
+ }, flags);
+ }
+ },
+
+ /*
+ Method: eachLevel
+
+ Iterates over a node's subgraph applying *action* to the nodes of relative depth between *levelBegin* and *levelEnd*.
+
+ Also implemented by:
+
+ <Graph.Node>.
+
+ Parameters:
+
+ node - (object) A <Graph.Node>.
+ levelBegin - (number) A relative level value.
+ levelEnd - (number) A relative level value.
+ action - (function) A callback function having a <Graph.Node> as first formal parameter.
+
+ */
+ eachLevel: function(node, levelBegin, levelEnd, action, flags) {
+ var d = node._depth, filter = this.filter(flags), that = this;
+ levelEnd = levelEnd === false? Number.MAX_VALUE -d : levelEnd;
+ (function loopLevel(node, levelBegin, levelEnd) {
+ var d = node._depth;
+ if(d >= levelBegin && d <= levelEnd && filter(node)) action(node, d);
+ if(d < levelEnd) {
+ that.eachAdjacency(node, function(adj) {
+ var n = adj.nodeTo;
+ if(n._depth > d) loopLevel(n, levelBegin, levelEnd);
+ });
+ }
+ })(node, levelBegin + d, levelEnd + d);
+ },
+
+ /*
+ Method: eachSubgraph
+
+ Iterates over a node's children recursively.
+
+ Also implemented by:
+
+ <Graph.Node>.
+
+ Parameters:
+ node - (object) A <Graph.Node>.
+ action - (function) A callback function having a <Graph.Node> as first formal parameter.
+
+ Example:
+ (start code js)
+ $jit.Graph.Util.eachSubgraph(node, function(node) {
+ alert(node.name);
+ });
+ //or...
+ node.eachSubgraph(function(node) {
+ alert(node.name);
+ });
+ (end code)
+ */
+ eachSubgraph: function(node, action, flags) {
+ this.eachLevel(node, 0, false, action, flags);
+ },
+
+ /*
+ Method: eachSubnode
+
+ Iterates over a node's children (without deeper recursion).
+
+ Also implemented by:
+
+ <Graph.Node>.
+
+ Parameters:
+ node - (object) A <Graph.Node>.
+ action - (function) A callback function having a <Graph.Node> as first formal parameter.
+
+ Example:
+ (start code js)
+ $jit.Graph.Util.eachSubnode(node, function(node) {
+ alert(node.name);
+ });
+ //or...
+ node.eachSubnode(function(node) {
+ alert(node.name);
+ });
+ (end code)
+ */
+ eachSubnode: function(node, action, flags) {
+ this.eachLevel(node, 1, 1, action, flags);
+ },
+
+ /*
+ Method: anySubnode
+
+ Returns *true* if any subnode matches the given condition.
+
+ Also implemented by:
+
+ <Graph.Node>.
+
+ Parameters:
+ node - (object) A <Graph.Node>.
+ cond - (function) A callback function returning a Boolean instance. This function has as first formal parameter a <Graph.Node>.
+
+ Example:
+ (start code js)
+ $jit.Graph.Util.anySubnode(node, function(node) { return node.name == "mynodename"; });
+ //or...
+ node.anySubnode(function(node) { return node.name == 'mynodename'; });
+ (end code)
+ */
+ anySubnode: function(node, cond, flags) {
+ var flag = false;
+ cond = cond || $.lambda(true);
+ var c = $.type(cond) == 'string'? function(n) { return n[cond]; } : cond;
+ this.eachSubnode(node, function(elem) {
+ if(c(elem)) flag = true;
+ }, flags);
+ return flag;
+ },
+
+ /*
+ Method: getSubnodes
+
+ Collects all subnodes for a specified node.
+ The *level* parameter filters nodes having relative depth of *level* from the root node.
+
+ Also implemented by:
+
+ <Graph.Node>.
+
+ Parameters:
+ node - (object) A <Graph.Node>.
+ level - (optional|number) Default's *0*. A starting relative depth for collecting nodes.
+
+ Returns:
+ An array of nodes.
+
+ */
+ getSubnodes: function(node, level, flags) {
+ var ans = [], that = this;
+ level = level || 0;
+ var levelStart, levelEnd;
+ if($.type(level) == 'array') {
+ levelStart = level[0];
+ levelEnd = level[1];
+ } else {
+ levelStart = level;
+ levelEnd = Number.MAX_VALUE - node._depth;
+ }
+ this.eachLevel(node, levelStart, levelEnd, function(n) {
+ ans.push(n);
+ }, flags);
+ return ans;
+ },
+
+
+ /*
+ Method: getParents
+
+ Returns an Array of <Graph.Nodes> which are parents of the given node.
+
+ Also implemented by:
+
+ <Graph.Node>.
+
+ Parameters:
+ node - (object) A <Graph.Node>.
+
+ Returns:
+ An Array of <Graph.Nodes>.
+
+ Example:
+ (start code js)
+ var pars = $jit.Graph.Util.getParents(node);
+ //or...
+ var pars = node.getParents();
+
+ if(pars.length > 0) {
+ //do stuff with parents
+ }
+ (end code)
+ */
+ getParents: function(node) {
+ var ans = [];
+ this.eachAdjacency(node, function(adj) {
+ var n = adj.nodeTo;
+ if(n._depth < node._depth) ans.push(n);
+ });
+ return ans;
+ },
+
+ /*
+ Method: isDescendantOf
+
+ Returns a boolean indicating if some node is descendant of the node with the given id.
+
+ Also implemented by:
+
+ <Graph.Node>.
+
+
+ Parameters:
+ node - (object) A <Graph.Node>.
+ id - (string) A <Graph.Node> id.
+
+ Example:
+ (start code js)
+ $jit.Graph.Util.isDescendantOf(node, "nodeid"); //true|false
+ //or...
+ node.isDescendantOf('nodeid');//true|false
+ (end code)
+ */
+ isDescendantOf: function(node, id) {
+ if(node.id == id) return true;
+ var pars = this.getParents(node), ans = false;
+ for ( var i = 0; !ans && i < pars.length; i++) {
+ ans = ans || this.isDescendantOf(pars[i], id);
+ }
+ return ans;
+ },
+
+ /*
+ Method: clean
+
+ Cleans flags from nodes.
+
+ Also implemented by:
+
+ <Graph>.
+
+ Parameters:
+ graph - A <Graph> instance.
+ */
+ clean: function(graph) { this.eachNode(graph, function(elem) { elem._flag = false; }); },
+
+ /*
+ Method: getClosestNodeToOrigin
+
+ Returns the closest node to the center of canvas.
+
+ Also implemented by:
+
+ <Graph>.
+
+ Parameters:
+
+ graph - (object) A <Graph> instance.
+ prop - (optional|string) Default's 'current'. A <Graph.Node> position property. Possible properties are 'start', 'current' or 'end'.
+
+ */
+ getClosestNodeToOrigin: function(graph, prop, flags) {
+ return this.getClosestNodeToPos(graph, Polar.KER, prop, flags);
+ },
+
+ /*
+ Method: getClosestNodeToPos
+
+ Returns the closest node to the given position.
+
+ Also implemented by:
+
+ <Graph>.
+
+ Parameters:
+
+ graph - (object) A <Graph> instance.
+ pos - (object) A <Complex> or <Polar> instance.
+ prop - (optional|string) Default's *current*. A <Graph.Node> position property. Possible properties are 'start', 'current' or 'end'.
+
+ */
+ getClosestNodeToPos: function(graph, pos, prop, flags) {
+ var node = null;
+ prop = prop || 'current';
+ pos = pos && pos.getc(true) || Complex.KER;
+ var distance = function(a, b) {
+ var d1 = a.x - b.x, d2 = a.y - b.y;
+ return d1 * d1 + d2 * d2;
+ };
+ this.eachNode(graph, function(elem) {
+ node = (node == null || distance(elem.getPos(prop).getc(true), pos) < distance(
+ node.getPos(prop).getc(true), pos)) ? elem : node;
+ }, flags);
+ return node;
+ }
+};
+
+//Append graph methods to <Graph>
+$.each(['getNode', 'eachNode', 'computeLevels', 'eachBFS', 'clean', 'getClosestNodeToPos', 'getClosestNodeToOrigin'], function(m) {
+ Graph.prototype[m] = function() {
+ return Graph.Util[m].apply(Graph.Util, [this].concat(Array.prototype.slice.call(arguments)));
+ };
+});
+
+//Append node methods to <Graph.Node>
+$.each(['eachAdjacency', 'eachLevel', 'eachSubgraph', 'eachSubnode', 'anySubnode', 'getSubnodes', 'getParents', 'isDescendantOf'], function(m) {
+ Graph.Node.prototype[m] = function() {
+ return Graph.Util[m].apply(Graph.Util, [this].concat(Array.prototype.slice.call(arguments)));
+ };
+});
+
+/*
+ * File: Graph.Op.js
+ *
+*/
+
+/*
+ Object: Graph.Op
+
+ Perform <Graph> operations like adding/removing <Graph.Nodes> or <Graph.Adjacences>,
+ morphing a <Graph> into another <Graph>, contracting or expanding subtrees, etc.
+
+*/
+Graph.Op = {
+
+ options: {
+ type: 'nothing',
+ duration: 2000,
+ hideLabels: true,
+ fps:30
+ },
+
+ initialize: function(viz) {
+ this.viz = viz;
+ },
+
+ /*
+ Method: removeNode
+
+ Removes one or more <Graph.Nodes> from the visualization.
+ It can also perform several animations like fading sequentially, fading concurrently, iterating or replotting.
+
+ Parameters:
+
+ node - (string|array) The node's id. Can also be an array having many ids.
+ opt - (object) Animation options. It's an object with optional properties described below
+ type - (string) Default's *nothing*. Type of the animation. Can be "nothing", "replot", "fade:seq", "fade:con" or "iter".
+ duration - Described in <Options.Fx>.
+ fps - Described in <Options.Fx>.
+ transition - Described in <Options.Fx>.
+ hideLabels - (boolean) Default's *true*. Hide labels during the animation.
+
+ Example:
+ (start code js)
+ var viz = new $jit.Viz(options);
+ viz.op.removeNode('nodeId', {
+ type: 'fade:seq',
+ duration: 1000,
+ hideLabels: false,
+ transition: $jit.Trans.Quart.easeOut
+ });
+ //or also
+ viz.op.removeNode(['someId', 'otherId'], {
+ type: 'fade:con',
+ duration: 1500
+ });
+ (end code)
+ */
+
+ removeNode: function(node, opt) {
+ var viz = this.viz;
+ var options = $.merge(this.options, viz.controller, opt);
+ var n = $.splat(node);
+ var i, that, nodeObj;
+ switch(options.type) {
+ case 'nothing':
+ for(i=0; i<n.length; i++) viz.graph.removeNode(n[i]);
+ break;
+
+ case 'replot':
+ this.removeNode(n, { type: 'nothing' });
+ viz.labels.clearLabels();
+ viz.refresh(true);
+ break;
+
+ case 'fade:seq': case 'fade':
+ that = this;
+ //set alpha to 0 for nodes to remove.
+ for(i=0; i<n.length; i++) {
+ nodeObj = viz.graph.getNode(n[i]);
+ nodeObj.setData('alpha', 0, 'end');
+ }
+ viz.fx.animate($.merge(options, {
+ modes: ['node-property:alpha'],
+ onComplete: function() {
+ that.removeNode(n, { type: 'nothing' });
+ viz.labels.clearLabels();
+ viz.reposition();
+ viz.fx.animate($.merge(options, {
+ modes: ['linear']
+ }));
+ }
+ }));
+ break;
+
+ case 'fade:con':
+ that = this;
+ //set alpha to 0 for nodes to remove. Tag them for being ignored on computing positions.
+ for(i=0; i<n.length; i++) {
+ nodeObj = viz.graph.getNode(n[i]);
+ nodeObj.setData('alpha', 0, 'end');
+ nodeObj.ignore = true;
+ }
+ viz.reposition();
+ viz.fx.animate($.merge(options, {
+ modes: ['node-property:alpha', 'linear'],
+ onComplete: function() {
+ that.removeNode(n, { type: 'nothing' });
+ }
+ }));
+ break;
+
+ case 'iter':
+ that = this;
+ viz.fx.sequence({
+ condition: function() { return n.length != 0; },
+ step: function() { that.removeNode(n.shift(), { type: 'nothing' }); viz.labels.clearLabels(); },
+ onComplete: function() { options.onComplete(); },
+ duration: Math.ceil(options.duration / n.length)
+ });
+ break;
+
+ default: this.doError();
+ }
+ },
+
+ /*
+ Method: removeEdge
+
+ Removes one or more <Graph.Adjacences> from the visualization.
+ It can also perform several animations like fading sequentially, fading concurrently, iterating or replotting.
+
+ Parameters:
+
+ vertex - (array) An array having two strings which are the ids of the nodes connected by this edge (i.e ['id1', 'id2']). Can also be a two dimensional array holding many edges (i.e [['id1', 'id2'], ['id3', 'id4'], ...]).
+ opt - (object) Animation options. It's an object with optional properties described below
+ type - (string) Default's *nothing*. Type of the animation. Can be "nothing", "replot", "fade:seq", "fade:con" or "iter".
+ duration - Described in <Options.Fx>.
+ fps - Described in <Options.Fx>.
+ transition - Described in <Options.Fx>.
+ hideLabels - (boolean) Default's *true*. Hide labels during the animation.
+
+ Example:
+ (start code js)
+ var viz = new $jit.Viz(options);
+ viz.op.removeEdge(['nodeId', 'otherId'], {
+ type: 'fade:seq',
+ duration: 1000,
+ hideLabels: false,
+ transition: $jit.Trans.Quart.easeOut
+ });
+ //or also
+ viz.op.removeEdge([['someId', 'otherId'], ['id3', 'id4']], {
+ type: 'fade:con',
+ duration: 1500
+ });
+ (end code)
+
+ */
+ removeEdge: function(vertex, opt) {
+ var viz = this.viz;
+ var options = $.merge(this.options, viz.controller, opt);
+ var v = ($.type(vertex[0]) == 'string')? [vertex] : vertex;
+ var i, that, adj;
+ switch(options.type) {
+ case 'nothing':
+ for(i=0; i<v.length; i++) viz.graph.removeAdjacence(v[i][0], v[i][1]);
+ break;
+
+ case 'replot':
+ this.removeEdge(v, { type: 'nothing' });
+ viz.refresh(true);
+ break;
+
+ case 'fade:seq': case 'fade':
+ that = this;
+ //set alpha to 0 for edges to remove.
+ for(i=0; i<v.length; i++) {
+ adj = viz.graph.getAdjacence(v[i][0], v[i][1]);
+ if(adj) {
+ adj.setData('alpha', 0,'end');
+ }
+ }
+ viz.fx.animate($.merge(options, {
+ modes: ['edge-property:alpha'],
+ onComplete: function() {
+ that.removeEdge(v, { type: 'nothing' });
+ viz.reposition();
+ viz.fx.animate($.merge(options, {
+ modes: ['linear']
+ }));
+ }
+ }));
+ break;
+
+ case 'fade:con':
+ that = this;
+ //set alpha to 0 for nodes to remove. Tag them for being ignored when computing positions.
+ for(i=0; i<v.length; i++) {
+ adj = viz.graph.getAdjacence(v[i][0], v[i][1]);
+ if(adj) {
+ adj.setData('alpha',0 ,'end');
+ adj.ignore = true;
+ }
+ }
+ viz.reposition();
+ viz.fx.animate($.merge(options, {
+ modes: ['edge-property:alpha', 'linear'],
+ onComplete: function() {
+ that.removeEdge(v, { type: 'nothing' });
+ }
+ }));
+ break;
+
+ case 'iter':
+ that = this;
+ viz.fx.sequence({
+ condition: function() { return v.length != 0; },
+ step: function() { that.removeEdge(v.shift(), { type: 'nothing' }); viz.labels.clearLabels(); },
+ onComplete: function() { options.onComplete(); },
+ duration: Math.ceil(options.duration / v.length)
+ });
+ break;
+
+ default: this.doError();
+ }
+ },
+
+ /*
+ Method: sum
+
+ Adds a new graph to the visualization.
+ The JSON graph (or tree) must at least have a common node with the current graph plotted by the visualization.
+ The resulting graph can be defined as follows <http://mathworld.wolfram.com/GraphSum.html>
+
+ Parameters:
+
+ json - (object) A json tree or graph structure. See also <Loader.loadJSON>.
+ opt - (object) Animation options. It's an object with optional properties described below
+ type - (string) Default's *nothing*. Type of the animation. Can be "nothing", "replot", "fade:seq", "fade:con".
+ duration - Described in <Options.Fx>.
+ fps - Described in <Options.Fx>.
+ transition - Described in <Options.Fx>.
+ hideLabels - (boolean) Default's *true*. Hide labels during the animation.
+
+ Example:
+ (start code js)
+ //...json contains a tree or graph structure...
+
+ var viz = new $jit.Viz(options);
+ viz.op.sum(json, {
+ type: 'fade:seq',
+ duration: 1000,
+ hideLabels: false,
+ transition: $jit.Trans.Quart.easeOut
+ });
+ //or also
+ viz.op.sum(json, {
+ type: 'fade:con',
+ duration: 1500
+ });
+ (end code)
+
+ */
+ sum: function(json, opt) {
+ var viz = this.viz;
+ var options = $.merge(this.options, viz.controller, opt), root = viz.root;
+ var graph;
+ viz.root = opt.id || viz.root;
+ switch(options.type) {
+ case 'nothing':
+ graph = viz.construct(json);
+ graph.eachNode(function(elem) {
+ elem.eachAdjacency(function(adj) {
+ viz.graph.addAdjacence(adj.nodeFrom, adj.nodeTo, adj.data);
+ });
+ });
+ break;
+
+ case 'replot':
+ viz.refresh(true);
+ this.sum(json, { type: 'nothing' });
+ viz.refresh(true);
+ break;
+
+ case 'fade:seq': case 'fade': case 'fade:con':
+ that = this;
+ graph = viz.construct(json);
+
+ //set alpha to 0 for nodes to add.
+ var fadeEdges = this.preprocessSum(graph);
+ var modes = !fadeEdges? ['node-property:alpha'] : ['node-property:alpha', 'edge-property:alpha'];
+ viz.reposition();
+ if(options.type != 'fade:con') {
+ viz.fx.animate($.merge(options, {
+ modes: ['linear'],
+ onComplete: function() {
+ viz.fx.animate($.merge(options, {
+ modes: modes,
+ onComplete: function() {
+ options.onComplete();
+ }
+ }));
+ }
+ }));
+ } else {
+ viz.graph.eachNode(function(elem) {
+ if (elem.id != root && elem.pos.getp().equals(Polar.KER)) {
+ elem.pos.set(elem.endPos); elem.startPos.set(elem.endPos);
+ }
+ });
+ viz.fx.animate($.merge(options, {
+ modes: ['linear'].concat(modes)
+ }));
+ }
+ break;
+
+ default: this.doError();
+ }
+ },
+
+ /*
+ Method: morph
+
+ This method will transform the current visualized graph into the new JSON representation passed in the method.
+ The JSON object must at least have the root node in common with the current visualized graph.
+
+ Parameters:
+
+ json - (object) A json tree or graph structure. See also <Loader.loadJSON>.
+ opt - (object) Animation options. It's an object with optional properties described below
+ type - (string) Default's *nothing*. Type of the animation. Can be "nothing", "replot", "fade:con".
+ duration - Described in <Options.Fx>.
+ fps - Described in <Options.Fx>.
+ transition - Described in <Options.Fx>.
+ hideLabels - (boolean) Default's *true*. Hide labels during the animation.
+ id - (string) The shared <Graph.Node> id between both graphs.
+
+ extraModes - (optional|object) When morphing with an animation, dollar prefixed data parameters are added to
+ *endData* and not *data* itself. This way you can animate dollar prefixed parameters during your morphing operation.
+ For animating these extra-parameters you have to specify an object that has animation groups as keys and animation
+ properties as values, just like specified in <Graph.Plot.animate>.
+
+ Example:
+ (start code js)
+ //...json contains a tree or graph structure...
+
+ var viz = new $jit.Viz(options);
+ viz.op.morph(json, {
+ type: 'fade',
+ duration: 1000,
+ hideLabels: false,
+ transition: $jit.Trans.Quart.easeOut
+ });
+ //or also
+ viz.op.morph(json, {
+ type: 'fade',
+ duration: 1500
+ });
+ //if the json data contains dollar prefixed params
+ //like $width or $height these too can be animated
+ viz.op.morph(json, {
+ type: 'fade',
+ duration: 1500
+ }, {
+ 'node-property': ['width', 'height']
+ });
+ (end code)
+
+ */
+ morph: function(json, opt, extraModes) {
+ var viz = this.viz;
+ var options = $.merge(this.options, viz.controller, opt), root = viz.root;
+ var graph;
+ //TODO(nico) this hack makes morphing work with the Hypertree.
+ //Need to check if it has been solved and this can be removed.
+ viz.root = opt.id || viz.root;
+ switch(options.type) {
+ case 'nothing':
+ graph = viz.construct(json);
+ graph.eachNode(function(elem) {
+ var nodeExists = viz.graph.hasNode(elem.id);
+ elem.eachAdjacency(function(adj) {
+ var adjExists = !!viz.graph.getAdjacence(adj.nodeFrom.id, adj.nodeTo.id);
+ viz.graph.addAdjacence(adj.nodeFrom, adj.nodeTo, adj.data);
+ //Update data properties if the node existed
+ if(adjExists) {
+ var addedAdj = viz.graph.getAdjacence(adj.nodeFrom.id, adj.nodeTo.id);
+ for(var prop in (adj.data || {})) {
+ addedAdj.data[prop] = adj.data[prop];
+ }
+ }
+ });
+ //Update data properties if the node existed
+ if(nodeExists) {
+ var addedNode = viz.graph.getNode(elem.id);
+ for(var prop in (elem.data || {})) {
+ addedNode.data[prop] = elem.data[prop];
+ }
+ }
+ });
+ viz.graph.eachNode(function(elem) {
+ elem.eachAdjacency(function(adj) {
+ if(!graph.getAdjacence(adj.nodeFrom.id, adj.nodeTo.id)) {
+ viz.graph.removeAdjacence(adj.nodeFrom.id, adj.nodeTo.id);
+ }
+ });
+ if(!graph.hasNode(elem.id)) viz.graph.removeNode(elem.id);
+ });
+
+ break;
+
+ case 'replot':
+ viz.labels.clearLabels(true);
+ this.morph(json, { type: 'nothing' });
+ viz.refresh(true);
+ viz.refresh(true);
+ break;
+
+ case 'fade:seq': case 'fade': case 'fade:con':
+ that = this;
+ graph = viz.construct(json);
+ //preprocessing for nodes to delete.
+ //get node property modes to interpolate
+ var nodeModes = extraModes && ('node-property' in extraModes)
+ && $.map($.splat(extraModes['node-property']),
+ function(n) { return '$' + n; });
+ viz.graph.eachNode(function(elem) {
+ var graphNode = graph.getNode(elem.id);
+ if(!graphNode) {
+ elem.setData('alpha', 1);
+ elem.setData('alpha', 1, 'start');
+ elem.setData('alpha', 0, 'end');
+ elem.ignore = true;
+ } else {
+ //Update node data information
+ var graphNodeData = graphNode.data;
+ for(var prop in graphNodeData) {
+ if(nodeModes && ($.indexOf(nodeModes, prop) > -1)) {
+ elem.endData[prop] = graphNodeData[prop];
+ } else {
+ elem.data[prop] = graphNodeData[prop];
+ }
+ }
+ }
+ });
+ viz.graph.eachNode(function(elem) {
+ if(elem.ignore) return;
+ elem.eachAdjacency(function(adj) {
+ if(adj.nodeFrom.ignore || adj.nodeTo.ignore) return;
+ var nodeFrom = graph.getNode(adj.nodeFrom.id);
+ var nodeTo = graph.getNode(adj.nodeTo.id);
+ if(!nodeFrom.adjacentTo(nodeTo)) {
+ var adj = viz.graph.getAdjacence(nodeFrom.id, nodeTo.id);
+ fadeEdges = true;
+ adj.setData('alpha', 1);
+ adj.setData('alpha', 1, 'start');
+ adj.setData('alpha', 0, 'end');
+ }
+ });
+ });
+ //preprocessing for adding nodes.
+ var fadeEdges = this.preprocessSum(graph);
+
+ var modes = !fadeEdges? ['node-property:alpha'] :
+ ['node-property:alpha',
+ 'edge-property:alpha'];
+ //Append extra node-property animations (if any)
+ modes[0] = modes[0] + ((extraModes && ('node-property' in extraModes))?
+ (':' + $.splat(extraModes['node-property']).join(':')) : '');
+ //Append extra edge-property animations (if any)
+ modes[1] = (modes[1] || 'edge-property:alpha') + ((extraModes && ('edge-property' in extraModes))?
+ (':' + $.splat(extraModes['edge-property']).join(':')) : '');
+ //Add label-property animations (if any)
+ if(extraModes && ('label-property' in extraModes)) {
+ modes.push('label-property:' + $.splat(extraModes['label-property']).join(':'))
+ }
+ viz.reposition();
+ viz.graph.eachNode(function(elem) {
+ if (elem.id != root && elem.pos.getp().equals(Polar.KER)) {
+ elem.pos.set(elem.endPos); elem.startPos.set(elem.endPos);
+ }
+ });
+ viz.fx.animate($.merge(options, {
+ modes: ['polar'].concat(modes),
+ onComplete: function() {
+ viz.graph.eachNode(function(elem) {
+ if(elem.ignore) viz.graph.removeNode(elem.id);
+ });
+ viz.graph.eachNode(function(elem) {
+ elem.eachAdjacency(function(adj) {
+ if(adj.ignore) viz.graph.removeAdjacence(adj.nodeFrom.id, adj.nodeTo.id);
+ });
+ });
+ options.onComplete();
+ }
+ }));
+ break;
+
+ default:;
+ }
+ },
+
+
+ /*
+ Method: contract
+
+ Collapses the subtree of the given node. The node will have a _collapsed=true_ property.
+
+ Parameters:
+
+ node - (object) A <Graph.Node>.
+ opt - (object) An object containing options described below
+ type - (string) Whether to 'replot' or 'animate' the contraction.
+
+ There are also a number of Animation options. For more information see <Options.Fx>.
+
+ Example:
+ (start code js)
+ var viz = new $jit.Viz(options);
+ viz.op.contract(node, {
+ type: 'animate',
+ duration: 1000,
+ hideLabels: true,
+ transition: $jit.Trans.Quart.easeOut
+ });
+ (end code)
+
+ */
+ contract: function(node, opt) {
+ var viz = this.viz;
+ if(node.collapsed || !node.anySubnode($.lambda(true))) return;
+ opt = $.merge(this.options, viz.config, opt || {}, {
+ 'modes': ['node-property:alpha:span', 'linear']
+ });
+ node.collapsed = true;
+ (function subn(n) {
+ n.eachSubnode(function(ch) {
+ ch.ignore = true;
+ ch.setData('alpha', 0, opt.type == 'animate'? 'end' : 'current');
+ subn(ch);
+ });
+ })(node);
+ if(opt.type == 'animate') {
+ viz.compute('end');
+ if(viz.rotated) {
+ viz.rotate(viz.rotated, 'none', {
+ 'property':'end'
+ });
+ }
+ (function subn(n) {
+ n.eachSubnode(function(ch) {
+ ch.setPos(node.getPos('end'), 'end');
+ subn(ch);
+ });
+ })(node);
+ viz.fx.animate(opt);
+ } else if(opt.type == 'replot'){
+ viz.refresh();
+ }
+ },
+
+ /*
+ Method: expand
+
+ Expands the previously contracted subtree. The given node must have the _collapsed=true_ property.
+
+ Parameters:
+
+ node - (object) A <Graph.Node>.
+ opt - (object) An object containing options described below
+ type - (string) Whether to 'replot' or 'animate'.
+
+ There are also a number of Animation options. For more information see <Options.Fx>.
+
+ Example:
+ (start code js)
+ var viz = new $jit.Viz(options);
+ viz.op.expand(node, {
+ type: 'animate',
+ duration: 1000,
+ hideLabels: true,
+ transition: $jit.Trans.Quart.easeOut
+ });
+ (end code)
+
+ */
+ expand: function(node, opt) {
+ if(!('collapsed' in node)) return;
+ var viz = this.viz;
+ opt = $.merge(this.options, viz.config, opt || {}, {
+ 'modes': ['node-property:alpha:span', 'linear']
+ });
+ delete node.collapsed;
+ (function subn(n) {
+ n.eachSubnode(function(ch) {
+ delete ch.ignore;
+ ch.setData('alpha', 1, opt.type == 'animate'? 'end' : 'current');
+ subn(ch);
+ });
+ })(node);
+ if(opt.type == 'animate') {
+ viz.compute('end');
+ if(viz.rotated) {
+ viz.rotate(viz.rotated, 'none', {
+ 'property':'end'
+ });
+ }
+ viz.fx.animate(opt);
+ } else if(opt.type == 'replot'){
+ viz.refresh();
+ }
+ },
+
+ preprocessSum: function(graph) {
+ var viz = this.viz;
+ graph.eachNode(function(elem) {
+ if(!viz.graph.hasNode(elem.id)) {
+ viz.graph.addNode(elem);
+ var n = viz.graph.getNode(elem.id);
+ n.setData('alpha', 0);
+ n.setData('alpha', 0, 'start');
+ n.setData('alpha', 1, 'end');
+ }
+ });
+ var fadeEdges = false;
+ graph.eachNode(function(elem) {
+ elem.eachAdjacency(function(adj) {
+ var nodeFrom = viz.graph.getNode(adj.nodeFrom.id);
+ var nodeTo = viz.graph.getNode(adj.nodeTo.id);
+ if(!nodeFrom.adjacentTo(nodeTo)) {
+ var adj = viz.graph.addAdjacence(nodeFrom, nodeTo, adj.data);
+ if(nodeFrom.startAlpha == nodeFrom.endAlpha
+ && nodeTo.startAlpha == nodeTo.endAlpha) {
+ fadeEdges = true;
+ adj.setData('alpha', 0);
+ adj.setData('alpha', 0, 'start');
+ adj.setData('alpha', 1, 'end');
+ }
+ }
+ });
+ });
+ return fadeEdges;
+ }
+};
+
+
+
+/*
+ File: Helpers.js
+
+ Helpers are objects that contain rendering primitives (like rectangles, ellipses, etc), for plotting nodes and edges.
+ Helpers also contain implementations of the *contains* method, a method returning a boolean indicating whether the mouse
+ position is over the rendered shape.
+
+ Helpers are very useful when implementing new NodeTypes, since you can access them through *this.nodeHelper* and
+ *this.edgeHelper* <Graph.Plot> properties, providing you with simple primitives and mouse-position check functions.
+
+ Example:
+ (start code js)
+ //implement a new node type
+ $jit.Viz.Plot.NodeTypes.implement({
+ 'customNodeType': {
+ 'render': function(node, canvas) {
+ this.nodeHelper.circle.render ...
+ },
+ 'contains': function(node, pos) {
+ this.nodeHelper.circle.contains ...
+ }
+ }
+ });
+ //implement an edge type
+ $jit.Viz.Plot.EdgeTypes.implement({
+ 'customNodeType': {
+ 'render': function(node, canvas) {
+ this.edgeHelper.circle.render ...
+ },
+ //optional
+ 'contains': function(node, pos) {
+ this.edgeHelper.circle.contains ...
+ }
+ }
+ });
+ (end code)
+
+*/
+
+/*
+ Object: NodeHelper
+
+ Contains rendering and other type of primitives for simple shapes.
+ */
+var NodeHelper = {
+ 'none': {
+ 'render': $.empty,
+ 'contains': $.lambda(false)
+ },
+ /*
+ Object: NodeHelper.circle
+ */
+ 'circle': {
+ /*
+ Method: render
+
+ Renders a circle into the canvas.
+
+ Parameters:
+
+ type - (string) Possible options are 'fill' or 'stroke'.
+ pos - (object) An *x*, *y* object with the position of the center of the circle.
+ radius - (number) The radius of the circle to be rendered.
+ canvas - (object) A <Canvas> instance.
+
+ Example:
+ (start code js)
+ NodeHelper.circle.render('fill', { x: 10, y: 30 }, 30, viz.canvas);
+ (end code)
+ */
+ 'render': function(type, pos, radius, canvas){
+ var ctx = canvas.getCtx();
+ ctx.beginPath();
+ ctx.arc(pos.x, pos.y, radius, 0, Math.PI * 2, true);
+ ctx.closePath();
+ ctx[type]();
+ },
+ /*
+ Method: contains
+
+ Returns *true* if *pos* is contained in the area of the shape. Returns *false* otherwise.
+
+ Parameters:
+
+ npos - (object) An *x*, *y* object with the <Graph.Node> position.
+ pos - (object) An *x*, *y* object with the position to check.
+ radius - (number) The radius of the rendered circle.
+
+ Example:
+ (start code js)
+ NodeHelper.circle.contains({ x: 10, y: 30 }, { x: 15, y: 35 }, 30); //true
+ (end code)
+ */
+ 'contains': function(npos, pos, radius){
+ var diffx = npos.x - pos.x,
+ diffy = npos.y - pos.y,
+ diff = diffx * diffx + diffy * diffy;
+ return diff <= radius * radius;
+ }
+ },
+ /*
+ Object: NodeHelper.ellipse
+ */
+ 'ellipse': {
+ /*
+ Method: render
+
+ Renders an ellipse into the canvas.
+
+ Parameters:
+
+ type - (string) Possible options are 'fill' or 'stroke'.
+ pos - (object) An *x*, *y* object with the position of the center of the ellipse.
+ width - (number) The width of the ellipse.
+ height - (number) The height of the ellipse.
+ canvas - (object) A <Canvas> instance.
+
+ Example:
+ (start code js)
+ NodeHelper.ellipse.render('fill', { x: 10, y: 30 }, 30, 40, viz.canvas);
+ (end code)
+ */
+ 'render': function(type, pos, width, height, canvas){
+ var ctx = canvas.getCtx();
+ height /= 2;
+ width /= 2;
+ ctx.save();
+ ctx.scale(width / height, height / width);
+ ctx.beginPath();
+ ctx.arc(pos.x * (height / width), pos.y * (width / height), height, 0,
+ Math.PI * 2, true);
+ ctx.closePath();
+ ctx[type]();
+ ctx.restore();
+ },
+ /*
+ Method: contains
+
+ Returns *true* if *pos* is contained in the area of the shape. Returns *false* otherwise.
+
+ Parameters:
+
+ npos - (object) An *x*, *y* object with the <Graph.Node> position.
+ pos - (object) An *x*, *y* object with the position to check.
+ width - (number) The width of the rendered ellipse.
+ height - (number) The height of the rendered ellipse.
+
+ Example:
+ (start code js)
+ NodeHelper.ellipse.contains({ x: 10, y: 30 }, { x: 15, y: 35 }, 30, 40);
+ (end code)
+ */
+ 'contains': function(npos, pos, width, height){
+ // TODO(nico): be more precise...
+ width /= 2;
+ height /= 2;
+ var dist = (width + height) / 2,
+ diffx = npos.x - pos.x,
+ diffy = npos.y - pos.y,
+ diff = diffx * diffx + diffy * diffy;
+ return diff <= dist * dist;
+ }
+ },
+ /*
+ Object: NodeHelper.square
+ */
+ 'square': {
+ /*
+ Method: render
+
+ Renders a square into the canvas.
+
+ Parameters:
+
+ type - (string) Possible options are 'fill' or 'stroke'.
+ pos - (object) An *x*, *y* object with the position of the center of the square.
+ dim - (number) The radius (or half-diameter) of the square.
+ canvas - (object) A <Canvas> instance.
+
+ Example:
+ (start code js)
+ NodeHelper.square.render('stroke', { x: 10, y: 30 }, 40, viz.canvas);
+ (end code)
+ */
+ 'render': function(type, pos, dim, canvas){
+ canvas.getCtx()[type + "Rect"](pos.x - dim, pos.y - dim, 2*dim, 2*dim);
+ },
+ /*
+ Method: contains
+
+ Returns *true* if *pos* is contained in the area of the shape. Returns *false* otherwise.
+
+ Parameters:
+
+ npos - (object) An *x*, *y* object with the <Graph.Node> position.
+ pos - (object) An *x*, *y* object with the position to check.
+ dim - (number) The radius (or half-diameter) of the square.
+
+ Example:
+ (start code js)
+ NodeHelper.square.contains({ x: 10, y: 30 }, { x: 15, y: 35 }, 30);
+ (end code)
+ */
+ 'contains': function(npos, pos, dim){
+ return Math.abs(pos.x - npos.x) <= dim && Math.abs(pos.y - npos.y) <= dim;
+ }
+ },
+ /*
+ Object: NodeHelper.rectangle
+ */
+ 'rectangle': {
+ /*
+ Method: render
+
+ Renders a rectangle into the canvas.
+
+ Parameters:
+
+ type - (string) Possible options are 'fill' or 'stroke'.
+ pos - (object) An *x*, *y* object with the position of the center of the rectangle.
+ width - (number) The width of the rectangle.
+ height - (number) The height of the rectangle.
+ canvas - (object) A <Canvas> instance.
+
+ Example:
+ (start code js)
+ NodeHelper.rectangle.render('fill', { x: 10, y: 30 }, 30, 40, viz.canvas);
+ (end code)
+ */
+ 'render': function(type, pos, width, height, canvas){
+ canvas.getCtx()[type + "Rect"](pos.x - width / 2, pos.y - height / 2,
+ width, height);
+ },
+ /*
+ Method: contains
+
+ Returns *true* if *pos* is contained in the area of the shape. Returns *false* otherwise.
+
+ Parameters:
+
+ npos - (object) An *x*, *y* object with the <Graph.Node> position.
+ pos - (object) An *x*, *y* object with the position to check.
+ width - (number) The width of the rendered rectangle.
+ height - (number) The height of the rendered rectangle.
+
+ Example:
+ (start code js)
+ NodeHelper.rectangle.contains({ x: 10, y: 30 }, { x: 15, y: 35 }, 30, 40);
+ (end code)
+ */
+ 'contains': function(npos, pos, width, height){
+ return Math.abs(pos.x - npos.x) <= width / 2
+ && Math.abs(pos.y - npos.y) <= height / 2;
+ }
+ },
+ /*
+ Object: NodeHelper.triangle
+ */
+ 'triangle': {
+ /*
+ Method: render
+
+ Renders a triangle into the canvas.
+
+ Parameters:
+
+ type - (string) Possible options are 'fill' or 'stroke'.
+ pos - (object) An *x*, *y* object with the position of the center of the triangle.
+ dim - (number) The dimension of the triangle.
+ canvas - (object) A <Canvas> instance.
+
+ Example:
+ (start code js)
+ NodeHelper.triangle.render('stroke', { x: 10, y: 30 }, 40, viz.canvas);
+ (end code)
+ */
+ 'render': function(type, pos, dim, canvas){
+ var ctx = canvas.getCtx(),
+ c1x = pos.x,
+ c1y = pos.y - dim,
+ c2x = c1x - dim,
+ c2y = pos.y + dim,
+ c3x = c1x + dim,
+ c3y = c2y;
+ ctx.beginPath();
+ ctx.moveTo(c1x, c1y);
+ ctx.lineTo(c2x, c2y);
+ ctx.lineTo(c3x, c3y);
+ ctx.closePath();
+ ctx[type]();
+ },
+ /*
+ Method: contains
+
+ Returns *true* if *pos* is contained in the area of the shape. Returns *false* otherwise.
+
+ Parameters:
+
+ npos - (object) An *x*, *y* object with the <Graph.Node> position.
+ pos - (object) An *x*, *y* object with the position to check.
+ dim - (number) The dimension of the shape.
+
+ Example:
+ (start code js)
+ NodeHelper.triangle.contains({ x: 10, y: 30 }, { x: 15, y: 35 }, 30);
+ (end code)
+ */
+ 'contains': function(npos, pos, dim) {
+ return NodeHelper.circle.contains(npos, pos, dim);
+ }
+ },
+ /*
+ Object: NodeHelper.star
+ */
+ 'star': {
+ /*
+ Method: render
+
+ Renders a star into the canvas.
+
+ Parameters:
+
+ type - (string) Possible options are 'fill' or 'stroke'.
+ pos - (object) An *x*, *y* object with the position of the center of the star.
+ dim - (number) The dimension of the star.
+ canvas - (object) A <Canvas> instance.
+
+ Example:
+ (start code js)
+ NodeHelper.star.render('stroke', { x: 10, y: 30 }, 40, viz.canvas);
+ (end code)
+ */
+ 'render': function(type, pos, dim, canvas){
+ var ctx = canvas.getCtx(),
+ pi5 = Math.PI / 5;
+ ctx.save();
+ ctx.translate(pos.x, pos.y);
+ ctx.beginPath();
+ ctx.moveTo(dim, 0);
+ for (var i = 0; i < 9; i++) {
+ ctx.rotate(pi5);
+ if (i % 2 == 0) {
+ ctx.lineTo((dim / 0.525731) * 0.200811, 0);
+ } else {
+ ctx.lineTo(dim, 0);
+ }
+ }
+ ctx.closePath();
+ ctx[type]();
+ ctx.restore();
+ },
+ /*
+ Method: contains
+
+ Returns *true* if *pos* is contained in the area of the shape. Returns *false* otherwise.
+
+ Parameters:
+
+ npos - (object) An *x*, *y* object with the <Graph.Node> position.
+ pos - (object) An *x*, *y* object with the position to check.
+ dim - (number) The dimension of the shape.
+
+ Example:
+ (start code js)
+ NodeHelper.star.contains({ x: 10, y: 30 }, { x: 15, y: 35 }, 30);
+ (end code)
+ */
+ 'contains': function(npos, pos, dim) {
+ return NodeHelper.circle.contains(npos, pos, dim);
+ }
+ }
+};
+
+/*
+ Object: EdgeHelper
+
+ Contains rendering primitives for simple edge shapes.
+*/
+var EdgeHelper = {
+ /*
+ Object: EdgeHelper.line
+ */
+ 'line': {
+ /*
+ Method: render
+
+ Renders a line into the canvas.
+
+ Parameters:
+
+ from - (object) An *x*, *y* object with the starting position of the line.
+ to - (object) An *x*, *y* object with the ending position of the line.
+ canvas - (object) A <Canvas> instance.
+
+ Example:
+ (start code js)
+ EdgeHelper.line.render({ x: 10, y: 30 }, { x: 10, y: 50 }, viz.canvas);
+ (end code)
+ */
+ 'render': function(from, to, canvas){
+ var ctx = canvas.getCtx();
+ ctx.beginPath();
+ ctx.moveTo(from.x, from.y);
+ ctx.lineTo(to.x, to.y);
+ ctx.stroke();
+ },
+ /*
+ Method: contains
+
+ Returns *true* if *pos* is contained in the area of the shape. Returns *false* otherwise.
+
+ Parameters:
+
+ posFrom - (object) An *x*, *y* object with a <Graph.Node> position.
+ posTo - (object) An *x*, *y* object with a <Graph.Node> position.
+ pos - (object) An *x*, *y* object with the position to check.
+ epsilon - (number) The dimension of the shape.
+
+ Example:
+ (start code js)
+ EdgeHelper.line.contains({ x: 10, y: 30 }, { x: 15, y: 35 }, { x: 15, y: 35 }, 30);
+ (end code)
+ */
+ 'contains': function(posFrom, posTo, pos, epsilon) {
+ var min = Math.min,
+ max = Math.max,
+ minPosX = min(posFrom.x, posTo.x),
+ maxPosX = max(posFrom.x, posTo.x),
+ minPosY = min(posFrom.y, posTo.y),
+ maxPosY = max(posFrom.y, posTo.y);
+
+ if(pos.x >= minPosX && pos.x <= maxPosX
+ && pos.y >= minPosY && pos.y <= maxPosY) {
+ if(Math.abs(posTo.x - posFrom.x) <= epsilon) {
+ return true;
+ }
+ var dist = (posTo.y - posFrom.y) / (posTo.x - posFrom.x) * (pos.x - posFrom.x) + posFrom.y;
+ return Math.abs(dist - pos.y) <= epsilon;
+ }
+ return false;
+ }
+ },
+ /*
+ Object: EdgeHelper.arrow
+ */
+ 'arrow': {
+ /*
+ Method: render
+
+ Renders an arrow into the canvas.
+
+ Parameters:
+
+ from - (object) An *x*, *y* object with the starting position of the arrow.
+ to - (object) An *x*, *y* object with the ending position of the arrow.
+ dim - (number) The dimension of the arrow.
+ swap - (boolean) Whether to set the arrow pointing to the starting position or the ending position.
+ canvas - (object) A <Canvas> instance.
+
+ Example:
+ (start code js)
+ EdgeHelper.arrow.render({ x: 10, y: 30 }, { x: 10, y: 50 }, 13, false, viz.canvas);
+ (end code)
+ */
+ 'render': function(from, to, dim, swap, canvas){
+ var ctx = canvas.getCtx();
+ // invert edge direction
+ if (swap) {
+ var tmp = from;
+ from = to;
+ to = tmp;
+ }
+ var vect = new Complex(to.x - from.x, to.y - from.y);
+ vect.$scale(dim / vect.norm());
+ var intermediatePoint = new Complex(to.x - vect.x, to.y - vect.y),
+ normal = new Complex(-vect.y / 2, vect.x / 2),
+ v1 = intermediatePoint.add(normal),
+ v2 = intermediatePoint.$add(normal.$scale(-1));
+
+ ctx.beginPath();
+ ctx.moveTo(from.x, from.y);
+ ctx.lineTo(to.x, to.y);
+ ctx.stroke();
+ ctx.beginPath();
+ ctx.moveTo(v1.x, v1.y);
+ ctx.lineTo(v2.x, v2.y);
+ ctx.lineTo(to.x, to.y);
+ ctx.closePath();
+ ctx.fill();
+ },
+ /*
+ Method: contains
+
+ Returns *true* if *pos* is contained in the area of the shape. Returns *false* otherwise.
+
+ Parameters:
+
+ posFrom - (object) An *x*, *y* object with a <Graph.Node> position.
+ posTo - (object) An *x*, *y* object with a <Graph.Node> position.
+ pos - (object) An *x*, *y* object with the position to check.
+ epsilon - (number) The dimension of the shape.
+
+ Example:
+ (start code js)
+ EdgeHelper.arrow.contains({ x: 10, y: 30 }, { x: 15, y: 35 }, { x: 15, y: 35 }, 30);
+ (end code)
+ */
+ 'contains': function(posFrom, posTo, pos, epsilon) {
+ return EdgeHelper.line.contains(posFrom, posTo, pos, epsilon);
+ }
+ },
+ /*
+ Object: EdgeHelper.hyperline
+ */
+ 'hyperline': {
+ /*
+ Method: render
+
+ Renders a hyperline into the canvas. A hyperline are the lines drawn for the <Hypertree> visualization.
+
+ Parameters:
+
+ from - (object) An *x*, *y* object with the starting position of the hyperline. *x* and *y* must belong to [0, 1).
+ to - (object) An *x*, *y* object with the ending position of the hyperline. *x* and *y* must belong to [0, 1).
+ r - (number) The scaling factor.
+ canvas - (object) A <Canvas> instance.
+
+ Example:
+ (start code js)
+ EdgeHelper.hyperline.render({ x: 10, y: 30 }, { x: 10, y: 50 }, 100, viz.canvas);
+ (end code)
+ */
+ 'render': function(from, to, r, canvas){
+ var ctx = canvas.getCtx();
+ var centerOfCircle = computeArcThroughTwoPoints(from, to);
+ if (centerOfCircle.a > 1000 || centerOfCircle.b > 1000
+ || centerOfCircle.ratio < 0) {
+ ctx.beginPath();
+ ctx.moveTo(from.x * r, from.y * r);
+ ctx.lineTo(to.x * r, to.y * r);
+ ctx.stroke();
+ } else {
+ var angleBegin = Math.atan2(to.y - centerOfCircle.y, to.x
+ - centerOfCircle.x);
+ var angleEnd = Math.atan2(from.y - centerOfCircle.y, from.x
+ - centerOfCircle.x);
+ var sense = sense(angleBegin, angleEnd);
+ ctx.beginPath();
+ ctx.arc(centerOfCircle.x * r, centerOfCircle.y * r, centerOfCircle.ratio
+ * r, angleBegin, angleEnd, sense);
+ ctx.stroke();
+ }
+ /*
+ Calculates the arc parameters through two points.
+
+ More information in <http://en.wikipedia.org/wiki/Poincar%C3%A9_disc_model#Analytic_geometry_constructions_in_the_hyperbolic_plane>
+
+ Parameters:
+
+ p1 - A <Complex> instance.
+ p2 - A <Complex> instance.
+ scale - The Disk's diameter.
+
+ Returns:
+
+ An object containing some arc properties.
+ */
+ function computeArcThroughTwoPoints(p1, p2){
+ var aDen = (p1.x * p2.y - p1.y * p2.x), bDen = aDen;
+ var sq1 = p1.squaredNorm(), sq2 = p2.squaredNorm();
+ // Fall back to a straight line
+ if (aDen == 0)
+ return {
+ x: 0,
+ y: 0,
+ ratio: -1
+ };
+
+ var a = (p1.y * sq2 - p2.y * sq1 + p1.y - p2.y) / aDen;
+ var b = (p2.x * sq1 - p1.x * sq2 + p2.x - p1.x) / bDen;
+ var x = -a / 2;
+ var y = -b / 2;
+ var squaredRatio = (a * a + b * b) / 4 - 1;
+ // Fall back to a straight line
+ if (squaredRatio < 0)
+ return {
+ x: 0,
+ y: 0,
+ ratio: -1
+ };
+ var ratio = Math.sqrt(squaredRatio);
+ var out = {
+ x: x,
+ y: y,
+ ratio: ratio > 1000? -1 : ratio,
+ a: a,
+ b: b
+ };
+
+ return out;
+ }
+ /*
+ Sets angle direction to clockwise (true) or counterclockwise (false).
+
+ Parameters:
+
+ angleBegin - Starting angle for drawing the arc.
+ angleEnd - The HyperLine will be drawn from angleBegin to angleEnd.
+
+ Returns:
+
+ A Boolean instance describing the sense for drawing the HyperLine.
+ */
+ function sense(angleBegin, angleEnd){
+ return (angleBegin < angleEnd)? ((angleBegin + Math.PI > angleEnd)? false
+ : true) : ((angleEnd + Math.PI > angleBegin)? true : false);
+ }
+ },
+ /*
+ Method: contains
+
+ Not Implemented
+
+ Returns *true* if *pos* is contained in the area of the shape. Returns *false* otherwise.
+
+ Parameters:
+
+ posFrom - (object) An *x*, *y* object with a <Graph.Node> position.
+ posTo - (object) An *x*, *y* object with a <Graph.Node> position.
+ pos - (object) An *x*, *y* object with the position to check.
+ epsilon - (number) The dimension of the shape.
+
+ Example:
+ (start code js)
+ EdgeHelper.hyperline.contains({ x: 10, y: 30 }, { x: 15, y: 35 }, { x: 15, y: 35 }, 30);
+ (end code)
+ */
+ 'contains': $.lambda(false)
+ }
+};
+
+
+/*
+ * File: Graph.Plot.js
+ */
+
+/*
+ Object: Graph.Plot
+
+ <Graph> rendering and animation methods.
+
+ Properties:
+
+ nodeHelper - <NodeHelper> object.
+ edgeHelper - <EdgeHelper> object.
+*/
+Graph.Plot = {
+ //Default intializer
+ initialize: function(viz, klass){
+ this.viz = viz;
+ this.config = viz.config;
+ this.node = viz.config.Node;
+ this.edge = viz.config.Edge;
+ this.animation = new Animation;
+ this.nodeTypes = new klass.Plot.NodeTypes;
+ this.edgeTypes = new klass.Plot.EdgeTypes;
+ this.labels = viz.labels;
+ },
+
+ //Add helpers
+ nodeHelper: NodeHelper,
+ edgeHelper: EdgeHelper,
+
+ Interpolator: {
+ //node/edge property parsers
+ 'map': {
+ 'border': 'color',
+ 'color': 'color',
+ 'width': 'number',
+ 'height': 'number',
+ 'dim': 'number',
+ 'alpha': 'number',
+ 'lineWidth': 'number',
+ 'angularWidth':'number',
+ 'span':'number',
+ 'valueArray':'array-number',
+ 'dimArray':'array-number'
+ //'colorArray':'array-color'
+ },
+
+ //canvas specific parsers
+ 'canvas': {
+ 'globalAlpha': 'number',
+ 'fillStyle': 'color',
+ 'strokeStyle': 'color',
+ 'lineWidth': 'number',
+ 'shadowBlur': 'number',
+ 'shadowColor': 'color',
+ 'shadowOffsetX': 'number',
+ 'shadowOffsetY': 'number',
+ 'miterLimit': 'number'
+ },
+
+ //label parsers
+ 'label': {
+ 'size': 'number',
+ 'color': 'color'
+ },
+
+ //Number interpolator
+ 'compute': function(from, to, delta) {
+ return from + (to - from) * delta;
+ },
+
+ //Position interpolators
+ 'moebius': function(elem, props, delta, vector) {
+ var v = vector.scale(-delta);
+ if(v.norm() < 1) {
+ var x = v.x, y = v.y;
+ var ans = elem.startPos
+ .getc().moebiusTransformation(v);
+ elem.pos.setc(ans.x, ans.y);
+ v.x = x; v.y = y;
+ }
+ },
+
+ 'linear': function(elem, props, delta) {
+ var from = elem.startPos.getc(true);
+ var to = elem.endPos.getc(true);
+ elem.pos.setc(this.compute(from.x, to.x, delta),
+ this.compute(from.y, to.y, delta));
+ },
+
+ 'polar': function(elem, props, delta) {
+ var from = elem.startPos.getp(true);
+ var to = elem.endPos.getp();
+ var ans = to.interpolate(from, delta);
+ elem.pos.setp(ans.theta, ans.rho);
+ },
+
+ //Graph's Node/Edge interpolators
+ 'number': function(elem, prop, delta, getter, setter) {
+ var from = elem[getter](prop, 'start');
+ var to = elem[getter](prop, 'end');
+ elem[setter](prop, this.compute(from, to, delta));
+ },
+
+ 'color': function(elem, prop, delta, getter, setter) {
+ var from = $.hexToRgb(elem[getter](prop, 'start'));
+ var to = $.hexToRgb(elem[getter](prop, 'end'));
+ var comp = this.compute;
+ var val = $.rgbToHex([parseInt(comp(from[0], to[0], delta)),
+ parseInt(comp(from[1], to[1], delta)),
+ parseInt(comp(from[2], to[2], delta))]);
+
+ elem[setter](prop, val);
+ },
+
+ 'array-number': function(elem, prop, delta, getter, setter) {
+ var from = elem[getter](prop, 'start'),
+ to = elem[getter](prop, 'end'),
+ cur = [];
+ for(var i=0, l=from.length; i<l; i++) {
+ var fromi = from[i], toi = to[i];
+ if(fromi.length) {
+ for(var j=0, len=fromi.length, curi=[]; j<len; j++) {
+ curi.push(this.compute(fromi[j], toi[j], delta));
+ }
+ cur.push(curi);
+ } else {
+ cur.push(this.compute(fromi, toi, delta));
+ }
+ }
+ elem[setter](prop, cur);
+ },
+
+ 'node': function(elem, props, delta, map, getter, setter) {
+ map = this[map];
+ if(props) {
+ var len = props.length;
+ for(var i=0; i<len; i++) {
+ var pi = props[i];
+ this[map[pi]](elem, pi, delta, getter, setter);
+ }
+ } else {
+ for(var pi in map) {
+ this[map[pi]](elem, pi, delta, getter, setter);
+ }
+ }
+ },
+
+ 'edge': function(elem, props, delta, mapKey, getter, setter) {
+ var adjs = elem.adjacencies;
+ for(var id in adjs) this['node'](adjs[id], props, delta, mapKey, getter, setter);
+ },
+
+ 'node-property': function(elem, props, delta) {
+ this['node'](elem, props, delta, 'map', 'getData', 'setData');
+ },
+
+ 'edge-property': function(elem, props, delta) {
+ this['edge'](elem, props, delta, 'map', 'getData', 'setData');
+ },
+
+ 'label-property': function(elem, props, delta) {
+ this['node'](elem, props, delta, 'label', 'getLabelData', 'setLabelData');
+ },
+
+ 'node-style': function(elem, props, delta) {
+ this['node'](elem, props, delta, 'canvas', 'getCanvasStyle', 'setCanvasStyle');
+ },
+
+ 'edge-style': function(elem, props, delta) {
+ this['edge'](elem, props, delta, 'canvas', 'getCanvasStyle', 'setCanvasStyle');
+ }
+ },
+
+
+ /*
+ sequence
+
+ Iteratively performs an action while refreshing the state of the visualization.
+
+ Parameters:
+
+ options - (object) An object containing some sequence options described below
+ condition - (function) A function returning a boolean instance in order to stop iterations.
+ step - (function) A function to execute on each step of the iteration.
+ onComplete - (function) A function to execute when the sequence finishes.
+ duration - (number) Duration (in milliseconds) of each step.
+
+ Example:
+ (start code js)
+ var rg = new $jit.RGraph(options);
+ var i = 0;
+ rg.fx.sequence({
+ condition: function() {
+ return i == 10;
+ },
+ step: function() {
+ alert(i++);
+ },
+ onComplete: function() {
+ alert('done!');
+ }
+ });
+ (end code)
+
+ */
+ sequence: function(options) {
+ var that = this;
+ options = $.merge({
+ condition: $.lambda(false),
+ step: $.empty,
+ onComplete: $.empty,
+ duration: 200
+ }, options || {});
+
+ var interval = setInterval(function() {
+ if(options.condition()) {
+ options.step();
+ } else {
+ clearInterval(interval);
+ options.onComplete();
+ }
+ that.viz.refresh(true);
+ }, options.duration);
+ },
+
+ /*
+ prepare
+
+ Prepare graph position and other attribute values before performing an Animation.
+ This method is used internally by the Toolkit.
+
+ See also:
+
+ <Animation>, <Graph.Plot.animate>
+
+ */
+ prepare: function(modes) {
+ var graph = this.viz.graph,
+ accessors = {
+ 'node-property': {
+ 'getter': 'getData',
+ 'setter': 'setData'
+ },
+ 'edge-property': {
+ 'getter': 'getData',
+ 'setter': 'setData'
+ },
+ 'node-style': {
+ 'getter': 'getCanvasStyle',
+ 'setter': 'setCanvasStyle'
+ },
+ 'edge-style': {
+ 'getter': 'getCanvasStyle',
+ 'setter': 'setCanvasStyle'
+ }
+ };
+
+ //parse modes
+ var m = {};
+ if($.type(modes) == 'array') {
+ for(var i=0, len=modes.length; i < len; i++) {
+ var elems = modes[i].split(':');
+ m[elems.shift()] = elems;
+ }
+ } else {
+ for(var p in modes) {
+ if(p == 'position') {
+ m[modes.position] = [];
+ } else {
+ m[p] = $.splat(modes[p]);
+ }
+ }
+ }
+
+ graph.eachNode(function(node) {
+ node.startPos.set(node.pos);
+ $.each(['node-property', 'node-style'], function(p) {
+ if(p in m) {
+ var prop = m[p];
+ for(var i=0, l=prop.length; i < l; i++) {
+ node[accessors[p].setter](prop[i], node[accessors[p].getter](prop[i]), 'start');
+ }
+ }
+ });
+ $.each(['edge-property', 'edge-style'], function(p) {
+ if(p in m) {
+ var prop = m[p];
+ node.eachAdjacency(function(adj) {
+ for(var i=0, l=prop.length; i < l; i++) {
+ adj[accessors[p].setter](prop[i], adj[accessors[p].getter](prop[i]), 'start');
+ }
+ });
+ }
+ });
+ });
+ return m;
+ },
+
+ /*
+ Method: animate
+
+ Animates a <Graph> by interpolating some <Graph.Node>, <Graph.Adjacence> or <Graph.Label> properties.
+
+ Parameters:
+
+ opt - (object) Animation options. The object properties are described below
+ duration - (optional) Described in <Options.Fx>.
+ fps - (optional) Described in <Options.Fx>.
+ hideLabels - (optional|boolean) Whether to hide labels during the animation.
+ modes - (required|object) An object with animation modes (described below).
+
+ Animation modes:
+
+ Animation modes are strings representing different node/edge and graph properties that you'd like to animate.
+ They are represented by an object that has as keys main categories of properties to animate and as values a list
+ of these specific properties. The properties are described below
+
+ position - Describes the way nodes' positions must be interpolated. Possible values are 'linear', 'polar' or 'moebius'.
+ node-property - Describes which Node properties will be interpolated. These properties can be any of the ones defined in <Options.Node>.
+ edge-property - Describes which Edge properties will be interpolated. These properties can be any the ones defined in <Options.Edge>.
+ label-property - Describes which Label properties will be interpolated. These properties can be any of the ones defined in <Options.Label> like color or size.
+ node-style - Describes which Node Canvas Styles will be interpolated. These are specific canvas properties like fillStyle, strokeStyle, lineWidth, shadowBlur, shadowColor, shadowOffsetX, shadowOffsetY, etc.
+ edge-style - Describes which Edge Canvas Styles will be interpolated. These are specific canvas properties like fillStyle, strokeStyle, lineWidth, shadowBlur, shadowColor, shadowOffsetX, shadowOffsetY, etc.
+
+ Example:
+ (start code js)
+ var viz = new $jit.Viz(options);
+ //...tweak some Data, CanvasStyles or LabelData properties...
+ viz.fx.animate({
+ modes: {
+ 'position': 'linear',
+ 'node-property': ['width', 'height'],
+ 'node-style': 'shadowColor',
+ 'label-property': 'size'
+ },
+ hideLabels: false
+ });
+ //...can also be written like this...
+ viz.fx.animate({
+ modes: ['linear',
+ 'node-property:width:height',
+ 'node-style:shadowColor',
+ 'label-property:size'],
+ hideLabels: false
+ });
+ (end code)
+ */
+ animate: function(opt, versor) {
+ opt = $.merge(this.viz.config, opt || {});
+ var that = this,
+ viz = this.viz,
+ graph = viz.graph,
+ interp = this.Interpolator,
+ animation = opt.type === 'nodefx'? this.nodeFxAnimation : this.animation;
+ //prepare graph values
+ var m = this.prepare(opt.modes);
+
+ //animate
+ if(opt.hideLabels) this.labels.hideLabels(true);
+ animation.setOptions($.merge(opt, {
+ $animating: false,
+ compute: function(delta) {
+ graph.eachNode(function(node) {
+ for(var p in m) {
+ interp[p](node, m[p], delta, versor);
+ }
+ });
+ that.plot(opt, this.$animating, delta);
+ this.$animating = true;
+ },
+ complete: function() {
+ if(opt.hideLabels) that.labels.hideLabels(false);
+ that.plot(opt);
+ opt.onComplete();
+ opt.onAfterCompute();
+ }
+ })).start();
+ },
+
+ /*
+ nodeFx
+
+ Apply animation to node properties like color, width, height, dim, etc.
+
+ Parameters:
+
+ options - Animation options. This object properties is described below
+ elements - The Elements to be transformed. This is an object that has a properties
+
+ (start code js)
+ 'elements': {
+ //can also be an array of ids
+ 'id': 'id-of-node-to-transform',
+ //properties to be modified. All properties are optional.
+ 'properties': {
+ 'color': '#ccc', //some color
+ 'width': 10, //some width
+ 'height': 10, //some height
+ 'dim': 20, //some dim
+ 'lineWidth': 10 //some line width
+ }
+ }
+ (end code)
+
+ - _reposition_ Whether to recalculate positions and add a motion animation.
+ This might be used when changing _width_ or _height_ properties in a <Layouts.Tree> like layout. Default's *false*.
+
+ - _onComplete_ A method that is called when the animation completes.
+
+ ...and all other <Graph.Plot.animate> options like _duration_, _fps_, _transition_, etc.
+
+ Example:
+ (start code js)
+ var rg = new RGraph(canvas, config); //can be also Hypertree or ST
+ rg.fx.nodeFx({
+ 'elements': {
+ 'id':'mynodeid',
+ 'properties': {
+ 'color':'#ccf'
+ },
+ 'transition': Trans.Quart.easeOut
+ }
+ });
+ (end code)
+ */
+ nodeFx: function(opt) {
+ var viz = this.viz,
+ graph = viz.graph,
+ animation = this.nodeFxAnimation,
+ options = $.merge(this.viz.config, {
+ 'elements': {
+ 'id': false,
+ 'properties': {}
+ },
+ 'reposition': false
+ });
+ opt = $.merge(options, opt || {}, {
+ onBeforeCompute: $.empty,
+ onAfterCompute: $.empty
+ });
+ //check if an animation is running
+ animation.stopTimer();
+ var props = opt.elements.properties;
+ //set end values for nodes
+ if(!opt.elements.id) {
+ graph.eachNode(function(n) {
+ for(var prop in props) {
+ n.setData(prop, props[prop], 'end');
+ }
+ });
+ } else {
+ var ids = $.splat(opt.elements.id);
+ $.each(ids, function(id) {
+ var n = graph.getNode(id);
+ if(n) {
+ for(var prop in props) {
+ n.setData(prop, props[prop], 'end');
+ }
+ }
+ });
+ }
+ //get keys
+ var propnames = [];
+ for(var prop in props) propnames.push(prop);
+ //add node properties modes
+ var modes = ['node-property:' + propnames.join(':')];
+ //set new node positions
+ if(opt.reposition) {
+ modes.push('linear');
+ viz.compute('end');
+ }
+ //animate
+ this.animate($.merge(opt, {
+ modes: modes,
+ type: 'nodefx'
+ }));
+ },
+
+
+ /*
+ Method: plot
+
+ Plots a <Graph>.
+
+ Parameters:
+
+ opt - (optional) Plotting options. Most of them are described in <Options.Fx>.
+
+ Example:
+
+ (start code js)
+ var viz = new $jit.Viz(options);
+ viz.fx.plot();
+ (end code)
+
+ */
+ plot: function(opt, animating) {
+ var viz = this.viz,
+ aGraph = viz.graph,
+ canvas = viz.canvas,
+ id = viz.root,
+ that = this,
+ ctx = canvas.getCtx(),
+ min = Math.min,
+ opt = opt || this.viz.controller;
+ opt.clearCanvas && canvas.clear();
+
+ var root = aGraph.getNode(id);
+ if(!root) return;
+
+ var T = !!root.visited;
+ aGraph.eachNode(function(node) {
+ var nodeAlpha = node.getData('alpha');
+ node.eachAdjacency(function(adj) {
+ var nodeTo = adj.nodeTo;
+ if(!!nodeTo.visited === T && node.drawn && nodeTo.drawn) {
+ !animating && opt.onBeforePlotLine(adj);
+ ctx.save();
+ ctx.globalAlpha = min(nodeAlpha,
+ nodeTo.getData('alpha'),
+ adj.getData('alpha'));
+ that.plotLine(adj, canvas, animating);
+ ctx.restore();
+ !animating && opt.onAfterPlotLine(adj);
+ }
+ });
+ ctx.save();
+ if(node.drawn) {
+ !animating && opt.onBeforePlotNode(node);
+ that.plotNode(node, canvas, animating);
+ !animating && opt.onAfterPlotNode(node);
+ }
+ if(!that.labelsHidden && opt.withLabels) {
+ if(node.drawn && nodeAlpha >= 0.95) {
+ that.labels.plotLabel(canvas, node, opt);
+ } else {
+ that.labels.hideLabel(node, false);
+ }
+ }
+ ctx.restore();
+ node.visited = !T;
+ });
+ },
+
+ /*
+ Plots a Subtree.
+ */
+ plotTree: function(node, opt, animating) {
+ var that = this,
+ viz = this.viz,
+ canvas = viz.canvas,
+ config = this.config,
+ ctx = canvas.getCtx();
+ var nodeAlpha = node.getData('alpha');
+ node.eachSubnode(function(elem) {
+ if(opt.plotSubtree(node, elem) && elem.exist && elem.drawn) {
+ var adj = node.getAdjacency(elem.id);
+ !animating && opt.onBeforePlotLine(adj);
+ ctx.globalAlpha = Math.min(nodeAlpha, elem.getData('alpha'));
+ that.plotLine(adj, canvas, animating);
+ !animating && opt.onAfterPlotLine(adj);
+ that.plotTree(elem, opt, animating);
+ }
+ });
+ if(node.drawn) {
+ !animating && opt.onBeforePlotNode(node);
+ this.plotNode(node, canvas, animating);
+ !animating && opt.onAfterPlotNode(node);
+ if(!opt.hideLabels && opt.withLabels && nodeAlpha >= 0.95)
+ this.labels.plotLabel(canvas, node, opt);
+ else
+ this.labels.hideLabel(node, false);
+ } else {
+ this.labels.hideLabel(node, true);
+ }
+ },
+
+ /*
+ Method: plotNode
+
+ Plots a <Graph.Node>.
+
+ Parameters:
+
+ node - (object) A <Graph.Node>.
+ canvas - (object) A <Canvas> element.
+
+ */
+ plotNode: function(node, canvas, animating) {
+ var f = node.getData('type'),
+ ctxObj = this.node.CanvasStyles;
+ if(f != 'none') {
+ var width = node.getData('lineWidth'),
+ color = node.getData('color'),
+ alpha = node.getData('alpha'),
+ ctx = canvas.getCtx();
+
+ ctx.lineWidth = width;
+ ctx.fillStyle = ctx.strokeStyle = color;
+ ctx.globalAlpha = alpha;
+
+ for(var s in ctxObj) {
+ ctx[s] = node.getCanvasStyle(s);
+ }
+
+ this.nodeTypes[f].render.call(this, node, canvas, animating);
+ }
+ },
+
+ /*
+ Method: plotLine
+
+ Plots a <Graph.Adjacence>.
+
+ Parameters:
+
+ adj - (object) A <Graph.Adjacence>.
+ canvas - (object) A <Canvas> instance.
+
+ */
+ plotLine: function(adj, canvas, animating) {
+ var f = adj.getData('type'),
+ ctxObj = this.edge.CanvasStyles;
+ if(f != 'none') {
+ var width = adj.getData('lineWidth'),
+ color = adj.getData('color'),
+ ctx = canvas.getCtx();
+
+ ctx.lineWidth = width;
+ ctx.fillStyle = ctx.strokeStyle = color;
+
+ for(var s in ctxObj) {
+ ctx[s] = adj.getCanvasStyle(s);
+ }
+
+ this.edgeTypes[f].render.call(this, adj, canvas, animating);
+ }
+ }
+
+};
+
+
+
+/*
+ * File: Graph.Label.js
+ *
+*/
+
+/*
+ Object: Graph.Label
+
+ An interface for plotting/hiding/showing labels.
+
+ Description:
+
+ This is a generic interface for plotting/hiding/showing labels.
+ The <Graph.Label> interface is implemented in multiple ways to provide
+ different label types.
+
+ For example, the Graph.Label interface is implemented as <Graph.Label.HTML> to provide
+ HTML label elements. Also we provide the <Graph.Label.SVG> interface for SVG type labels.
+ The <Graph.Label.Native> interface implements these methods with the native Canvas text rendering functions.
+
+ All subclasses (<Graph.Label.HTML>, <Graph.Label.SVG> and <Graph.Label.Native>) implement the method plotLabel.
+*/
+
+Graph.Label = {};
+
+/*
+ Class: Graph.Label.Native
+
+ Implements labels natively, using the Canvas text API.
+*/
+Graph.Label.Native = new Class({
+ /*
+ Method: plotLabel
+
+ Plots a label for a given node.
+
+ Parameters:
+
+ canvas - (object) A <Canvas> instance.
+ node - (object) A <Graph.Node>.
+ controller - (object) A configuration object.
+
+ Example:
+
+ (start code js)
+ var viz = new $jit.Viz(options);
+ var node = viz.graph.getNode('nodeId');
+ viz.labels.plotLabel(viz.canvas, node, viz.config);
+ (end code)
+ */
+ plotLabel: function(canvas, node, controller) {
+ var ctx = canvas.getCtx();
+ var pos = node.pos.getc(true);
+
+ ctx.font = node.getLabelData('style') + ' ' + node.getLabelData('size') + 'px ' + node.getLabelData('family');
+ ctx.textAlign = node.getLabelData('textAlign');
+ ctx.fillStyle = ctx.strokeStyle = node.getLabelData('color');
+ ctx.textBaseline = node.getLabelData('textBaseline');
+
+ this.renderLabel(canvas, node, controller);
+ },
+
+ /*
+ renderLabel
+
+ Does the actual rendering of the label in the canvas. The default
+ implementation renders the label close to the position of the node, this
+ method should be overriden to position the labels differently.
+
+ Parameters:
+
+ canvas - A <Canvas> instance.
+ node - A <Graph.Node>.
+ controller - A configuration object. See also <Hypertree>, <RGraph>, <ST>.
+ */
+ renderLabel: function(canvas, node, controller) {
+ var ctx = canvas.getCtx();
+ var pos = node.pos.getc(true);
+ ctx.fillText(node.name, pos.x, pos.y + node.getData("height") / 2);
+ },
+
+ hideLabel: $.empty,
+ hideLabels: $.empty
+});
+
+/*
+ Class: Graph.Label.DOM
+
+ Abstract Class implementing some DOM label methods.
+
+ Implemented by:
+
+ <Graph.Label.HTML> and <Graph.Label.SVG>.
+
+*/
+Graph.Label.DOM = new Class({
+ //A flag value indicating if node labels are being displayed or not.
+ labelsHidden: false,
+ //Label container
+ labelContainer: false,
+ //Label elements hash.
+ labels: {},
+
+ /*
+ Method: getLabelContainer
+
+ Lazy fetcher for the label container.
+
+ Returns:
+
+ The label container DOM element.
+
+ Example:
+
+ (start code js)
+ var viz = new $jit.Viz(options);
+ var labelContainer = viz.labels.getLabelContainer();
+ alert(labelContainer.innerHTML);
+ (end code)
+ */
+ getLabelContainer: function() {
+ return this.labelContainer ?
+ this.labelContainer :
+ this.labelContainer = document.getElementById(this.viz.config.labelContainer);
+ },
+
+ /*
+ Method: getLabel
+
+ Lazy fetcher for the label element.
+
+ Parameters:
+
+ id - (string) The label id (which is also a <Graph.Node> id).
+
+ Returns:
+
+ The label element.
+
+ Example:
+
+ (start code js)
+ var viz = new $jit.Viz(options);
+ var label = viz.labels.getLabel('someid');
+ alert(label.innerHTML);
+ (end code)
+
+ */
+ getLabel: function(id) {
+ return (id in this.labels && this.labels[id] != null) ?
+ this.labels[id] :
+ this.labels[id] = document.getElementById(id);
+ },
+
+ /*
+ Method: hideLabels
+
+ Hides all labels (by hiding the label container).
+
+ Parameters:
+
+ hide - (boolean) A boolean value indicating if the label container must be hidden or not.
+
+ Example:
+ (start code js)
+ var viz = new $jit.Viz(options);
+ rg.labels.hideLabels(true);
+ (end code)
+
+ */
+ hideLabels: function (hide) {
+ var container = this.getLabelContainer();
+ if(hide)
+ container.style.display = 'none';
+ else
+ container.style.display = '';
+ this.labelsHidden = hide;
+ },
+
+ /*
+ Method: clearLabels
+
+ Clears the label container.
+
+ Useful when using a new visualization with the same canvas element/widget.
+
+ Parameters:
+
+ force - (boolean) Forces deletion of all labels.
+
+ Example:
+ (start code js)
+ var viz = new $jit.Viz(options);
+ viz.labels.clearLabels();
+ (end code)
+ */
+ clearLabels: function(force) {
+ for(var id in this.labels) {
+ if (force || !this.viz.graph.hasNode(id)) {
+ this.disposeLabel(id);
+ delete this.labels[id];
+ }
+ }
+ },
+
+ /*
+ Method: disposeLabel
+
+ Removes a label.
+
+ Parameters:
+
+ id - (string) A label id (which generally is also a <Graph.Node> id).
+
+ Example:
+ (start code js)
+ var viz = new $jit.Viz(options);
+ viz.labels.disposeLabel('labelid');
+ (end code)
+ */
+ disposeLabel: function(id) {
+ var elem = this.getLabel(id);
+ if(elem && elem.parentNode) {
+ elem.parentNode.removeChild(elem);
+ }
+ },
+
+ /*
+ Method: hideLabel
+
+ Hides the corresponding <Graph.Node> label.
+
+ Parameters:
+
+ node - (object) A <Graph.Node>. Can also be an array of <Graph.Nodes>.
+ show - (boolean) If *true*, nodes will be shown. Otherwise nodes will be hidden.
+
+ Example:
+ (start code js)
+ var rg = new $jit.Viz(options);
+ viz.labels.hideLabel(viz.graph.getNode('someid'), false);
+ (end code)
+ */
+ hideLabel: function(node, show) {
+ node = $.splat(node);
+ var st = show ? "" : "none", lab, that = this;
+ $.each(node, function(n) {
+ var lab = that.getLabel(n.id);
+ if (lab) {
+ lab.style.display = st;
+ }
+ });
+ },
+
+ /*
+ fitsInCanvas
+
+ Returns _true_ or _false_ if the label for the node is contained in the canvas dom element or not.
+
+ Parameters:
+
+ pos - A <Complex> instance (I'm doing duck typing here so any object with _x_ and _y_ parameters will do).
+ canvas - A <Canvas> instance.
+
+ Returns:
+
+ A boolean value specifying if the label is contained in the <Canvas> DOM element or not.
+
+ */
+ fitsInCanvas: function(pos, canvas) {
+ var size = canvas.getSize();
+ if(pos.x >= size.width || pos.x < 0
+ || pos.y >= size.height || pos.y < 0) return false;
+ return true;
+ }
+});
+
+/*
+ Class: Graph.Label.HTML
+
+ Implements HTML labels.
+
+ Extends:
+
+ All <Graph.Label.DOM> methods.
+
+*/
+Graph.Label.HTML = new Class({
+ Implements: Graph.Label.DOM,
+
+ /*
+ Method: plotLabel
+
+ Plots a label for a given node.
+
+ Parameters:
+
+ canvas - (object) A <Canvas> instance.
+ node - (object) A <Graph.Node>.
+ controller - (object) A configuration object.
+
+ Example:
+
+ (start code js)
+ var viz = new $jit.Viz(options);
+ var node = viz.graph.getNode('nodeId');
+ viz.labels.plotLabel(viz.canvas, node, viz.config);
+ (end code)
+
+
+ */
+ plotLabel: function(canvas, node, controller) {
+ var id = node.id, tag = this.getLabel(id);
+
+ if(!tag && !(tag = document.getElementById(id))) {
+ tag = document.createElement('div');
+ var container = this.getLabelContainer();
+ tag.id = id;
+ tag.className = 'node';
+ tag.style.position = 'absolute';
+ controller.onCreateLabel(tag, node);
+ container.appendChild(tag);
+ this.labels[node.id] = tag;
+ }
+
+ this.placeLabel(tag, node, controller);
+ }
+});
+
+/*
+ Class: Graph.Label.SVG
+
+ Implements SVG labels.
+
+ Extends:
+
+ All <Graph.Label.DOM> methods.
+*/
+Graph.Label.SVG = new Class({
+ Implements: Graph.Label.DOM,
+
+ /*
+ Method: plotLabel
+
+ Plots a label for a given node.
+
+ Parameters:
+
+ canvas - (object) A <Canvas> instance.
+ node - (object) A <Graph.Node>.
+ controller - (object) A configuration object.
+
+ Example:
+
+ (start code js)
+ var viz = new $jit.Viz(options);
+ var node = viz.graph.getNode('nodeId');
+ viz.labels.plotLabel(viz.canvas, node, viz.config);
+ (end code)
+
+
+ */
+ plotLabel: function(canvas, node, controller) {
+ var id = node.id, tag = this.getLabel(id);
+ if(!tag && !(tag = document.getElementById(id))) {
+ var ns = 'http://www.w3.org/2000/svg';
+ tag = document.createElementNS(ns, 'svg:text');
+ var tspan = document.createElementNS(ns, 'svg:tspan');
+ tag.appendChild(tspan);
+ var container = this.getLabelContainer();
+ tag.setAttribute('id', id);
+ tag.setAttribute('class', 'node');
+ container.appendChild(tag);
+ controller.onCreateLabel(tag, node);
+ this.labels[node.id] = tag;
+ }
+ this.placeLabel(tag, node, controller);
+ }
+});
+
+
+
+Graph.Geom = new Class({
+
+ initialize: function(viz) {
+ this.viz = viz;
+ this.config = viz.config;
+ this.node = viz.config.Node;
+ this.edge = viz.config.Edge;
+ },
+ /*
+ Applies a translation to the tree.
+
+ Parameters:
+
+ pos - A <Complex> number specifying translation vector.
+ prop - A <Graph.Node> position property ('pos', 'start' or 'end').
+
+ Example:
+
+ (start code js)
+ st.geom.translate(new Complex(300, 100), 'end');
+ (end code)
+ */
+ translate: function(pos, prop) {
+ prop = $.splat(prop);
+ this.viz.graph.eachNode(function(elem) {
+ $.each(prop, function(p) { elem.getPos(p).$add(pos); });
+ });
+ },
+ /*
+ Hides levels of the tree until it properly fits in canvas.
+ */
+ setRightLevelToShow: function(node, canvas, callback) {
+ var level = this.getRightLevelToShow(node, canvas),
+ fx = this.viz.labels,
+ opt = $.merge({
+ execShow:true,
+ execHide:true,
+ onHide: $.empty,
+ onShow: $.empty
+ }, callback || {});
+ node.eachLevel(0, this.config.levelsToShow, function(n) {
+ var d = n._depth - node._depth;
+ if(d > level) {
+ opt.onHide(n);
+ if(opt.execHide) {
+ n.drawn = false;
+ n.exist = false;
+ fx.hideLabel(n, false);
+ }
+ } else {
+ opt.onShow(n);
+ if(opt.execShow) {
+ n.exist = true;
+ }
+ }
+ });
+ node.drawn= true;
+ },
+ /*
+ Returns the right level to show for the current tree in order to fit in canvas.
+ */
+ getRightLevelToShow: function(node, canvas) {
+ var config = this.config;
+ var level = config.levelsToShow;
+ var constrained = config.constrained;
+ if(!constrained) return level;
+ while(!this.treeFitsInCanvas(node, canvas, level) && level > 1) { level-- ; }
+ return level;
+ }
+});
+
+/*
+ * File: Loader.js
+ *
+ */
+
+/*
+ Object: Loader
+
+ Provides methods for loading and serving JSON data.
+*/
+var Loader = {
+ construct: function(json) {
+ var isGraph = ($.type(json) == 'array');
+ var ans = new Graph(this.graphOptions, this.config.Node, this.config.Edge, this.config.Label);
+ if(!isGraph)
+ //make tree
+ (function (ans, json) {
+ ans.addNode(json);
+ if(json.children) {
+ for(var i=0, ch = json.children; i<ch.length; i++) {
+ ans.addAdjacence(json, ch[i]);
+ arguments.callee(ans, ch[i]);
+ }
+ }
+ })(ans, json);
+ else
+ //make graph
+ (function (ans, json) {
+ var getNode = function(id) {
+ for(var i=0, l=json.length; i<l; i++) {
+ if(json[i].id == id) {
+ return json[i];
+ }
+ }
+ // The node was not defined in the JSON
+ // Let's create it
+ var newNode = {
+ "id" : id,
+ "name" : id
+ };
+ return ans.addNode(newNode);
+ };
+
+ for(var i=0, l=json.length; i<l; i++) {
+ ans.addNode(json[i]);
+ var adj = json[i].adjacencies;
+ if (adj) {
+ for(var j=0, lj=adj.length; j<lj; j++) {
+ var node = adj[j], data = {};
+ if(typeof adj[j] != 'string') {
+ data = $.merge(node.data, {});
+ node = node.nodeTo;
+ }
+ ans.addAdjacence(json[i], getNode(node), data);
+ }
+ }
+ }
+ })(ans, json);
+
+ return ans;
+ },
+
+ /*
+ Method: loadJSON
+
+ Loads a JSON structure to the visualization. The JSON structure can be a JSON *tree* or *graph* structure.
+
+ A JSON tree or graph structure consists of nodes, each having as properties
+
+ id - (string) A unique identifier for the node
+ name - (string) A node's name
+ data - (object) The data optional property contains a hash (i.e {})
+ where you can store all the information you want about this node.
+
+ For JSON *Tree* structures, there's an extra optional property *children* of type Array which contains the node's children.
+
+ Example:
+
+ (start code js)
+ var json = {
+ "id": "aUniqueIdentifier",
+ "name": "usually a nodes name",
+ "data": {
+ "some key": "some value",
+ "some other key": "some other value"
+ },
+ "children": [ *other nodes or empty* ]
+ };
+ (end code)
+
+ JSON *Graph* structures consist of an array of nodes, each specifying the nodes to which the current node is connected.
+ For JSON *Graph* structures, the *children* property is replaced by the *adjacencies* property.
+
+ There are two types of *Graph* structures, *simple* and *extended* graph structures.
+
+ For *simple* Graph structures, the adjacencies property contains an array of strings, each specifying the
+ id of the node connected to the main node.
+
+ Example:
+
+ (start code js)
+ var json = [
+ {
+ "id": "aUniqueIdentifier",
+ "name": "usually a nodes name",
+ "data": {
+ "some key": "some value",
+ "some other key": "some other value"
+ },
+ "adjacencies": ["anotherUniqueIdentifier", "yetAnotherUniqueIdentifier", 'etc']
+ },
+
+ 'other nodes go here...'
+ ];
+ (end code)
+
+ For *extended Graph structures*, the adjacencies property contains an array of Adjacency objects that have as properties
+
+ nodeTo - (string) The other node connected by this adjacency.
+ data - (object) A data property, where we can store custom key/value information.
+
+ Example:
+
+ (start code js)
+ var json = [
+ {
+ "id": "aUniqueIdentifier",
+ "name": "usually a nodes name",
+ "data": {
+ "some key": "some value",
+ "some other key": "some other value"
+ },
+ "adjacencies": [
+ {
+ nodeTo:"aNodeId",
+ data: {} //put whatever you want here
+ },
+ 'other adjacencies go here...'
+ },
+
+ 'other nodes go here...'
+ ];
+ (end code)
+
+ About the data property:
+
+ As described before, you can store custom data in the *data* property of JSON *nodes* and *adjacencies*.
+ You can use almost any string as key for the data object. Some keys though are reserved by the toolkit, and
+ have special meanings. This is the case for keys starting with a dollar sign, for example, *$width*.
+
+ For JSON *node* objects, adding dollar prefixed properties that match the names of the options defined in
+ <Options.Node> will override the general value for that option with that particular value. For this to work
+ however, you do have to set *overridable = true* in <Options.Node>.
+
+ The same thing is true for JSON adjacencies. Dollar prefixed data properties will alter values set in <Options.Edge>
+ if <Options.Edge> has *overridable = true*.
+
+ When loading JSON data into TreeMaps, the *data* property must contain a value for the *$area* key,
+ since this is the value which will be taken into account when creating the layout.
+ The same thing goes for the *$color* parameter.
+
+ In JSON Nodes you can use also *$label-* prefixed properties to refer to <Options.Label> properties. For example,
+ *$label-size* will refer to <Options.Label> size property. Also, in JSON nodes and adjacencies you can set
+ canvas specific properties individually by using the *$canvas-* prefix. For example, *$canvas-shadowBlur* will refer
+ to the *shadowBlur* property.
+
+ These properties can also be accessed after loading the JSON data from <Graph.Nodes> and <Graph.Adjacences>
+ by using <Accessors>. For more information take a look at the <Graph> and <Accessors> documentation.
+
+ Finally, these properties can also be used to create advanced animations like with <Options.NodeStyles>. For more
+ information about creating animations please take a look at the <Graph.Plot> and <Graph.Plot.animate> documentation.
+
+ loadJSON Parameters:
+
+ json - A JSON Tree or Graph structure.
+ i - For Graph structures only. Sets the indexed node as root for the visualization.
+
+ */
+ loadJSON: function(json, i) {
+ this.json = json;
+ //if they're canvas labels erase them.
+ if(this.labels && this.labels.clearLabels) {
+ this.labels.clearLabels(true);
+ }
+ this.graph = this.construct(json);
+ if($.type(json) != 'array'){
+ this.root = json.id;
+ } else {
+ this.root = json[i? i : 0].id;
+ }
+ },
+
+ /*
+ Method: toJSON
+
+ Returns a JSON tree/graph structure from the visualization's <Graph>.
+ See <Loader.loadJSON> for the graph formats available.
+
+ See also:
+
+ <Loader.loadJSON>
+
+ Parameters:
+
+ type - (string) Default's "tree". The type of the JSON structure to be returned.
+ Possible options are "tree" or "graph".
+ */
+ toJSON: function(type) {
+ type = type || "tree";
+ if(type == 'tree') {
+ var ans = {};
+ var rootNode = this.graph.getNode(this.root);
+ var ans = (function recTree(node) {
+ var ans = {};
+ ans.id = node.id;
+ ans.name = node.name;
+ ans.data = node.data;
+ var ch =[];
+ node.eachSubnode(function(n) {
+ ch.push(recTree(n));
+ });
+ ans.children = ch;
+ return ans;
+ })(rootNode);
+ return ans;
+ } else {
+ var ans = [];
+ var T = !!this.graph.getNode(this.root).visited;
+ this.graph.eachNode(function(node) {
+ var ansNode = {};
+ ansNode.id = node.id;
+ ansNode.name = node.name;
+ ansNode.data = node.data;
+ var adjs = [];
+ node.eachAdjacency(function(adj) {
+ var nodeTo = adj.nodeTo;
+ if(!!nodeTo.visited === T) {
+ var ansAdj = {};
+ ansAdj.nodeTo = nodeTo.id;
+ ansAdj.data = adj.data;
+ adjs.push(ansAdj);
+ }
+ });
+ ansNode.adjacencies = adjs;
+ ans.push(ansNode);
+ node.visited = !T;
+ });
+ return ans;
+ }
+ }
+};
+
+
+
+/*
+ * File: Layouts.js
+ *
+ * Implements base Tree and Graph layouts.
+ *
+ * Description:
+ *
+ * Implements base Tree and Graph layouts like Radial, Tree, etc.
+ *
+ */
+
+/*
+ * Object: Layouts
+ *
+ * Parent object for common layouts.
+ *
+ */
+var Layouts = $jit.Layouts = {};
+
+
+//Some util shared layout functions are defined here.
+var NodeDim = {
+ label: null,
+
+ compute: function(graph, prop, opt) {
+ this.initializeLabel(opt);
+ var label = this.label, style = label.style;
+ graph.eachNode(function(n) {
+ var autoWidth = n.getData('autoWidth'),
+ autoHeight = n.getData('autoHeight');
+ if(autoWidth || autoHeight) {
+ //delete dimensions since these are
+ //going to be overridden now.
+ delete n.data.$width;
+ delete n.data.$height;
+ delete n.data.$dim;
+
+ var width = n.getData('width'),
+ height = n.getData('height');
+ //reset label dimensions
+ style.width = autoWidth? 'auto' : width + 'px';
+ style.height = autoHeight? 'auto' : height + 'px';
+
+ //TODO(nico) should let the user choose what to insert here.
+ label.innerHTML = n.name;
+
+ var offsetWidth = label.offsetWidth,
+ offsetHeight = label.offsetHeight;
+ var type = n.getData('type');
+ if($.indexOf(['circle', 'square', 'triangle', 'star'], type) === -1) {
+ n.setData('width', offsetWidth);
+ n.setData('height', offsetHeight);
+ } else {
+ var dim = offsetWidth > offsetHeight? offsetWidth : offsetHeight;
+ n.setData('width', dim);
+ n.setData('height', dim);
+ n.setData('dim', dim);
+ }
+ }
+ });
+ },
+
+ initializeLabel: function(opt) {
+ if(!this.label) {
+ this.label = document.createElement('div');
+ document.body.appendChild(this.label);
+ }
+ this.setLabelStyles(opt);
+ },
+
+ setLabelStyles: function(opt) {
+ $.extend(this.label.style, {
+ 'visibility': 'hidden',
+ 'position': 'absolute',
+ 'width': 'auto',
+ 'height': 'auto'
+ });
+ this.label.className = 'jit-autoadjust-label';
+ }
+};
+
+
+/*
+ * Class: Layouts.Tree
+ *
+ * Implements a Tree Layout.
+ *
+ * Implemented By:
+ *
+ * <ST>
+ *
+ * Inspired by:
+ *
+ * Drawing Trees (Andrew J. Kennedy) <http://research.microsoft.com/en-us/um/people/akenn/fun/drawingtrees.pdf>
+ *
+ */
+Layouts.Tree = (function() {
+ //Layout functions
+ var slice = Array.prototype.slice;
+
+ /*
+ Calculates the max width and height nodes for a tree level
+ */
+ function getBoundaries(graph, config, level, orn, prop) {
+ var dim = config.Node;
+ var multitree = config.multitree;
+ if (dim.overridable) {
+ var w = -1, h = -1;
+ graph.eachNode(function(n) {
+ if (n._depth == level
+ && (!multitree || ('$orn' in n.data) && n.data.$orn == orn)) {
+ var dw = n.getData('width', prop);
+ var dh = n.getData('height', prop);
+ w = (w < dw) ? dw : w;
+ h = (h < dh) ? dh : h;
+ }
+ });
+ return {
+ 'width' : w < 0 ? dim.width : w,
+ 'height' : h < 0 ? dim.height : h
+ };
+ } else {
+ return dim;
+ }
+ }
+
+
+ function movetree(node, prop, val, orn) {
+ var p = (orn == "left" || orn == "right") ? "y" : "x";
+ node.getPos(prop)[p] += val;
+ }
+
+
+ function moveextent(extent, val) {
+ var ans = [];
+ $.each(extent, function(elem) {
+ elem = slice.call(elem);
+ elem[0] += val;
+ elem[1] += val;
+ ans.push(elem);
+ });
+ return ans;
+ }
+
+
+ function merge(ps, qs) {
+ if (ps.length == 0)
+ return qs;
+ if (qs.length == 0)
+ return ps;
+ var p = ps.shift(), q = qs.shift();
+ return [ [ p[0], q[1] ] ].concat(merge(ps, qs));
+ }
+
+
+ function mergelist(ls, def) {
+ def = def || [];
+ if (ls.length == 0)
+ return def;
+ var ps = ls.pop();
+ return mergelist(ls, merge(ps, def));
+ }
+
+
+ function fit(ext1, ext2, subtreeOffset, siblingOffset, i) {
+ if (ext1.length <= i || ext2.length <= i)
+ return 0;
+
+ var p = ext1[i][1], q = ext2[i][0];
+ return Math.max(fit(ext1, ext2, subtreeOffset, siblingOffset, ++i)
+ + subtreeOffset, p - q + siblingOffset);
+ }
+
+
+ function fitlistl(es, subtreeOffset, siblingOffset) {
+ function $fitlistl(acc, es, i) {
+ if (es.length <= i)
+ return [];
+ var e = es[i], ans = fit(acc, e, subtreeOffset, siblingOffset, 0);
+ return [ ans ].concat($fitlistl(merge(acc, moveextent(e, ans)), es, ++i));
+ }
+ ;
+ return $fitlistl( [], es, 0);
+ }
+
+
+ function fitlistr(es, subtreeOffset, siblingOffset) {
+ function $fitlistr(acc, es, i) {
+ if (es.length <= i)
+ return [];
+ var e = es[i], ans = -fit(e, acc, subtreeOffset, siblingOffset, 0);
+ return [ ans ].concat($fitlistr(merge(moveextent(e, ans), acc), es, ++i));
+ }
+ ;
+ es = slice.call(es);
+ var ans = $fitlistr( [], es.reverse(), 0);
+ return ans.reverse();
+ }
+
+
+ function fitlist(es, subtreeOffset, siblingOffset, align) {
+ var esl = fitlistl(es, subtreeOffset, siblingOffset), esr = fitlistr(es,
+ subtreeOffset, siblingOffset);
+
+ if (align == "left")
+ esr = esl;
+ else if (align == "right")
+ esl = esr;
+
+ for ( var i = 0, ans = []; i < esl.length; i++) {
+ ans[i] = (esl[i] + esr[i]) / 2;
+ }
+ return ans;
+ }
+
+
+ function design(graph, node, prop, config, orn) {
+ var multitree = config.multitree;
+ var auxp = [ 'x', 'y' ], auxs = [ 'width', 'height' ];
+ var ind = +(orn == "left" || orn == "right");
+ var p = auxp[ind], notp = auxp[1 - ind];
+
+ var cnode = config.Node;
+ var s = auxs[ind], nots = auxs[1 - ind];
+
+ var siblingOffset = config.siblingOffset;
+ var subtreeOffset = config.subtreeOffset;
+ var align = config.align;
+
+ function $design(node, maxsize, acum) {
+ var sval = node.getData(s, prop);
+ var notsval = maxsize
+ || (node.getData(nots, prop));
+
+ var trees = [], extents = [], chmaxsize = false;
+ var chacum = notsval + config.levelDistance;
+ node.eachSubnode(function(n) {
+ if (n.exist
+ && (!multitree || ('$orn' in n.data) && n.data.$orn == orn)) {
+
+ if (!chmaxsize)
+ chmaxsize = getBoundaries(graph, config, n._depth, orn, prop);
+
+ var s = $design(n, chmaxsize[nots], acum + chacum);
+ trees.push(s.tree);
+ extents.push(s.extent);
+ }
+ });
+ var positions = fitlist(extents, subtreeOffset, siblingOffset, align);
+ for ( var i = 0, ptrees = [], pextents = []; i < trees.length; i++) {
+ movetree(trees[i], prop, positions[i], orn);
+ pextents.push(moveextent(extents[i], positions[i]));
+ }
+ var resultextent = [ [ -sval / 2, sval / 2 ] ]
+ .concat(mergelist(pextents));
+ node.getPos(prop)[p] = 0;
+
+ if (orn == "top" || orn == "left") {
+ node.getPos(prop)[notp] = acum;
+ } else {
+ node.getPos(prop)[notp] = -acum;
+ }
+
+ return {
+ tree : node,
+ extent : resultextent
+ };
+ }
+
+ $design(node, false, 0);
+ }
+
+
+ return new Class({
+ /*
+ Method: compute
+
+ Computes nodes' positions.
+
+ */
+ compute : function(property, computeLevels) {
+ var prop = property || 'start';
+ var node = this.graph.getNode(this.root);
+ $.extend(node, {
+ 'drawn' : true,
+ 'exist' : true,
+ 'selected' : true
+ });
+ NodeDim.compute(this.graph, prop, this.config);
+ if (!!computeLevels || !("_depth" in node)) {
+ this.graph.computeLevels(this.root, 0, "ignore");
+ }
+
+ this.computePositions(node, prop);
+ },
+
+ computePositions : function(node, prop) {
+ var config = this.config;
+ var multitree = config.multitree;
+ var align = config.align;
+ var indent = align !== 'center' && config.indent;
+ var orn = config.orientation;
+ var orns = multitree ? [ 'top', 'right', 'bottom', 'left' ] : [ orn ];
+ var that = this;
+ $.each(orns, function(orn) {
+ //calculate layout
+ design(that.graph, node, prop, that.config, orn, prop);
+ var i = [ 'x', 'y' ][+(orn == "left" || orn == "right")];
+ //absolutize
+ (function red(node) {
+ node.eachSubnode(function(n) {
+ if (n.exist
+ && (!multitree || ('$orn' in n.data) && n.data.$orn == orn)) {
+
+ n.getPos(prop)[i] += node.getPos(prop)[i];
+ if (indent) {
+ n.getPos(prop)[i] += align == 'left' ? indent : -indent;
+ }
+ red(n);
+ }
+ });
+ })(node);
+ });
+ }
+ });
+
+})();
+
+/*
+ * File: Spacetree.js
+ */
+
+/*
+ Class: ST
+
+ A Tree layout with advanced contraction and expansion animations.
+
+ Inspired by:
+
+ SpaceTree: Supporting Exploration in Large Node Link Tree, Design Evolution and Empirical Evaluation (Catherine Plaisant, Jesse Grosjean, Benjamin B. Bederson)
+ <http://hcil.cs.umd.edu/trs/2002-05/2002-05.pdf>
+
+ Drawing Trees (Andrew J. Kennedy) <http://research.microsoft.com/en-us/um/people/akenn/fun/drawingtrees.pdf>
+
+ Note:
+
+ This visualization was built and engineered from scratch, taking only the papers as inspiration, and only shares some features with the visualization described in those papers.
+
+ Implements:
+
+ All <Loader> methods
+
+ Constructor Options:
+
+ Inherits options from
+
+ - <Options.Canvas>
+ - <Options.Controller>
+ - <Options.Tree>
+ - <Options.Node>
+ - <Options.Edge>
+ - <Options.Label>
+ - <Options.Events>
+ - <Options.Tips>
+ - <Options.NodeStyles>
+ - <Options.Navigation>
+
+ Additionally, there are other parameters and some default values changed
+
+ constrained - (boolean) Default's *true*. Whether to show the entire tree when loaded or just the number of levels specified by _levelsToShow_.
+ levelsToShow - (number) Default's *2*. The number of levels to show for a subtree. This number is relative to the selected node.
+ levelDistance - (number) Default's *30*. The distance between two consecutive levels of the tree.
+ Node.type - Described in <Options.Node>. Default's set to *rectangle*.
+ offsetX - (number) Default's *0*. The x-offset distance from the selected node to the center of the canvas.
+ offsetY - (number) Default's *0*. The y-offset distance from the selected node to the center of the canvas.
+ duration - Described in <Options.Fx>. It's default value has been changed to *700*.
+
+ Instance Properties:
+
+ canvas - Access a <Canvas> instance.
+ graph - Access a <Graph> instance.
+ op - Access a <ST.Op> instance.
+ fx - Access a <ST.Plot> instance.
+ labels - Access a <ST.Label> interface implementation.
+
+ */
+
+$jit.ST= (function() {
+ // Define some private methods first...
+ // Nodes in path
+ var nodesInPath = [];
+ // Nodes to contract
+ function getNodesToHide(node) {
+ node = node || this.clickedNode;
+ if(!this.config.constrained) {
+ return [];
+ }
+ var Geom = this.geom;
+ var graph = this.graph;
+ var canvas = this.canvas;
+ var level = node._depth, nodeArray = [];
+ graph.eachNode(function(n) {
+ if(n.exist && !n.selected) {
+ if(n.isDescendantOf(node.id)) {
+ if(n._depth <= level) nodeArray.push(n);
+ } else {
+ nodeArray.push(n);
+ }
+ }
+ });
+ var leafLevel = Geom.getRightLevelToShow(node, canvas);
+ node.eachLevel(leafLevel, leafLevel, function(n) {
+ if(n.exist && !n.selected) nodeArray.push(n);
+ });
+
+ for (var i = 0; i < nodesInPath.length; i++) {
+ var n = this.graph.getNode(nodesInPath[i]);
+ if(!n.isDescendantOf(node.id)) {
+ nodeArray.push(n);
+ }
+ }
+ return nodeArray;
+ };
+ // Nodes to expand
+ function getNodesToShow(node) {
+ var nodeArray = [], config = this.config;
+ node = node || this.clickedNode;
+ this.clickedNode.eachLevel(0, config.levelsToShow, function(n) {
+ if(config.multitree && !('$orn' in n.data)
+ && n.anySubnode(function(ch){ return ch.exist && !ch.drawn; })) {
+ nodeArray.push(n);
+ } else if(n.drawn && !n.anySubnode("drawn")) {
+ nodeArray.push(n);
+ }
+ });
+ return nodeArray;
+ };
+ // Now define the actual class.
+ return new Class({
+
+ Implements: [Loader, Extras, Layouts.Tree],
+
+ initialize: function(controller) {
+ var $ST = $jit.ST;
+
+ var config= {
+ levelsToShow: 2,
+ levelDistance: 30,
+ constrained: true,
+ Node: {
+ type: 'rectangle'
+ },
+ duration: 700,
+ offsetX: 0,
+ offsetY: 0
+ };
+
+ this.controller = this.config = $.merge(
+ Options("Canvas", "Fx", "Tree", "Node", "Edge", "Controller",
+ "Tips", "NodeStyles", "Events", "Navigation", "Label"), config, controller);
+
+ var canvasConfig = this.config;
+ if(canvasConfig.useCanvas) {
+ this.canvas = canvasConfig.useCanvas;
+ this.config.labelContainer = this.canvas.id + '-label';
+ } else {
+ if(canvasConfig.background) {
+ canvasConfig.background = $.merge({
+ type: 'Circles'
+ }, canvasConfig.background);
+ }
+ this.canvas = new Canvas(this, canvasConfig);
+ this.config.labelContainer = (typeof canvasConfig.injectInto == 'string'? canvasConfig.injectInto : canvasConfig.injectInto.id) + '-label';
+ }
+
+ this.graphOptions = {
+ 'complex': true
+ };
+ this.graph = new Graph(this.graphOptions, this.config.Node, this.config.Edge);
+ this.labels = new $ST.Label[canvasConfig.Label.type](this);
+ this.fx = new $ST.Plot(this, $ST);
+ this.op = new $ST.Op(this);
+ this.group = new $ST.Group(this);
+ this.geom = new $ST.Geom(this);
+ this.clickedNode= null;
+ // initialize extras
+ this.initializeExtras();
+ },
+
+ /*
+ Method: plot
+
+ Plots the <ST>. This is a shortcut to *fx.plot*.
+
+ */
+ plot: function() { this.fx.plot(this.controller); },
+
+
+ /*
+ Method: switchPosition
+
+ Switches the tree orientation.
+
+ Parameters:
+
+ pos - (string) The new tree orientation. Possible values are "top", "left", "right" and "bottom".
+ method - (string) Set this to "animate" if you want to animate the tree when switching its position. You can also set this parameter to "replot" to just replot the subtree.
+ onComplete - (optional|object) This callback is called once the "switching" animation is complete.
+
+ Example:
+
+ (start code js)
+ st.switchPosition("right", "animate", {
+ onComplete: function() {
+ alert('completed!');
+ }
+ });
+ (end code)
+ */
+ switchPosition: function(pos, method, onComplete) {
+ var Geom = this.geom, Plot = this.fx, that = this;
+ if(!Plot.busy) {
+ Plot.busy = true;
+ this.contract({
+ onComplete: function() {
+ Geom.switchOrientation(pos);
+ that.compute('end', false);
+ Plot.busy = false;
+ if(method == 'animate') {
+ that.onClick(that.clickedNode.id, onComplete);
+ } else if(method == 'replot') {
+ that.select(that.clickedNode.id, onComplete);
+ }
+ }
+ }, pos);
+ }
+ },
+
+ /*
+ Method: switchAlignment
+
+ Switches the tree alignment.
+
+ Parameters:
+
+ align - (string) The new tree alignment. Possible values are "left", "center" and "right".
+ method - (string) Set this to "animate" if you want to animate the tree after aligning its position. You can also set this parameter to "replot" to just replot the subtree.
+ onComplete - (optional|object) This callback is called once the "switching" animation is complete.
+
+ Example:
+
+ (start code js)
+ st.switchAlignment("right", "animate", {
+ onComplete: function() {
+ alert('completed!');
+ }
+ });
+ (end code)
+ */
+ switchAlignment: function(align, method, onComplete) {
+ this.config.align = align;
+ if(method == 'animate') {
+ this.select(this.clickedNode.id, onComplete);
+ } else if(method == 'replot') {
+ this.onClick(this.clickedNode.id, onComplete);
+ }
+ },
+
+ /*
+ Method: addNodeInPath
+
+ Adds a node to the current path as selected node. The selected node will be visible (as in non-collapsed) at all times.
+
+
+ Parameters:
+
+ id - (string) A <Graph.Node> id.
+
+ Example:
+
+ (start code js)
+ st.addNodeInPath("nodeId");
+ (end code)
+ */
+ addNodeInPath: function(id) {
+ nodesInPath.push(id);
+ this.select((this.clickedNode && this.clickedNode.id) || this.root);
+ },
+
+ /*
+ Method: clearNodesInPath
+
+ Removes all nodes tagged as selected by the <ST.addNodeInPath> method.
+
+ See also:
+
+ <ST.addNodeInPath>
+
+ Example:
+
+ (start code js)
+ st.clearNodesInPath();
+ (end code)
+ */
+ clearNodesInPath: function(id) {
+ nodesInPath.length = 0;
+ this.select((this.clickedNode && this.clickedNode.id) || this.root);
+ },
+
+ /*
+ Method: refresh
+
+ Computes positions and plots the tree.
+
+ */
+ refresh: function() {
+ this.reposition();
+ this.select((this.clickedNode && this.clickedNode.id) || this.root);
+ },
+
+ reposition: function() {
+ this.graph.computeLevels(this.root, 0, "ignore");
+ this.geom.setRightLevelToShow(this.clickedNode, this.canvas);
+ this.graph.eachNode(function(n) {
+ if(n.exist) n.drawn = true;
+ });
+ this.compute('end');
+ },
+
+ requestNodes: function(node, onComplete) {
+ var handler = $.merge(this.controller, onComplete),
+ lev = this.config.levelsToShow;
+ if(handler.request) {
+ var leaves = [], d = node._depth;
+ node.eachLevel(0, lev, function(n) {
+ if(n.drawn &&
+ !n.anySubnode()) {
+ leaves.push(n);
+ n._level = lev - (n._depth - d);
+ }
+ });
+ this.group.requestNodes(leaves, handler);
+ }
+ else
+ handler.onComplete();
+ },
+
+ contract: function(onComplete, switched) {
+ var orn = this.config.orientation;
+ var Geom = this.geom, Group = this.group;
+ if(switched) Geom.switchOrientation(switched);
+ var nodes = getNodesToHide.call(this);
+ if(switched) Geom.switchOrientation(orn);
+ Group.contract(nodes, $.merge(this.controller, onComplete));
+ },
+
+ move: function(node, onComplete) {
+ this.compute('end', false);
+ var move = onComplete.Move, offset = {
+ 'x': move.offsetX,
+ 'y': move.offsetY
+ };
+ if(move.enable) {
+ this.geom.translate(node.endPos.add(offset).$scale(-1), "end");
+ }
+ this.fx.animate($.merge(this.controller, { modes: ['linear'] }, onComplete));
+ },
+
+ expand: function (node, onComplete) {
+ var nodeArray = getNodesToShow.call(this, node);
+ this.group.expand(nodeArray, $.merge(this.controller, onComplete));
+ },
+
+ selectPath: function(node) {
+ var that = this;
+ this.graph.eachNode(function(n) { n.selected = false; });
+ function path(node) {
+ if(node == null || node.selected) return;
+ node.selected = true;
+ $.each(that.group.getSiblings([node])[node.id],
+ function(n) {
+ n.exist = true;
+ n.drawn = true;
+ });
+ var parents = node.getParents();
+ parents = (parents.length > 0)? parents[0] : null;
+ path(parents);
+ };
+ for(var i=0, ns = [node.id].concat(nodesInPath); i < ns.length; i++) {
+ path(this.graph.getNode(ns[i]));
+ }
+ },
+
+ /*
+ Method: setRoot
+
+ Switches the current root node. Changes the topology of the Tree.
+
+ Parameters:
+ id - (string) The id of the node to be set as root.
+ method - (string) Set this to "animate" if you want to animate the tree after adding the subtree. You can also set this parameter to "replot" to just replot the subtree.
+ onComplete - (optional|object) An action to perform after the animation (if any).
+
+ Example:
+
+ (start code js)
+ st.setRoot('nodeId', 'animate', {
+ onComplete: function() {
+ alert('complete!');
+ }
+ });
+ (end code)
+ */
+ setRoot: function(id, method, onComplete) {
+ if(this.busy) return;
+ this.busy = true;
+ var that = this, canvas = this.canvas;
+ var rootNode = this.graph.getNode(this.root);
+ var clickedNode = this.graph.getNode(id);
+ function $setRoot() {
+ if(this.config.multitree && clickedNode.data.$orn) {
+ var orn = clickedNode.data.$orn;
+ var opp = {
+ 'left': 'right',
+ 'right': 'left',
+ 'top': 'bottom',
+ 'bottom': 'top'
+ }[orn];
+ rootNode.data.$orn = opp;
+ (function tag(rootNode) {
+ rootNode.eachSubnode(function(n) {
+ if(n.id != id) {
+ n.data.$orn = opp;
+ tag(n);
+ }
+ });
+ })(rootNode);
+ delete clickedNode.data.$orn;
+ }
+ this.root = id;
+ this.clickedNode = clickedNode;
+ this.graph.computeLevels(this.root, 0, "ignore");
+ this.geom.setRightLevelToShow(clickedNode, canvas, {
+ execHide: false,
+ onShow: function(node) {
+ if(!node.drawn) {
+ node.drawn = true;
+ node.setData('alpha', 1, 'end');
+ node.setData('alpha', 0);
+ node.pos.setc(clickedNode.pos.x, clickedNode.pos.y);
+ }
+ }
+ });
+ this.compute('end');
+ this.busy = true;
+ this.fx.animate({
+ modes: ['linear', 'node-property:alpha'],
+ onComplete: function() {
+ that.busy = false;
+ that.onClick(id, {
+ onComplete: function() {
+ onComplete && onComplete.onComplete();
+ }
+ });
+ }
+ });
+ }
+
+ // delete previous orientations (if any)
+ delete rootNode.data.$orns;
+
+ if(method == 'animate') {
+ $setRoot.call(this);
+ that.selectPath(clickedNode);
+ } else if(method == 'replot') {
+ $setRoot.call(this);
+ this.select(this.root);
+ }
+ },
+
+ /*
+ Method: addSubtree
+
+ Adds a subtree.
+
+ Parameters:
+ subtree - (object) A JSON Tree object. See also <Loader.loadJSON>.
+ method - (string) Set this to "animate" if you want to animate the tree after adding the subtree. You can also set this parameter to "replot" to just replot the subtree.
+ onComplete - (optional|object) An action to perform after the animation (if any).
+
+ Example:
+
+ (start code js)
+ st.addSubtree(json, 'animate', {
+ onComplete: function() {
+ alert('complete!');
+ }
+ });
+ (end code)
+ */
+ addSubtree: function(subtree, method, onComplete) {
+ if(method == 'replot') {
+ this.op.sum(subtree, $.extend({ type: 'replot' }, onComplete || {}));
+ } else if (method == 'animate') {
+ this.op.sum(subtree, $.extend({ type: 'fade:seq' }, onComplete || {}));
+ }
+ },
+
+ /*
+ Method: removeSubtree
+
+ Removes a subtree.
+
+ Parameters:
+ id - (string) The _id_ of the subtree to be removed.
+ removeRoot - (boolean) Default's *false*. Remove the root of the subtree or only its subnodes.
+ method - (string) Set this to "animate" if you want to animate the tree after removing the subtree. You can also set this parameter to "replot" to just replot the subtree.
+ onComplete - (optional|object) An action to perform after the animation (if any).
+
+ Example:
+
+ (start code js)
+ st.removeSubtree('idOfSubtreeToBeRemoved', false, 'animate', {
+ onComplete: function() {
+ alert('complete!');
+ }
+ });
+ (end code)
+
+ */
+ removeSubtree: function(id, removeRoot, method, onComplete) {
+ var node = this.graph.getNode(id), subids = [];
+ node.eachLevel(+!removeRoot, false, function(n) {
+ subids.push(n.id);
+ });
+ if(method == 'replot') {
+ this.op.removeNode(subids, $.extend({ type: 'replot' }, onComplete || {}));
+ } else if (method == 'animate') {
+ this.op.removeNode(subids, $.extend({ type: 'fade:seq'}, onComplete || {}));
+ }
+ },
+
+ /*
+ Method: select
+
+ Selects a node in the <ST> without performing an animation. Useful when selecting
+ nodes which are currently hidden or deep inside the tree.
+
+ Parameters:
+ id - (string) The id of the node to select.
+ onComplete - (optional|object) an onComplete callback.
+
+ Example:
+ (start code js)
+ st.select('mynodeid', {
+ onComplete: function() {
+ alert('complete!');
+ }
+ });
+ (end code)
+ */
+ select: function(id, onComplete) {
+ var group = this.group, geom = this.geom;
+ var node= this.graph.getNode(id), canvas = this.canvas;
+ var root = this.graph.getNode(this.root);
+ var complete = $.merge(this.controller, onComplete);
+ var that = this;
+
+ complete.onBeforeCompute(node);
+ this.selectPath(node);
+ this.clickedNode= node;
+ this.requestNodes(node, {
+ onComplete: function(){
+ group.hide(group.prepare(getNodesToHide.call(that)), complete);
+ geom.setRightLevelToShow(node, canvas);
+ that.compute("current");
+ that.graph.eachNode(function(n) {
+ var pos = n.pos.getc(true);
+ n.startPos.setc(pos.x, pos.y);
+ n.endPos.setc(pos.x, pos.y);
+ n.visited = false;
+ });
+ var offset = { x: complete.offsetX, y: complete.offsetY };
+ that.geom.translate(node.endPos.add(offset).$scale(-1), ["start", "current", "end"]);
+ group.show(getNodesToShow.call(that));
+ that.plot();
+ complete.onAfterCompute(that.clickedNode);
+ complete.onComplete();
+ }
+ });
+ },
+
+ /*
+ Method: onClick
+
+ Animates the <ST> to center the node specified by *id*.
+
+ Parameters:
+
+ id - (string) A node id.
+ options - (optional|object) A group of options and callbacks described below.
+ onComplete - (object) An object callback called when the animation finishes.
+ Move - (object) An object that has as properties _offsetX_ or _offsetY_ for adding some offset position to the centered node.
+
+ Example:
+
+ (start code js)
+ st.onClick('mynodeid', {
+ Move: {
+ enable: true,
+ offsetX: 30,
+ offsetY: 5
+ },
+ onComplete: function() {
+ alert('yay!');
+ }
+ });
+ (end code)
+
+ */
+ onClick: function (id, options) {
+ var canvas = this.canvas, that = this, Geom = this.geom, config = this.config;
+ var innerController = {
+ Move: {
+ enable: true,
+ offsetX: config.offsetX || 0,
+ offsetY: config.offsetY || 0
+ },
+ setRightLevelToShowConfig: false,
+ onBeforeRequest: $.empty,
+ onBeforeContract: $.empty,
+ onBeforeMove: $.empty,
+ onBeforeExpand: $.empty
+ };
+ var complete = $.merge(this.controller, innerController, options);
+
+ if(!this.busy) {
+ this.busy = true;
+ var node = this.graph.getNode(id);
+ this.selectPath(node, this.clickedNode);
+ this.clickedNode = node;
+ complete.onBeforeCompute(node);
+ complete.onBeforeRequest(node);
+ this.requestNodes(node, {
+ onComplete: function() {
+ complete.onBeforeContract(node);
+ that.contract({
+ onComplete: function() {
+ Geom.setRightLevelToShow(node, canvas, complete.setRightLevelToShowConfig);
+ complete.onBeforeMove(node);
+ that.move(node, {
+ Move: complete.Move,
+ onComplete: function() {
+ complete.onBeforeExpand(node);
+ that.expand(node, {
+ onComplete: function() {
+ that.busy = false;
+ complete.onAfterCompute(id);
+ complete.onComplete();
+ }
+ }); // expand
+ }
+ }); // move
+ }
+ });// contract
+ }
+ });// request
+ }
+ }
+ });
+
+})();
+
+$jit.ST.$extend = true;
+
+/*
+ Class: ST.Op
+
+ Custom extension of <Graph.Op>.
+
+ Extends:
+
+ All <Graph.Op> methods
+
+ See also:
+
+ <Graph.Op>
+
+*/
+$jit.ST.Op = new Class({
+
+ Implements: Graph.Op
+
+});
+
+/*
+
+ Performs operations on group of nodes.
+
+*/
+$jit.ST.Group = new Class({
+
+ initialize: function(viz) {
+ this.viz = viz;
+ this.canvas = viz.canvas;
+ this.config = viz.config;
+ this.animation = new Animation;
+ this.nodes = null;
+ },
+
+ /*
+
+ Calls the request method on the controller to request a subtree for each node.
+ */
+ requestNodes: function(nodes, controller) {
+ var counter = 0, len = nodes.length, nodeSelected = {};
+ var complete = function() { controller.onComplete(); };
+ var viz = this.viz;
+ if(len == 0) complete();
+ for(var i=0; i<len; i++) {
+ nodeSelected[nodes[i].id] = nodes[i];
+ controller.request(nodes[i].id, nodes[i]._level, {
+ onComplete: function(nodeId, data) {
+ if(data && data.children) {
+ data.id = nodeId;
+ viz.op.sum(data, { type: 'nothing' });
+ }
+ if(++counter == len) {
+ viz.graph.computeLevels(viz.root, 0);
+ complete();
+ }
+ }
+ });
+ }
+ },
+
+ /*
+
+ Collapses group of nodes.
+ */
+ contract: function(nodes, controller) {
+ var viz = this.viz;
+ var that = this;
+
+ nodes = this.prepare(nodes);
+ this.animation.setOptions($.merge(controller, {
+ $animating: false,
+ compute: function(delta) {
+ if(delta == 1) delta = 0.99;
+ that.plotStep(1 - delta, controller, this.$animating);
+ this.$animating = 'contract';
+ },
+
+ complete: function() {
+ that.hide(nodes, controller);
+ }
+ })).start();
+ },
+
+ hide: function(nodes, controller) {
+ var viz = this.viz;
+ for(var i=0; i<nodes.length; i++) {
+ // TODO nodes are requested on demand, but not
+ // deleted when hidden. Would that be a good feature?
+ // Currently that feature is buggy, so I'll turn it off
+ // Actually this feature is buggy because trimming should take
+ // place onAfterCompute and not right after collapsing nodes.
+ if (true || !controller || !controller.request) {
+ nodes[i].eachLevel(1, false, function(elem){
+ if (elem.exist) {
+ $.extend(elem, {
+ 'drawn': false,
+ 'exist': false
+ });
+ }
+ });
+ } else {
+ var ids = [];
+ nodes[i].eachLevel(1, false, function(n) {
+ ids.push(n.id);
+ });
+ viz.op.removeNode(ids, { 'type': 'nothing' });
+ viz.labels.clearLabels();
+ }
+ }
+ controller.onComplete();
+ },
+
+
+ /*
+ Expands group of nodes.
+ */
+ expand: function(nodes, controller) {
+ var that = this;
+ this.show(nodes);
+ this.animation.setOptions($.merge(controller, {
+ $animating: false,
+ compute: function(delta) {
+ that.plotStep(delta, controller, this.$animating);
+ this.$animating = 'expand';
+ },
+
+ complete: function() {
+ that.plotStep(undefined, controller, false);
+ controller.onComplete();
+ }
+ })).start();
+
+ },
+
+ show: function(nodes) {
+ var config = this.config;
+ this.prepare(nodes);
+ $.each(nodes, function(n) {
+ // check for root nodes if multitree
+ if(config.multitree && !('$orn' in n.data)) {
+ delete n.data.$orns;
+ var orns = ' ';
+ n.eachSubnode(function(ch) {
+ if(('$orn' in ch.data)
+ && orns.indexOf(ch.data.$orn) < 0
+ && ch.exist && !ch.drawn) {
+ orns += ch.data.$orn + ' ';
+ }
+ });
+ n.data.$orns = orns;
+ }
+ n.eachLevel(0, config.levelsToShow, function(n) {
+ if(n.exist) n.drawn = true;
+ });
+ });
+ },
+
+ prepare: function(nodes) {
+ this.nodes = this.getNodesWithChildren(nodes);
+ return this.nodes;
+ },
+
+ /*
+ Filters an array of nodes leaving only nodes with children.
+ */
+ getNodesWithChildren: function(nodes) {
+ var ans = [], config = this.config, root = this.viz.root;
+ nodes.sort(function(a, b) { return (a._depth <= b._depth) - (a._depth >= b._depth); });
+ for(var i=0; i<nodes.length; i++) {
+ if(nodes[i].anySubnode("exist")) {
+ for (var j = i+1, desc = false; !desc && j < nodes.length; j++) {
+ if(!config.multitree || '$orn' in nodes[j].data) {
+ desc = desc || nodes[i].isDescendantOf(nodes[j].id);
+ }
+ }
+ if(!desc) ans.push(nodes[i]);
+ }
+ }
+ return ans;
+ },
+
+ plotStep: function(delta, controller, animating) {
+ var viz = this.viz,
+ config = this.config,
+ canvas = viz.canvas,
+ ctx = canvas.getCtx(),
+ nodes = this.nodes;
+ var i, node;
+ // hide nodes that are meant to be collapsed/expanded
+ var nds = {};
+ for(i=0; i<nodes.length; i++) {
+ node = nodes[i];
+ nds[node.id] = [];
+ var root = config.multitree && !('$orn' in node.data);
+ var orns = root && node.data.$orns;
+ node.eachSubgraph(function(n) {
+ // TODO(nico): Cleanup
+ // special check for root node subnodes when
+ // multitree is checked.
+ if(root && orns && orns.indexOf(n.data.$orn) > 0
+ && n.drawn) {
+ n.drawn = false;
+ nds[node.id].push(n);
+ } else if((!root || !orns) && n.drawn) {
+ n.drawn = false;
+ nds[node.id].push(n);
+ }
+ });
+ node.drawn = true;
+ }
+ // plot the whole (non-scaled) tree
+ if(nodes.length > 0) viz.fx.plot();
+ // show nodes that were previously hidden
+ for(i in nds) {
+ $.each(nds[i], function(n) { n.drawn = true; });
+ }
+ // plot each scaled subtree
+ for(i=0; i<nodes.length; i++) {
+ node = nodes[i];
+ ctx.save();
+ viz.fx.plotSubtree(node, controller, delta, animating);
+ ctx.restore();
+ }
+ },
+
+ getSiblings: function(nodes) {
+ var siblings = {};
+ $.each(nodes, function(n) {
+ var par = n.getParents();
+ if (par.length == 0) {
+ siblings[n.id] = [n];
+ } else {
+ var ans = [];
+ par[0].eachSubnode(function(sn) {
+ ans.push(sn);
+ });
+ siblings[n.id] = ans;
+ }
+ });
+ return siblings;
+ }
+});
+
+/*
+ ST.Geom
+
+ Performs low level geometrical computations.
+
+ Access:
+
+ This instance can be accessed with the _geom_ parameter of the st instance created.
+
+ Example:
+
+ (start code js)
+ var st = new ST(canvas, config);
+ st.geom.translate //or can also call any other <ST.Geom> method
+ (end code)
+
+*/
+
+$jit.ST.Geom = new Class({
+ Implements: Graph.Geom,
+ /*
+ Changes the tree current orientation to the one specified.
+
+ You should usually use <ST.switchPosition> instead.
+ */
+ switchOrientation: function(orn) {
+ this.config.orientation = orn;
+ },
+
+ /*
+ Makes a value dispatch according to the current layout
+ Works like a CSS property, either _top-right-bottom-left_ or _top|bottom - left|right_.
+ */
+ dispatch: function() {
+ // TODO(nico) should store Array.prototype.slice.call somewhere.
+ var args = Array.prototype.slice.call(arguments);
+ var s = args.shift(), len = args.length;
+ var val = function(a) { return typeof a == 'function'? a() : a; };
+ if(len == 2) {
+ return (s == "top" || s == "bottom")? val(args[0]) : val(args[1]);
+ } else if(len == 4) {
+ switch(s) {
+ case "top": return val(args[0]);
+ case "right": return val(args[1]);
+ case "bottom": return val(args[2]);
+ case "left": return val(args[3]);
+ }
+ }
+ return undefined;
+ },
+
+ /*
+ Returns label height or with, depending on the tree current orientation.
+ */
+ getSize: function(n, invert) {
+ var data = n.data, config = this.config;
+ var siblingOffset = config.siblingOffset;
+ var s = (config.multitree
+ && ('$orn' in data)
+ && data.$orn) || config.orientation;
+ var w = n.getData('width') + siblingOffset;
+ var h = n.getData('height') + siblingOffset;
+ if(!invert)
+ return this.dispatch(s, h, w);
+ else
+ return this.dispatch(s, w, h);
+ },
+
+ /*
+ Calculates a subtree base size. This is an utility function used by _getBaseSize_
+ */
+ getTreeBaseSize: function(node, level, leaf) {
+ var size = this.getSize(node, true), baseHeight = 0, that = this;
+ if(leaf(level, node)) return size;
+ if(level === 0) return 0;
+ node.eachSubnode(function(elem) {
+ baseHeight += that.getTreeBaseSize(elem, level -1, leaf);
+ });
+ return (size > baseHeight? size : baseHeight) + this.config.subtreeOffset;
+ },
+
+
+ /*
+ getEdge
+
+ Returns a Complex instance with the begin or end position of the edge to be plotted.
+
+ Parameters:
+
+ node - A <Graph.Node> that is connected to this edge.
+ type - Returns the begin or end edge position. Possible values are 'begin' or 'end'.
+
+ Returns:
+
+ A <Complex> number specifying the begin or end position.
+ */
+ getEdge: function(node, type, s) {
+ var $C = function(a, b) {
+ return function(){
+ return node.pos.add(new Complex(a, b));
+ };
+ };
+ var dim = this.node;
+ var w = node.getData('width');
+ var h = node.getData('height');
+
+ if(type == 'begin') {
+ if(dim.align == "center") {
+ return this.dispatch(s, $C(0, h/2), $C(-w/2, 0),
+ $C(0, -h/2),$C(w/2, 0));
+ } else if(dim.align == "left") {
+ return this.dispatch(s, $C(0, h), $C(0, 0),
+ $C(0, 0), $C(w, 0));
+ } else if(dim.align == "right") {
+ return this.dispatch(s, $C(0, 0), $C(-w, 0),
+ $C(0, -h),$C(0, 0));
+ } else throw "align: not implemented";
+
+
+ } else if(type == 'end') {
+ if(dim.align == "center") {
+ return this.dispatch(s, $C(0, -h/2), $C(w/2, 0),
+ $C(0, h/2), $C(-w/2, 0));
+ } else if(dim.align == "left") {
+ return this.dispatch(s, $C(0, 0), $C(w, 0),
+ $C(0, h), $C(0, 0));
+ } else if(dim.align == "right") {
+ return this.dispatch(s, $C(0, -h),$C(0, 0),
+ $C(0, 0), $C(-w, 0));
+ } else throw "align: not implemented";
+ }
+ },
+
+ /*
+ Adjusts the tree position due to canvas scaling or translation.
+ */
+ getScaledTreePosition: function(node, scale) {
+ var dim = this.node;
+ var w = node.getData('width');
+ var h = node.getData('height');
+ var s = (this.config.multitree
+ && ('$orn' in node.data)
+ && node.data.$orn) || this.config.orientation;
+
+ var $C = function(a, b) {
+ return function(){
+ return node.pos.add(new Complex(a, b)).$scale(1 - scale);
+ };
+ };
+ if(dim.align == "left") {
+ return this.dispatch(s, $C(0, h), $C(0, 0),
+ $C(0, 0), $C(w, 0));
+ } else if(dim.align == "center") {
+ return this.dispatch(s, $C(0, h / 2), $C(-w / 2, 0),
+ $C(0, -h / 2),$C(w / 2, 0));
+ } else if(dim.align == "right") {
+ return this.dispatch(s, $C(0, 0), $C(-w, 0),
+ $C(0, -h),$C(0, 0));
+ } else throw "align: not implemented";
+ },
+
+ /*
+ treeFitsInCanvas
+
+ Returns a Boolean if the current subtree fits in canvas.
+
+ Parameters:
+
+ node - A <Graph.Node> which is the current root of the subtree.
+ canvas - The <Canvas> object.
+ level - The depth of the subtree to be considered.
+ */
+ treeFitsInCanvas: function(node, canvas, level) {
+ var csize = canvas.getSize();
+ var s = (this.config.multitree
+ && ('$orn' in node.data)
+ && node.data.$orn) || this.config.orientation;
+
+ var size = this.dispatch(s, csize.width, csize.height);
+ var baseSize = this.getTreeBaseSize(node, level, function(level, node) {
+ return level === 0 || !node.anySubnode();
+ });
+ return (baseSize < size);
+ }
+});
+
+/*
+ Class: ST.Plot
+
+ Custom extension of <Graph.Plot>.
+
+ Extends:
+
+ All <Graph.Plot> methods
+
+ See also:
+
+ <Graph.Plot>
+
+*/
+$jit.ST.Plot = new Class({
+
+ Implements: Graph.Plot,
+
+ /*
+ Plots a subtree from the spacetree.
+ */
+ plotSubtree: function(node, opt, scale, animating) {
+ var viz = this.viz, canvas = viz.canvas, config = viz.config;
+ scale = Math.min(Math.max(0.001, scale), 1);
+ if(scale >= 0) {
+ node.drawn = false;
+ var ctx = canvas.getCtx();
+ var diff = viz.geom.getScaledTreePosition(node, scale);
+ ctx.translate(diff.x, diff.y);
+ ctx.scale(scale, scale);
+ }
+ this.plotTree(node, $.merge(opt, {
+ 'withLabels': true,
+ 'hideLabels': !!scale,
+ 'plotSubtree': function(n, ch) {
+ var root = config.multitree && !('$orn' in node.data);
+ var orns = root && node.getData('orns');
+ return !root || orns.indexOf(elem.getData('orn')) > -1;
+ }
+ }), animating);
+ if(scale >= 0) node.drawn = true;
+ },
+
+ /*
+ Method: getAlignedPos
+
+ Returns a *x, y* object with the position of the top/left corner of a <ST> node.
+
+ Parameters:
+
+ pos - (object) A <Graph.Node> position.
+ width - (number) The width of the node.
+ height - (number) The height of the node.
+
+ */
+ getAlignedPos: function(pos, width, height) {
+ var nconfig = this.node;
+ var square, orn;
+ if(nconfig.align == "center") {
+ square = {
+ x: pos.x - width / 2,
+ y: pos.y - height / 2
+ };
+ } else if (nconfig.align == "left") {
+ orn = this.config.orientation;
+ if(orn == "bottom" || orn == "top") {
+ square = {
+ x: pos.x - width / 2,
+ y: pos.y
+ };
+ } else {
+ square = {
+ x: pos.x,
+ y: pos.y - height / 2
+ };
+ }
+ } else if(nconfig.align == "right") {
+ orn = this.config.orientation;
+ if(orn == "bottom" || orn == "top") {
+ square = {
+ x: pos.x - width / 2,
+ y: pos.y - height
+ };
+ } else {
+ square = {
+ x: pos.x - width,
+ y: pos.y - height / 2
+ };
+ }
+ } else throw "align: not implemented";
+
+ return square;
+ },
+
+ getOrientation: function(adj) {
+ var config = this.config;
+ var orn = config.orientation;
+
+ if(config.multitree) {
+ var nodeFrom = adj.nodeFrom;
+ var nodeTo = adj.nodeTo;
+ orn = (('$orn' in nodeFrom.data)
+ && nodeFrom.data.$orn)
+ || (('$orn' in nodeTo.data)
+ && nodeTo.data.$orn);
+ }
+
+ return orn;
+ }
+});
+
+/*
+ Class: ST.Label
+
+ Custom extension of <Graph.Label>.
+ Contains custom <Graph.Label.SVG>, <Graph.Label.HTML> and <Graph.Label.Native> extensions.
+
+ Extends:
+
+ All <Graph.Label> methods and subclasses.
+
+ See also:
+
+ <Graph.Label>, <Graph.Label.Native>, <Graph.Label.HTML>, <Graph.Label.SVG>.
+ */
+$jit.ST.Label = {};
+
+/*
+ ST.Label.Native
+
+ Custom extension of <Graph.Label.Native>.
+
+ Extends:
+
+ All <Graph.Label.Native> methods
+
+ See also:
+
+ <Graph.Label.Native>
+*/
+$jit.ST.Label.Native = new Class({
+ Implements: Graph.Label.Native,
+
+ renderLabel: function(canvas, node, controller) {
+ var ctx = canvas.getCtx();
+ var coord = node.pos.getc(true);
+ ctx.fillText(node.name, coord.x, coord.y);
+ }
+});
+
+$jit.ST.Label.DOM = new Class({
+ Implements: Graph.Label.DOM,
+
+ /*
+ placeLabel
+
+ Overrides abstract method placeLabel in <Graph.Plot>.
+
+ Parameters:
+
+ tag - A DOM label element.
+ node - A <Graph.Node>.
+ controller - A configuration/controller object passed to the visualization.
+
+ */
+ placeLabel: function(tag, node, controller) {
+ var pos = node.pos.getc(true),
+ config = this.viz.config,
+ dim = config.Node,
+ canvas = this.viz.canvas,
+ w = node.getData('width'),
+ h = node.getData('height'),
+ radius = canvas.getSize(),
+ labelPos, orn;
+
+ var ox = canvas.translateOffsetX,
+ oy = canvas.translateOffsetY,
+ sx = canvas.scaleOffsetX,
+ sy = canvas.scaleOffsetY,
+ posx = pos.x * sx + ox,
+ posy = pos.y * sy + oy;
+
+ if(dim.align == "center") {
+ labelPos= {
+ x: Math.round(posx - w / 2 + radius.width/2),
+ y: Math.round(posy - h / 2 + radius.height/2)
+ };
+ } else if (dim.align == "left") {
+ orn = config.orientation;
+ if(orn == "bottom" || orn == "top") {
+ labelPos= {
+ x: Math.round(posx - w / 2 + radius.width/2),
+ y: Math.round(posy + radius.height/2)
+ };
+ } else {
+ labelPos= {
+ x: Math.round(posx + radius.width/2),
+ y: Math.round(posy - h / 2 + radius.height/2)
+ };
+ }
+ } else if(dim.align == "right") {
+ orn = config.orientation;
+ if(orn == "bottom" || orn == "top") {
+ labelPos= {
+ x: Math.round(posx - w / 2 + radius.width/2),
+ y: Math.round(posy - h + radius.height/2)
+ };
+ } else {
+ labelPos= {
+ x: Math.round(posx - w + radius.width/2),
+ y: Math.round(posy - h / 2 + radius.height/2)
+ };
+ }
+ } else throw "align: not implemented";
+
+ var style = tag.style;
+ style.left = labelPos.x + 'px';
+ style.top = labelPos.y + 'px';
+ style.display = this.fitsInCanvas(labelPos, canvas)? '' : 'none';
+ controller.onPlaceLabel(tag, node);
+ }
+});
+
+/*
+ ST.Label.SVG
+
+ Custom extension of <Graph.Label.SVG>.
+
+ Extends:
+
+ All <Graph.Label.SVG> methods
+
+ See also:
+
+ <Graph.Label.SVG>
+*/
+$jit.ST.Label.SVG = new Class({
+ Implements: [$jit.ST.Label.DOM, Graph.Label.SVG],
+
+ initialize: function(viz) {
+ this.viz = viz;
+ }
+});
+
+/*
+ ST.Label.HTML
+
+ Custom extension of <Graph.Label.HTML>.
+
+ Extends:
+
+ All <Graph.Label.HTML> methods.
+
+ See also:
+
+ <Graph.Label.HTML>
+
+*/
+$jit.ST.Label.HTML = new Class({
+ Implements: [$jit.ST.Label.DOM, Graph.Label.HTML],
+
+ initialize: function(viz) {
+ this.viz = viz;
+ }
+});
+
+
+/*
+ Class: ST.Plot.NodeTypes
+
+ This class contains a list of <Graph.Node> built-in types.
+ Node types implemented are 'none', 'circle', 'rectangle', 'ellipse' and 'square'.
+
+ You can add your custom node types, customizing your visualization to the extreme.
+
+ Example:
+
+ (start code js)
+ ST.Plot.NodeTypes.implement({
+ 'mySpecialType': {
+ 'render': function(node, canvas) {
+ //print your custom node to canvas
+ },
+ //optional
+ 'contains': function(node, pos) {
+ //return true if pos is inside the node or false otherwise
+ }
+ }
+ });
+ (end code)
+
+*/
+$jit.ST.Plot.NodeTypes = new Class({
+ 'none': {
+ 'render': $.empty,
+ 'contains': $.lambda(false)
+ },
+ 'circle': {
+ 'render': function(node, canvas) {
+ var dim = node.getData('dim'),
+ pos = this.getAlignedPos(node.pos.getc(true), dim, dim),
+ dim2 = dim/2;
+ this.nodeHelper.circle.render('fill', {x:pos.x+dim2, y:pos.y+dim2}, dim2, canvas);
+ },
+ 'contains': function(node, pos) {
+ var dim = node.getData('dim'),
+ npos = this.getAlignedPos(node.pos.getc(true), dim, dim),
+ dim2 = dim/2;
+ this.nodeHelper.circle.contains({x:npos.x+dim2, y:npos.y+dim2}, dim2);
+ }
+ },
+ 'square': {
+ 'render': function(node, canvas) {
+ var dim = node.getData('dim'),
+ dim2 = dim/2,
+ pos = this.getAlignedPos(node.pos.getc(true), dim, dim);
+ this.nodeHelper.square.render('fill', {x:pos.x+dim2, y:pos.y+dim2}, dim2, canvas);
+ },
+ 'contains': function(node, pos) {
+ var dim = node.getData('dim'),
+ npos = this.getAlignedPos(node.pos.getc(true), dim, dim),
+ dim2 = dim/2;
+ this.nodeHelper.square.contains({x:npos.x+dim2, y:npos.y+dim2}, dim2);
+ }
+ },
+ 'ellipse': {
+ 'render': function(node, canvas) {
+ var width = node.getData('width'),
+ height = node.getData('height'),
+ pos = this.getAlignedPos(node.pos.getc(true), width, height);
+ this.nodeHelper.ellipse.render('fill', {x:pos.x+width/2, y:pos.y+height/2}, width, height, canvas);
+ },
+ 'contains': function(node, pos) {
+ var width = node.getData('width'),
+ height = node.getData('height'),
+ npos = this.getAlignedPos(node.pos.getc(true), width, height);
+ this.nodeHelper.ellipse.contains({x:npos.x+width/2, y:npos.y+height/2}, width, height, canvas);
+ }
+ },
+ 'rectangle': {
+ 'render': function(node, canvas) {
+ var width = node.getData('width'),
+ height = node.getData('height'),
+ pos = this.getAlignedPos(node.pos.getc(true), width, height);
+ this.nodeHelper.rectangle.render('fill', {x:pos.x+width/2, y:pos.y+height/2}, width, height, canvas);
+ },
+ 'contains': function(node, pos) {
+ var width = node.getData('width'),
+ height = node.getData('height'),
+ npos = this.getAlignedPos(node.pos.getc(true), width, height);
+ this.nodeHelper.rectangle.contains({x:npos.x+width/2, y:npos.y+height/2}, width, height, canvas);
+ }
+ }
+});
+
+/*
+ Class: ST.Plot.EdgeTypes
+
+ This class contains a list of <Graph.Adjacence> built-in types.
+ Edge types implemented are 'none', 'line', 'arrow', 'quadratic:begin', 'quadratic:end', 'bezier'.
+
+ You can add your custom edge types, customizing your visualization to the extreme.
+
+ Example:
+
+ (start code js)
+ ST.Plot.EdgeTypes.implement({
+ 'mySpecialType': {
+ 'render': function(adj, canvas) {
+ //print your custom edge to canvas
+ },
+ //optional
+ 'contains': function(adj, pos) {
+ //return true if pos is inside the arc or false otherwise
+ }
+ }
+ });
+ (end code)
+
+*/
+$jit.ST.Plot.EdgeTypes = new Class({
+ 'none': $.empty,
+ 'line': {
+ 'render': function(adj, canvas) {
+ var orn = this.getOrientation(adj),
+ nodeFrom = adj.nodeFrom,
+ nodeTo = adj.nodeTo,
+ rel = nodeFrom._depth < nodeTo._depth,
+ from = this.viz.geom.getEdge(rel? nodeFrom:nodeTo, 'begin', orn),
+ to = this.viz.geom.getEdge(rel? nodeTo:nodeFrom, 'end', orn);
+ this.edgeHelper.line.render(from, to, canvas);
+ },
+ 'contains': function(adj, pos) {
+ var orn = this.getOrientation(adj),
+ nodeFrom = adj.nodeFrom,
+ nodeTo = adj.nodeTo,
+ rel = nodeFrom._depth < nodeTo._depth,
+ from = this.viz.geom.getEdge(rel? nodeFrom:nodeTo, 'begin', orn),
+ to = this.viz.geom.getEdge(rel? nodeTo:nodeFrom, 'end', orn);
+ return this.edgeHelper.line.contains(from, to, pos, this.edge.epsilon);
+ }
+ },
+ 'arrow': {
+ 'render': function(adj, canvas) {
+ var orn = this.getOrientation(adj),
+ node = adj.nodeFrom,
+ child = adj.nodeTo,
+ dim = adj.getData('dim'),
+ from = this.viz.geom.getEdge(node, 'begin', orn),
+ to = this.viz.geom.getEdge(child, 'end', orn),
+ direction = adj.data.$direction,
+ inv = (direction && direction.length>1 && direction[0] != node.id);
+ this.edgeHelper.arrow.render(from, to, dim, inv, canvas);
+ },
+ 'contains': function(adj, pos) {
+ var orn = this.getOrientation(adj),
+ nodeFrom = adj.nodeFrom,
+ nodeTo = adj.nodeTo,
+ rel = nodeFrom._depth < nodeTo._depth,
+ from = this.viz.geom.getEdge(rel? nodeFrom:nodeTo, 'begin', orn),
+ to = this.viz.geom.getEdge(rel? nodeTo:nodeFrom, 'end', orn);
+ return this.edgeHelper.arrow.contains(from, to, pos, this.edge.epsilon);
+ }
+ },
+ 'quadratic:begin': {
+ 'render': function(adj, canvas) {
+ var orn = this.getOrientation(adj);
+ var nodeFrom = adj.nodeFrom,
+ nodeTo = adj.nodeTo,
+ rel = nodeFrom._depth < nodeTo._depth,
+ begin = this.viz.geom.getEdge(rel? nodeFrom:nodeTo, 'begin', orn),
+ end = this.viz.geom.getEdge(rel? nodeTo:nodeFrom, 'end', orn),
+ dim = adj.getData('dim'),
+ ctx = canvas.getCtx();
+ ctx.beginPath();
+ ctx.moveTo(begin.x, begin.y);
+ switch(orn) {
+ case "left":
+ ctx.quadraticCurveTo(begin.x + dim, begin.y, end.x, end.y);
+ break;
+ case "right":
+ ctx.quadraticCurveTo(begin.x - dim, begin.y, end.x, end.y);
+ break;
+ case "top":
+ ctx.quadraticCurveTo(begin.x, begin.y + dim, end.x, end.y);
+ break;
+ case "bottom":
+ ctx.quadraticCurveTo(begin.x, begin.y - dim, end.x, end.y);
+ break;
+ }
+ ctx.stroke();
+ }
+ },
+ 'quadratic:end': {
+ 'render': function(adj, canvas) {
+ var orn = this.getOrientation(adj);
+ var nodeFrom = adj.nodeFrom,
+ nodeTo = adj.nodeTo,
+ rel = nodeFrom._depth < nodeTo._depth,
+ begin = this.viz.geom.getEdge(rel? nodeFrom:nodeTo, 'begin', orn),
+ end = this.viz.geom.getEdge(rel? nodeTo:nodeFrom, 'end', orn),
+ dim = adj.getData('dim'),
+ ctx = canvas.getCtx();
+ ctx.beginPath();
+ ctx.moveTo(begin.x, begin.y);
+ switch(orn) {
+ case "left":
+ ctx.quadraticCurveTo(end.x - dim, end.y, end.x, end.y);
+ break;
+ case "right":
+ ctx.quadraticCurveTo(end.x + dim, end.y, end.x, end.y);
+ break;
+ case "top":
+ ctx.quadraticCurveTo(end.x, end.y - dim, end.x, end.y);
+ break;
+ case "bottom":
+ ctx.quadraticCurveTo(end.x, end.y + dim, end.x, end.y);
+ break;
+ }
+ ctx.stroke();
+ }
+ },
+ 'bezier': {
+ 'render': function(adj, canvas) {
+ var orn = this.getOrientation(adj),
+ nodeFrom = adj.nodeFrom,
+ nodeTo = adj.nodeTo,
+ rel = nodeFrom._depth < nodeTo._depth,
+ begin = this.viz.geom.getEdge(rel? nodeFrom:nodeTo, 'begin', orn),
+ end = this.viz.geom.getEdge(rel? nodeTo:nodeFrom, 'end', orn),
+ dim = adj.getData('dim'),
+ ctx = canvas.getCtx();
+ ctx.beginPath();
+ ctx.moveTo(begin.x, begin.y);
+ switch(orn) {
+ case "left":
+ ctx.bezierCurveTo(begin.x + dim, begin.y, end.x - dim, end.y, end.x, end.y);
+ break;
+ case "right":
+ ctx.bezierCurveTo(begin.x - dim, begin.y, end.x + dim, end.y, end.x, end.y);
+ break;
+ case "top":
+ ctx.bezierCurveTo(begin.x, begin.y + dim, end.x, end.y - dim, end.x, end.y);
+ break;
+ case "bottom":
+ ctx.bezierCurveTo(begin.x, begin.y - dim, end.x, end.y + dim, end.x, end.y);
+ break;
+ }
+ ctx.stroke();
+ }
+ }
+});
+
+
+
+/*
+ * File: AreaChart.js
+ *
+*/
+
+$jit.ST.Plot.NodeTypes.implement({
+ 'areachart-stacked' : {
+ 'render' : function(node, canvas) {
+ var pos = node.pos.getc(true),
+ width = node.getData('width'),
+ height = node.getData('height'),
+ algnPos = this.getAlignedPos(pos, width, height),
+ x = algnPos.x, y = algnPos.y,
+ stringArray = node.getData('stringArray'),
+ dimArray = node.getData('dimArray'),
+ valArray = node.getData('valueArray'),
+ valLeft = $.reduce(valArray, function(x, y) { return x + y[0]; }, 0),
+ valRight = $.reduce(valArray, function(x, y) { return x + y[1]; }, 0),
+ colorArray = node.getData('colorArray'),
+ colorLength = colorArray.length,
+ config = node.getData('config'),
+ gradient = node.getData('gradient'),
+ showLabels = config.showLabels,
+ aggregates = config.showAggregates,
+ label = config.Label,
+ prev = node.getData('prev');
+
+ var ctx = canvas.getCtx(), border = node.getData('border');
+ if (colorArray && dimArray && stringArray) {
+ for (var i=0, l=dimArray.length, acumLeft=0, acumRight=0, valAcum=0; i<l; i++) {
+ ctx.fillStyle = ctx.strokeStyle = colorArray[i % colorLength];
+ ctx.save();
+ if(gradient && (dimArray[i][0] > 0 || dimArray[i][1] > 0)) {
+ var h1 = acumLeft + dimArray[i][0],
+ h2 = acumRight + dimArray[i][1],
+ alpha = Math.atan((h2 - h1) / width),
+ delta = 55;
+ var linear = ctx.createLinearGradient(x + width/2,
+ y - (h1 + h2)/2,
+ x + width/2 + delta * Math.sin(alpha),
+ y - (h1 + h2)/2 + delta * Math.cos(alpha));
+ var color = $.rgbToHex($.map($.hexToRgb(colorArray[i % colorLength].slice(1)),
+ function(v) { return (v * 0.85) >> 0; }));
+ linear.addColorStop(0, colorArray[i % colorLength]);
+ linear.addColorStop(1, color);
+ ctx.fillStyle = linear;
+ }
+ ctx.beginPath();
+ ctx.moveTo(x, y - acumLeft);
+ ctx.lineTo(x + width, y - acumRight);
+ ctx.lineTo(x + width, y - acumRight - dimArray[i][1]);
+ ctx.lineTo(x, y - acumLeft - dimArray[i][0]);
+ ctx.lineTo(x, y - acumLeft);
+ ctx.fill();
+ ctx.restore();
+ if(border) {
+ var strong = border.name == stringArray[i];
+ var perc = strong? 0.7 : 0.8;
+ var color = $.rgbToHex($.map($.hexToRgb(colorArray[i % colorLength].slice(1)),
+ function(v) { return (v * perc) >> 0; }));
+ ctx.strokeStyle = color;
+ ctx.lineWidth = strong? 4 : 1;
+ ctx.save();
+ ctx.beginPath();
+ if(border.index === 0) {
+ ctx.moveTo(x, y - acumLeft);
+ ctx.lineTo(x, y - acumLeft - dimArray[i][0]);
+ } else {
+ ctx.moveTo(x + width, y - acumRight);
+ ctx.lineTo(x + width, y - acumRight - dimArray[i][1]);
+ }
+ ctx.stroke();
+ ctx.restore();
+ }
+ acumLeft += (dimArray[i][0] || 0);
+ acumRight += (dimArray[i][1] || 0);
+
+ if(dimArray[i][0] > 0)
+ valAcum += (valArray[i][0] || 0);
+ }
+ if(prev && label.type == 'Native') {
+ ctx.save();
+ ctx.beginPath();
+ ctx.fillStyle = ctx.strokeStyle = label.color;
+ ctx.font = label.style + ' ' + label.size + 'px ' + label.family;
+ ctx.textAlign = 'center';
+ ctx.textBaseline = 'middle';
+ if(aggregates(node.name, valLeft, valRight, node)) {
+ ctx.fillText(valAcum, x, y - acumLeft - config.labelOffset - label.size/2, width);
+ }
+ if(showLabels(node.name, valLeft, valRight, node)) {
+ ctx.fillText(node.name, x, y + label.size/2 + config.labelOffset);
+ }
+ ctx.restore();
+ }
+ }
+ },
+ 'contains': function(node, mpos) {
+ var pos = node.pos.getc(true),
+ width = node.getData('width'),
+ height = node.getData('height'),
+ algnPos = this.getAlignedPos(pos, width, height),
+ x = algnPos.x, y = algnPos.y,
+ dimArray = node.getData('dimArray'),
+ rx = mpos.x - x;
+ //bounding box check
+ if(mpos.x < x || mpos.x > x + width
+ || mpos.y > y || mpos.y < y - height) {
+ return false;
+ }
+ //deep check
+ for(var i=0, l=dimArray.length, lAcum=y, rAcum=y; i<l; i++) {
+ var dimi = dimArray[i];
+ lAcum -= dimi[0];
+ rAcum -= dimi[1];
+ var intersec = lAcum + (rAcum - lAcum) * rx / width;
+ if(mpos.y >= intersec) {
+ var index = +(rx > width/2);
+ return {
+ 'name': node.getData('stringArray')[i],
+ 'color': node.getData('colorArray')[i],
+ 'value': node.getData('valueArray')[i][index],
+ 'index': index
+ };
+ }
+ }
+ return false;
+ }
+ }
+});
+
+/*
+ Class: AreaChart
+
+ A visualization that displays stacked area charts.
+
+ Constructor Options:
+
+ See <Options.AreaChart>.
+
+*/
+$jit.AreaChart = new Class({
+ st: null,
+ colors: ["#416D9C", "#70A35E", "#EBB056", "#C74243", "#83548B", "#909291", "#557EAA"],
+ selected: {},
+ busy: false,
+
+ initialize: function(opt) {
+ this.controller = this.config =
+ $.merge(Options("Canvas", "Margin", "Label", "AreaChart"), {
+ Label: { type: 'Native' }
+ }, opt);
+ //set functions for showLabels and showAggregates
+ var showLabels = this.config.showLabels,
+ typeLabels = $.type(showLabels),
+ showAggregates = this.config.showAggregates,
+ typeAggregates = $.type(showAggregates);
+ this.config.showLabels = typeLabels == 'function'? showLabels : $.lambda(showLabels);
+ this.config.showAggregates = typeAggregates == 'function'? showAggregates : $.lambda(showAggregates);
+
+ this.initializeViz();
+ },
+
+ initializeViz: function() {
+ var config = this.config,
+ that = this,
+ nodeType = config.type.split(":")[0],
+ nodeLabels = {};
+
+ var st = new $jit.ST({
+ injectInto: config.injectInto,
+ orientation: "bottom",
+ levelDistance: 0,
+ siblingOffset: 0,
+ subtreeOffset: 0,
+ withLabels: config.Label.type != 'Native',
+ useCanvas: config.useCanvas,
+ Label: {
+ type: config.Label.type
+ },
+ Node: {
+ overridable: true,
+ type: 'areachart-' + nodeType,
+ align: 'left',
+ width: 1,
+ height: 1
+ },
+ Edge: {
+ type: 'none'
+ },
+ Tips: {
+ enable: config.Tips.enable,
+ type: 'Native',
+ force: true,
+ onShow: function(tip, node, contains) {
+ var elem = contains;
+ config.Tips.onShow(tip, elem, node);
+ }
+ },
+ Events: {
+ enable: true,
+ type: 'Native',
+ onClick: function(node, eventInfo, evt) {
+ if(!config.filterOnClick && !config.Events.enable) return;
+ var elem = eventInfo.getContains();
+ if(elem) config.filterOnClick && that.filter(elem.name);
+ config.Events.enable && config.Events.onClick(elem, eventInfo, evt);
+ },
+ onRightClick: function(node, eventInfo, evt) {
+ if(!config.restoreOnRightClick) return;
+ that.restore();
+ },
+ onMouseMove: function(node, eventInfo, evt) {
+ if(!config.selectOnHover) return;
+ if(node) {
+ var elem = eventInfo.getContains();
+ that.select(node.id, elem.name, elem.index);
+ } else {
+ that.select(false, false, false);
+ }
+ }
+ },
+ onCreateLabel: function(domElement, node) {
+ var labelConf = config.Label,
+ valueArray = node.getData('valueArray'),
+ acumLeft = $.reduce(valueArray, function(x, y) { return x + y[0]; }, 0),
+ acumRight = $.reduce(valueArray, function(x, y) { return x + y[1]; }, 0);
+ if(node.getData('prev')) {
+ var nlbs = {
+ wrapper: document.createElement('div'),
+ aggregate: document.createElement('div'),
+ label: document.createElement('div')
+ };
+ var wrapper = nlbs.wrapper,
+ label = nlbs.label,
+ aggregate = nlbs.aggregate,
+ wrapperStyle = wrapper.style,
+ labelStyle = label.style,
+ aggregateStyle = aggregate.style;
+ //store node labels
+ nodeLabels[node.id] = nlbs;
+ //append labels
+ wrapper.appendChild(label);
+ wrapper.appendChild(aggregate);
+ if(!config.showLabels(node.name, acumLeft, acumRight, node)) {
+ label.style.display = 'none';
+ }
+ if(!config.showAggregates(node.name, acumLeft, acumRight, node)) {
+ aggregate.style.display = 'none';
+ }
+ wrapperStyle.position = 'relative';
+ wrapperStyle.overflow = 'visible';
+ wrapperStyle.fontSize = labelConf.size + 'px';
+ wrapperStyle.fontFamily = labelConf.family;
+ wrapperStyle.color = labelConf.color;
+ wrapperStyle.textAlign = 'center';
+ aggregateStyle.position = labelStyle.position = 'absolute';
+
+ domElement.style.width = node.getData('width') + 'px';
+ domElement.style.height = node.getData('height') + 'px';
+ label.innerHTML = node.name;
+
+ domElement.appendChild(wrapper);
+ }
+ },
+ onPlaceLabel: function(domElement, node) {
+ if(!node.getData('prev')) return;
+ var labels = nodeLabels[node.id],
+ wrapperStyle = labels.wrapper.style,
+ labelStyle = labels.label.style,
+ aggregateStyle = labels.aggregate.style,
+ width = node.getData('width'),
+ height = node.getData('height'),
+ dimArray = node.getData('dimArray'),
+ valArray = node.getData('valueArray'),
+ acumLeft = $.reduce(valArray, function(x, y) { return x + y[0]; }, 0),
+ acumRight = $.reduce(valArray, function(x, y) { return x + y[1]; }, 0),
+ font = parseInt(wrapperStyle.fontSize, 10),
+ domStyle = domElement.style;
+
+ if(dimArray && valArray) {
+ if(config.showLabels(node.name, acumLeft, acumRight, node)) {
+ labelStyle.display = '';
+ } else {
+ labelStyle.display = 'none';
+ }
+ if(config.showAggregates(node.name, acumLeft, acumRight, node)) {
+ aggregateStyle.display = '';
+ } else {
+ aggregateStyle.display = 'none';
+ }
+ wrapperStyle.width = aggregateStyle.width = labelStyle.width = domElement.style.width = width + 'px';
+ aggregateStyle.left = labelStyle.left = -width/2 + 'px';
+ for(var i=0, l=valArray.length, acum=0, leftAcum=0; i<l; i++) {
+ if(dimArray[i][0] > 0) {
+ acum+= valArray[i][0];
+ leftAcum+= dimArray[i][0];
+ }
+ }
+ aggregateStyle.top = (-font - config.labelOffset) + 'px';
+ labelStyle.top = (config.labelOffset + leftAcum) + 'px';
+ domElement.style.top = parseInt(domElement.style.top, 10) - leftAcum + 'px';
+ domElement.style.height = wrapperStyle.height = leftAcum + 'px';
+ labels.aggregate.innerHTML = acum;
+ }
+ }
+ });
+
+ var size = st.canvas.getSize(),
+ margin = config.Margin;
+ st.config.offsetY = -size.height/2 + margin.bottom
+ + (config.showLabels && (config.labelOffset + config.Label.size));
+ st.config.offsetX = (margin.right - margin.left)/2;
+ this.st = st;
+ this.canvas = this.st.canvas;
+ },
+
+ /*
+ Method: loadJSON
+
+ Loads JSON data into the visualization.
+
+ Parameters:
+
+ json - The JSON data format. This format is described in <http://blog.thejit.org/2010/04/24/new-javascript-infovis-toolkit-visualizations/#json-data-format>.
+
+ Example:
+ (start code js)
+ var areaChart = new $jit.AreaChart(options);
+ areaChart.loadJSON(json);
+ (end code)
+ */
+ loadJSON: function(json) {
+ var prefix = $.time(),
+ ch = [],
+ st = this.st,
+ name = $.splat(json.label),
+ color = $.splat(json.color || this.colors),
+ config = this.config,
+ gradient = !!config.type.split(":")[1],
+ animate = config.animate;
+
+ for(var i=0, values=json.values, l=values.length; i<l-1; i++) {
+ var val = values[i], prev = values[i-1], next = values[i+1];
+ var valLeft = $.splat(values[i].values), valRight = $.splat(values[i+1].values);
+ var valArray = $.zip(valLeft, valRight);
+ var acumLeft = 0, acumRight = 0;
+ ch.push({
+ 'id': prefix + val.label,
+ 'name': val.label,
+ 'data': {
+ 'value': valArray,
+ '$valueArray': valArray,
+ '$colorArray': color,
+ '$stringArray': name,
+ '$next': next.label,
+ '$prev': prev? prev.label:false,
+ '$config': config,
+ '$gradient': gradient
+ },
+ 'children': []
+ });
+ }
+ var root = {
+ 'id': prefix + '$root',
+ 'name': '',
+ 'data': {
+ '$type': 'none',
+ '$width': 1,
+ '$height': 1
+ },
+ 'children': ch
+ };
+ st.loadJSON(root);
+
+ this.normalizeDims();
+ st.compute();
+ st.select(st.root);
+ if(animate) {
+ st.fx.animate({
+ modes: ['node-property:height:dimArray'],
+ duration:1500
+ });
+ }
+ },
+
+ /*
+ Method: updateJSON
+
+ Use this method when updating values for the current JSON data. If the items specified by the JSON data already exist in the graph then their values will be updated.
+
+ Parameters:
+
+ json - (object) JSON data to be updated. The JSON format corresponds to the one described in <AreaChart.loadJSON>.
+ onComplete - (object) A callback object to be called when the animation transition when updating the data end.
+
+ Example:
+
+ (start code js)
+ areaChart.updateJSON(json, {
+ onComplete: function() {
+ alert('update complete!');
+ }
+ });
+ (end code)
+ */
+ updateJSON: function(json, onComplete) {
+ if(this.busy) return;
+ this.busy = true;
+
+ var st = this.st,
+ graph = st.graph,
+ labels = json.label && $.splat(json.label),
+ values = json.values,
+ animate = this.config.animate,
+ that = this;
+ $.each(values, function(v) {
+ var n = graph.getByName(v.label);
+ if(n) {
+ v.values = $.splat(v.values);
+ var stringArray = n.getData('stringArray'),
+ valArray = n.getData('valueArray');
+ $.each(valArray, function(a, i) {
+ a[0] = v.values[i];
+ if(labels) stringArray[i] = labels[i];
+ });
+ n.setData('valueArray', valArray);
+ var prev = n.getData('prev'),
+ next = n.getData('next'),
+ nextNode = graph.getByName(next);
+ if(prev) {
+ var p = graph.getByName(prev);
+ if(p) {
+ var valArray = p.getData('valueArray');
+ $.each(valArray, function(a, i) {
+ a[1] = v.values[i];
+ });
+ }
+ }
+ if(!nextNode) {
+ var valArray = n.getData('valueArray');
+ $.each(valArray, function(a, i) {
+ a[1] = v.values[i];
+ });
+ }
+ }
+ });
+ this.normalizeDims();
+ st.compute();
+ st.select(st.root);
+ if(animate) {
+ st.fx.animate({
+ modes: ['node-property:height:dimArray'],
+ duration:1500,
+ onComplete: function() {
+ that.busy = false;
+ onComplete && onComplete.onComplete();
+ }
+ });
+ }
+ },
+
+/*
+ Method: filter
+
+ Filter selected stacks, collapsing all other stacks. You can filter multiple stacks at the same time.
+
+ Parameters:
+
+ Variable strings arguments with the name of the stacks.
+
+ Example:
+
+ (start code js)
+ areaChart.filter('label A', 'label C');
+ (end code)
+
+ See also:
+
+ <AreaChart.restore>.
+ */
+ filter: function() {
+ if(this.busy) return;
+ this.busy = true;
+ if(this.config.Tips.enable) this.st.tips.hide();
+ this.select(false, false, false);
+ var args = Array.prototype.slice.call(arguments);
+ var rt = this.st.graph.getNode(this.st.root);
+ var that = this;
+ rt.eachAdjacency(function(adj) {
+ var n = adj.nodeTo,
+ dimArray = n.getData('dimArray'),
+ stringArray = n.getData('stringArray');
+ n.setData('dimArray', $.map(dimArray, function(d, i) {
+ return ($.indexOf(args, stringArray[i]) > -1)? d:[0, 0];
+ }), 'end');
+ });
+ this.st.fx.animate({
+ modes: ['node-property:dimArray'],
+ duration:1500,
+ onComplete: function() {
+ that.busy = false;
+ }
+ });
+ },
+
+ /*
+ Method: restore
+
+ Sets all stacks that could have been filtered visible.
+
+ Example:
+
+ (start code js)
+ areaChart.restore();
+ (end code)
+
+ See also:
+
+ <AreaChart.filter>.
+ */
+ restore: function() {
+ if(this.busy) return;
+ this.busy = true;
+ if(this.config.Tips.enable) this.st.tips.hide();
+ this.select(false, false, false);
+ this.normalizeDims();
+ var that = this;
+ this.st.fx.animate({
+ modes: ['node-property:height:dimArray'],
+ duration:1500,
+ onComplete: function() {
+ that.busy = false;
+ }
+ });
+ },
+ //adds the little brown bar when hovering the node
+ select: function(id, name, index) {
+ if(!this.config.selectOnHover) return;
+ var s = this.selected;
+ if(s.id != id || s.name != name
+ || s.index != index) {
+ s.id = id;
+ s.name = name;
+ s.index = index;
+ this.st.graph.eachNode(function(n) {
+ n.setData('border', false);
+ });
+ if(id) {
+ var n = this.st.graph.getNode(id);
+ n.setData('border', s);
+ var link = index === 0? 'prev':'next';
+ link = n.getData(link);
+ if(link) {
+ n = this.st.graph.getByName(link);
+ if(n) {
+ n.setData('border', {
+ name: name,
+ index: 1-index
+ });
+ }
+ }
+ }
+ this.st.plot();
+ }
+ },
+
+ /*
+ Method: getLegend
+
+ Returns an object containing as keys the legend names and as values hex strings with color values.
+
+ Example:
+
+ (start code js)
+ var legend = areaChart.getLegend();
+ (end code)
+ */
+ getLegend: function() {
+ var legend = {};
+ var n;
+ this.st.graph.getNode(this.st.root).eachAdjacency(function(adj) {
+ n = adj.nodeTo;
+ });
+ var colors = n.getData('colorArray'),
+ len = colors.length;
+ $.each(n.getData('stringArray'), function(s, i) {
+ legend[s] = colors[i % len];
+ });
+ return legend;
+ },
+
+ /*
+ Method: getMaxValue
+
+ Returns the maximum accumulated value for the stacks. This method is used for normalizing the graph heights according to the canvas height.
+
+ Example:
+
+ (start code js)
+ var ans = areaChart.getMaxValue();
+ (end code)
+
+ In some cases it could be useful to override this method to normalize heights for a group of AreaCharts, like when doing small multiples.
+
+ Example:
+
+ (start code js)
+ //will return 100 for all AreaChart instances,
+ //displaying all of them with the same scale
+ $jit.AreaChart.implement({
+ 'getMaxValue': function() {
+ return 100;
+ }
+ });
+ (end code)
+
+*/
+ getMaxValue: function() {
+ var maxValue = 0;
+ this.st.graph.eachNode(function(n) {
+ var valArray = n.getData('valueArray'),
+ acumLeft = 0, acumRight = 0;
+ $.each(valArray, function(v) {
+ acumLeft += +v[0];
+ acumRight += +v[1];
+ });
+ var acum = acumRight>acumLeft? acumRight:acumLeft;
+ maxValue = maxValue>acum? maxValue:acum;
+ });
+ return maxValue;
+ },
+
+ normalizeDims: function() {
+ //number of elements
+ var root = this.st.graph.getNode(this.st.root), l=0;
+ root.eachAdjacency(function() {
+ l++;
+ });
+ var maxValue = this.getMaxValue() || 1,
+ size = this.st.canvas.getSize(),
+ config = this.config,
+ margin = config.Margin,
+ labelOffset = config.labelOffset + config.Label.size,
+ fixedDim = (size.width - (margin.left + margin.right)) / l,
+ animate = config.animate,
+ height = size.height - (margin.top + margin.bottom) - (config.showAggregates && labelOffset)
+ - (config.showLabels && labelOffset);
+ this.st.graph.eachNode(function(n) {
+ var acumLeft = 0, acumRight = 0, animateValue = [];
+ $.each(n.getData('valueArray'), function(v) {
+ acumLeft += +v[0];
+ acumRight += +v[1];
+ animateValue.push([0, 0]);
+ });
+ var acum = acumRight>acumLeft? acumRight:acumLeft;
+ n.setData('width', fixedDim);
+ if(animate) {
+ n.setData('height', acum * height / maxValue, 'end');
+ n.setData('dimArray', $.map(n.getData('valueArray'), function(n) {
+ return [n[0] * height / maxValue, n[1] * height / maxValue];
+ }), 'end');
+ var dimArray = n.getData('dimArray');
+ if(!dimArray) {
+ n.setData('dimArray', animateValue);
+ }
+ } else {
+ n.setData('height', acum * height / maxValue);
+ n.setData('dimArray', $.map(n.getData('valueArray'), function(n) {
+ return [n[0] * height / maxValue, n[1] * height / maxValue];
+ }));
+ }
+ });
+ }
+});
+
+/*
+ * File: Options.BarChart.js
+ *
+*/
+
+/*
+ Object: Options.BarChart
+
+ <BarChart> options.
+ Other options included in the BarChart are <Options.Canvas>, <Options.Label>, <Options.Margin>, <Options.Tips> and <Options.Events>.
+
+ Syntax:
+
+ (start code js)
+
+ Options.BarChart = {
+ animate: true,
+ labelOffset: 3,
+ barsOffset: 0,
+ type: 'stacked',
+ hoveredColor: '#9fd4ff',
+ orientation: 'horizontal',
+ showAggregates: true,
+ showLabels: true
+ };
+
+ (end code)
+
+ Example:
+
+ (start code js)
+
+ var barChart = new $jit.BarChart({
+ animate: true,
+ barsOffset: 10,
+ type: 'stacked:gradient'
+ });
+
+ (end code)
+
+ Parameters:
+
+ animate - (boolean) Default's *true*. Whether to add animated transitions when filtering/restoring stacks.
+ offset - (number) Default's *25*. Adds margin between the visualization and the canvas.
+ labelOffset - (number) Default's *3*. Adds margin between the label and the default place where it should be drawn.
+ barsOffset - (number) Default's *0*. Separation between bars.
+ type - (string) Default's *'stacked'*. Stack or grouped styles. Posible values are 'stacked', 'grouped', 'stacked:gradient', 'grouped:gradient' to add gradients.
+ hoveredColor - (boolean|string) Default's *'#9fd4ff'*. Sets the selected color for a hovered bar stack.
+ orientation - (string) Default's 'horizontal'. Sets the direction of the bars. Possible options are 'vertical' or 'horizontal'.
+ showAggregates - (boolean) Default's *true*. Display the sum of the values of the different stacks.
+ showLabels - (boolean) Default's *true*. Display the name of the slots.
+
+*/
+
+Options.BarChart = {
+ $extend: true,
+
+ animate: true,
+ type: 'stacked', //stacked, grouped, : gradient
+ labelOffset: 3, //label offset
+ barsOffset: 0, //distance between bars
+ hoveredColor: '#9fd4ff',
+ orientation: 'horizontal',
+ showAggregates: true,
+ showLabels: true,
+ Tips: {
+ enable: false,
+ onShow: $.empty,
+ onHide: $.empty
+ },
+ Events: {
+ enable: false,
+ onClick: $.empty
+ }
+};
+
+/*
+ * File: BarChart.js
+ *
+*/
+
+$jit.ST.Plot.NodeTypes.implement({
+ 'barchart-stacked' : {
+ 'render' : function(node, canvas) {
+ var pos = node.pos.getc(true),
+ width = node.getData('width'),
+ height = node.getData('height'),
+ algnPos = this.getAlignedPos(pos, width, height),
+ x = algnPos.x, y = algnPos.y,
+ dimArray = node.getData('dimArray'),
+ valueArray = node.getData('valueArray'),
+ colorArray = node.getData('colorArray'),
+ colorLength = colorArray.length,
+ stringArray = node.getData('stringArray');
+
+ var ctx = canvas.getCtx(),
+ opt = {},
+ border = node.getData('border'),
+ gradient = node.getData('gradient'),
+ config = node.getData('config'),
+ horz = config.orientation == 'horizontal',
+ aggregates = config.showAggregates,
+ showLabels = config.showLabels,
+ label = config.Label;
+
+ if (colorArray && dimArray && stringArray) {
+ for (var i=0, l=dimArray.length, acum=0, valAcum=0; i<l; i++) {
+ ctx.fillStyle = ctx.strokeStyle = colorArray[i % colorLength];
+ if(gradient) {
+ var linear;
+ if(horz) {
+ linear = ctx.createLinearGradient(x + acum + dimArray[i]/2, y,
+ x + acum + dimArray[i]/2, y + height);
+ } else {
+ linear = ctx.createLinearGradient(x, y - acum - dimArray[i]/2,
+ x + width, y - acum- dimArray[i]/2);
+ }
+ var color = $.rgbToHex($.map($.hexToRgb(colorArray[i % colorLength].slice(1)),
+ function(v) { return (v * 0.5) >> 0; }));
+ linear.addColorStop(0, color);
+ linear.addColorStop(0.5, colorArray[i % colorLength]);
+ linear.addColorStop(1, color);
+ ctx.fillStyle = linear;
+ }
+ if(horz) {
+ ctx.fillRect(x + acum, y, dimArray[i], height);
+ } else {
+ ctx.fillRect(x, y - acum - dimArray[i], width, dimArray[i]);
+ }
+ if(border && border.name == stringArray[i]) {
+ opt.acum = acum;
+ opt.dimValue = dimArray[i];
+ }
+ acum += (dimArray[i] || 0);
+ valAcum += (valueArray[i] || 0);
+ }
+ if(border) {
+ ctx.save();
+ ctx.lineWidth = 2;
+ ctx.strokeStyle = border.color;
+ if(horz) {
+ ctx.strokeRect(x + opt.acum + 1, y + 1, opt.dimValue -2, height - 2);
+ } else {
+ ctx.strokeRect(x + 1, y - opt.acum - opt.dimValue + 1, width -2, opt.dimValue -2);
+ }
+ ctx.restore();
+ }
+ if(label.type == 'Native') {
+ ctx.save();
+ ctx.fillStyle = ctx.strokeStyle = label.color;
+ ctx.font = label.style + ' ' + label.size + 'px ' + label.family;
+ ctx.textBaseline = 'middle';
+ if(aggregates(node.name, valAcum)) {
+ if(horz) {
+ ctx.textAlign = 'right';
+ ctx.fillText(valAcum, x + acum - config.labelOffset, y + height/2);
+ } else {
+ ctx.textAlign = 'center';
+ ctx.fillText(valAcum, x + width/2, y - height - label.size/2 - config.labelOffset);
+ }
+ }
+ if(showLabels(node.name, valAcum, node)) {
+ if(horz) {
+ ctx.textAlign = 'center';
+ ctx.translate(x - config.labelOffset - label.size/2, y + height/2);
+ ctx.rotate(Math.PI / 2);
+ ctx.fillText(node.name, 0, 0);
+ } else {
+ ctx.textAlign = 'center';
+ ctx.fillText(node.name, x + width/2, y + label.size/2 + config.labelOffset);
+ }
+ }
+ ctx.restore();
+ }
+ }
+ },
+ 'contains': function(node, mpos) {
+ var pos = node.pos.getc(true),
+ width = node.getData('width'),
+ height = node.getData('height'),
+ algnPos = this.getAlignedPos(pos, width, height),
+ x = algnPos.x, y = algnPos.y,
+ dimArray = node.getData('dimArray'),
+ config = node.getData('config'),
+ rx = mpos.x - x,
+ horz = config.orientation == 'horizontal';
+ //bounding box check
+ if(horz) {
+ if(mpos.x < x || mpos.x > x + width
+ || mpos.y > y + height || mpos.y < y) {
+ return false;
+ }
+ } else {
+ if(mpos.x < x || mpos.x > x + width
+ || mpos.y > y || mpos.y < y - height) {
+ return false;
+ }
+ }
+ //deep check
+ for(var i=0, l=dimArray.length, acum=(horz? x:y); i<l; i++) {
+ var dimi = dimArray[i];
+ if(horz) {
+ acum += dimi;
+ var intersec = acum;
+ if(mpos.x <= intersec) {
+ return {
+ 'name': node.getData('stringArray')[i],
+ 'color': node.getData('colorArray')[i],
+ 'value': node.getData('valueArray')[i],
+ 'label': node.name
+ };
+ }
+ } else {
+ acum -= dimi;
+ var intersec = acum;
+ if(mpos.y >= intersec) {
+ return {
+ 'name': node.getData('stringArray')[i],
+ 'color': node.getData('colorArray')[i],
+ 'value': node.getData('valueArray')[i],
+ 'label': node.name
+ };
+ }
+ }
+ }
+ return false;
+ }
+ },
+ 'barchart-grouped' : {
+ 'render' : function(node, canvas) {
+ var pos = node.pos.getc(true),
+ width = node.getData('width'),
+ height = node.getData('height'),
+ algnPos = this.getAlignedPos(pos, width, height),
+ x = algnPos.x, y = algnPos.y,
+ dimArray = node.getData('dimArray'),
+ valueArray = node.getData('valueArray'),
+ valueLength = valueArray.length,
+ colorArray = node.getData('colorArray'),
+ colorLength = colorArray.length,
+ stringArray = node.getData('stringArray');
+
+ var ctx = canvas.getCtx(),
+ opt = {},
+ border = node.getData('border'),
+ gradient = node.getData('gradient'),
+ config = node.getData('config'),
+ horz = config.orientation == 'horizontal',
+ aggregates = config.showAggregates,
+ showLabels = config.showLabels,
+ label = config.Label,
+ fixedDim = (horz? height : width) / valueLength;
+
+ if (colorArray && dimArray && stringArray) {
+ for (var i=0, l=valueLength, acum=0, valAcum=0; i<l; i++) {
+ ctx.fillStyle = ctx.strokeStyle = colorArray[i % colorLength];
+ if(gradient) {
+ var linear;
+ if(horz) {
+ linear = ctx.createLinearGradient(x + dimArray[i]/2, y + fixedDim * i,
+ x + dimArray[i]/2, y + fixedDim * (i + 1));
+ } else {
+ linear = ctx.createLinearGradient(x + fixedDim * i, y - dimArray[i]/2,
+ x + fixedDim * (i + 1), y - dimArray[i]/2);
+ }
+ var color = $.rgbToHex($.map($.hexToRgb(colorArray[i % colorLength].slice(1)),
+ function(v) { return (v * 0.5) >> 0; }));
+ linear.addColorStop(0, color);
+ linear.addColorStop(0.5, colorArray[i % colorLength]);
+ linear.addColorStop(1, color);
+ ctx.fillStyle = linear;
+ }
+ if(horz) {
+ ctx.fillRect(x, y + fixedDim * i, dimArray[i], fixedDim);
+ } else {
+ ctx.fillRect(x + fixedDim * i, y - dimArray[i], fixedDim, dimArray[i]);
+ }
+ if(border && border.name == stringArray[i]) {
+ opt.acum = fixedDim * i;
+ opt.dimValue = dimArray[i];
+ }
+ acum += (dimArray[i] || 0);
+ valAcum += (valueArray[i] || 0);
+ }
+ if(border) {
+ ctx.save();
+ ctx.lineWidth = 2;
+ ctx.strokeStyle = border.color;
+ if(horz) {
+ ctx.strokeRect(x + 1, y + opt.acum + 1, opt.dimValue -2, fixedDim - 2);
+ } else {
+ ctx.strokeRect(x + opt.acum + 1, y - opt.dimValue + 1, fixedDim -2, opt.dimValue -2);
+ }
+ ctx.restore();
+ }
+ if(label.type == 'Native') {
+ ctx.save();
+ ctx.fillStyle = ctx.strokeStyle = label.color;
+ ctx.font = label.style + ' ' + label.size + 'px ' + label.family;
+ ctx.textBaseline = 'middle';
+ if(aggregates(node.name, valAcum)) {
+ if(horz) {
+ ctx.textAlign = 'right';
+ ctx.fillText(valAcum, x + Math.max.apply(null, dimArray) - config.labelOffset, y + height/2);
+ } else {
+ ctx.textAlign = 'center';
+ ctx.fillText(valAcum, x + width/2, y - Math.max.apply(null, dimArray) - label.size/2 - config.labelOffset);
+ }
+ }
+ if(showLabels(node.name, valAcum, node)) {
+ if(horz) {
+ ctx.textAlign = 'center';
+ ctx.translate(x - config.labelOffset - label.size/2, y + height/2);
+ ctx.rotate(Math.PI / 2);
+ ctx.fillText(node.name, 0, 0);
+ } else {
+ ctx.textAlign = 'center';
+ ctx.fillText(node.name, x + width/2, y + label.size/2 + config.labelOffset);
+ }
+ }
+ ctx.restore();
+ }
+ }
+ },
+ 'contains': function(node, mpos) {
+ var pos = node.pos.getc(true),
+ width = node.getData('width'),
+ height = node.getData('height'),
+ algnPos = this.getAlignedPos(pos, width, height),
+ x = algnPos.x, y = algnPos.y,
+ dimArray = node.getData('dimArray'),
+ len = dimArray.length,
+ config = node.getData('config'),
+ rx = mpos.x - x,
+ horz = config.orientation == 'horizontal',
+ fixedDim = (horz? height : width) / len;
+ //bounding box check
+ if(horz) {
+ if(mpos.x < x || mpos.x > x + width
+ || mpos.y > y + height || mpos.y < y) {
+ return false;
+ }
+ } else {
+ if(mpos.x < x || mpos.x > x + width
+ || mpos.y > y || mpos.y < y - height) {
+ return false;
+ }
+ }
+ //deep check
+ for(var i=0, l=dimArray.length; i<l; i++) {
+ var dimi = dimArray[i];
+ if(horz) {
+ var limit = y + fixedDim * i;
+ if(mpos.x <= x+ dimi && mpos.y >= limit && mpos.y <= limit + fixedDim) {
+ return {
+ 'name': node.getData('stringArray')[i],
+ 'color': node.getData('colorArray')[i],
+ 'value': node.getData('valueArray')[i],
+ 'label': node.name
+ };
+ }
+ } else {
+ var limit = x + fixedDim * i;
+ if(mpos.x >= limit && mpos.x <= limit + fixedDim && mpos.y >= y - dimi) {
+ return {
+ 'name': node.getData('stringArray')[i],
+ 'color': node.getData('colorArray')[i],
+ 'value': node.getData('valueArray')[i],
+ 'label': node.name
+ };
+ }
+ }
+ }
+ return false;
+ }
+ }
+});
+
+/*
+ Class: BarChart
+
+ A visualization that displays stacked bar charts.
+
+ Constructor Options:
+
+ See <Options.BarChart>.
+
+*/
+$jit.BarChart = new Class({
+ st: null,
+ colors: ["#416D9C", "#70A35E", "#EBB056", "#C74243", "#83548B", "#909291", "#557EAA"],
+ selected: {},
+ busy: false,
+
+ initialize: function(opt) {
+ this.controller = this.config =
+ $.merge(Options("Canvas", "Margin", "Label", "BarChart"), {
+ Label: { type: 'Native' }
+ }, opt);
+ //set functions for showLabels and showAggregates
+ var showLabels = this.config.showLabels,
+ typeLabels = $.type(showLabels),
+ showAggregates = this.config.showAggregates,
+ typeAggregates = $.type(showAggregates);
+ this.config.showLabels = typeLabels == 'function'? showLabels : $.lambda(showLabels);
+ this.config.showAggregates = typeAggregates == 'function'? showAggregates : $.lambda(showAggregates);
+
+ this.initializeViz();
+ },
+
+ initializeViz: function() {
+ var config = this.config, that = this;
+ var nodeType = config.type.split(":")[0],
+ horz = config.orientation == 'horizontal',
+ nodeLabels = {};
+
+ var st = new $jit.ST({
+ injectInto: config.injectInto,
+ orientation: horz? 'left' : 'bottom',
+ levelDistance: 0,
+ siblingOffset: config.barsOffset,
+ subtreeOffset: 0,
+ withLabels: config.Label.type != 'Native',
+ useCanvas: config.useCanvas,
+ Label: {
+ type: config.Label.type
+ },
+ Node: {
+ overridable: true,
+ type: 'barchart-' + nodeType,
+ align: 'left',
+ width: 1,
+ height: 1
+ },
+ Edge: {
+ type: 'none'
+ },
+ Tips: {
+ enable: config.Tips.enable,
+ type: 'Native',
+ force: true,
+ onShow: function(tip, node, contains) {
+ var elem = contains;
+ config.Tips.onShow(tip, elem, node);
+ }
+ },
+ Events: {
+ enable: true,
+ type: 'Native',
+ onClick: function(node, eventInfo, evt) {
+ if(!config.Events.enable) return;
+ var elem = eventInfo.getContains();
+ config.Events.onClick(elem, eventInfo, evt);
+ },
+ onMouseMove: function(node, eventInfo, evt) {
+ if(!config.hoveredColor) return;
+ if(node) {
+ var elem = eventInfo.getContains();
+ that.select(node.id, elem.name, elem.index);
+ } else {
+ that.select(false, false, false);
+ }
+ }
+ },
+ onCreateLabel: function(domElement, node) {
+ var labelConf = config.Label,
+ valueArray = node.getData('valueArray'),
+ acum = $.reduce(valueArray, function(x, y) { return x + y; }, 0);
+ var nlbs = {
+ wrapper: document.createElement('div'),
+ aggregate: document.createElement('div'),
+ label: document.createElement('div')
+ };
+ var wrapper = nlbs.wrapper,
+ label = nlbs.label,
+ aggregate = nlbs.aggregate,
+ wrapperStyle = wrapper.style,
+ labelStyle = label.style,
+ aggregateStyle = aggregate.style;
+ //store node labels
+ nodeLabels[node.id] = nlbs;
+ //append labels
+ wrapper.appendChild(label);
+ wrapper.appendChild(aggregate);
+ if(!config.showLabels(node.name, acum, node)) {
+ labelStyle.display = 'none';
+ }
+ if(!config.showAggregates(node.name, acum, node)) {
+ aggregateStyle.display = 'none';
+ }
+ wrapperStyle.position = 'relative';
+ wrapperStyle.overflow = 'visible';
+ wrapperStyle.fontSize = labelConf.size + 'px';
+ wrapperStyle.fontFamily = labelConf.family;
+ wrapperStyle.color = labelConf.color;
+ wrapperStyle.textAlign = 'center';
+ aggregateStyle.position = labelStyle.position = 'absolute';
+
+ domElement.style.width = node.getData('width') + 'px';
+ domElement.style.height = node.getData('height') + 'px';
+ aggregateStyle.left = labelStyle.left = '0px';
+
+ label.innerHTML = node.name;
+
+ domElement.appendChild(wrapper);
+ },
+ onPlaceLabel: function(domElement, node) {
+ if(!nodeLabels[node.id]) return;
+ var labels = nodeLabels[node.id],
+ wrapperStyle = labels.wrapper.style,
+ labelStyle = labels.label.style,
+ aggregateStyle = labels.aggregate.style,
+ grouped = config.type.split(':')[0] == 'grouped',
+ horz = config.orientation == 'horizontal',
+ dimArray = node.getData('dimArray'),
+ valArray = node.getData('valueArray'),
+ width = (grouped && horz)? Math.max.apply(null, dimArray) : node.getData('width'),
+ height = (grouped && !horz)? Math.max.apply(null, dimArray) : node.getData('height'),
+ font = parseInt(wrapperStyle.fontSize, 10),
+ domStyle = domElement.style;
+
+
+ if(dimArray && valArray) {
+ wrapperStyle.width = aggregateStyle.width = labelStyle.width = domElement.style.width = width + 'px';
+ for(var i=0, l=valArray.length, acum=0; i<l; i++) {
+ if(dimArray[i] > 0) {
+ acum+= valArray[i];
+ }
+ }
+ if(config.showLabels(node.name, acum, node)) {
+ labelStyle.display = '';
+ } else {
+ labelStyle.display = 'none';
+ }
+ if(config.showAggregates(node.name, acum, node)) {
+ aggregateStyle.display = '';
+ } else {
+ aggregateStyle.display = 'none';
+ }
+ if(config.orientation == 'horizontal') {
+ aggregateStyle.textAlign = 'right';
+ labelStyle.textAlign = 'left';
+ labelStyle.textIndex = aggregateStyle.textIndent = config.labelOffset + 'px';
+ aggregateStyle.top = labelStyle.top = (height-font)/2 + 'px';
+ domElement.style.height = wrapperStyle.height = height + 'px';
+ } else {
+ aggregateStyle.top = (-font - config.labelOffset) + 'px';
+ labelStyle.top = (config.labelOffset + height) + 'px';
+ domElement.style.top = parseInt(domElement.style.top, 10) - height + 'px';
+ domElement.style.height = wrapperStyle.height = height + 'px';
+ }
+ labels.aggregate.innerHTML = acum;
+ }
+ }
+ });
+
+ var size = st.canvas.getSize(),
+ margin = config.Margin;
+ if(horz) {
+ st.config.offsetX = size.width/2 - margin.left
+ - (config.showLabels && (config.labelOffset + config.Label.size));
+ st.config.offsetY = (margin.bottom - margin.top)/2;
+ } else {
+ st.config.offsetY = -size.height/2 + margin.bottom
+ + (config.showLabels && (config.labelOffset + config.Label.size));
+ st.config.offsetX = (margin.right - margin.left)/2;
+ }
+ this.st = st;
+ this.canvas = this.st.canvas;
+ },
+
+ /*
+ Method: loadJSON
+
+ Loads JSON data into the visualization.
+
+ Parameters:
+
+ json - The JSON data format. This format is described in <http://blog.thejit.org/2010/04/24/new-javascript-infovis-toolkit-visualizations/#json-data-format>.
+
+ Example:
+ (start code js)
+ var barChart = new $jit.BarChart(options);
+ barChart.loadJSON(json);
+ (end code)
+ */
+ loadJSON: function(json) {
+ if(this.busy) return;
+ this.busy = true;
+
+ var prefix = $.time(),
+ ch = [],
+ st = this.st,
+ name = $.splat(json.label),
+ color = $.splat(json.color || this.colors),
+ config = this.config,
+ gradient = !!config.type.split(":")[1],
+ animate = config.animate,
+ horz = config.orientation == 'horizontal',
+ that = this;
+
+ for(var i=0, values=json.values, l=values.length; i<l; i++) {
+ var val = values[i]
+ var valArray = $.splat(values[i].values);
+ var acum = 0;
+ ch.push({
+ 'id': prefix + val.label,
+ 'name': val.label,
+ 'data': {
+ 'value': valArray,
+ '$valueArray': valArray,
+ '$colorArray': color,
+ '$stringArray': name,
+ '$gradient': gradient,
+ '$config': config
+ },
+ 'children': []
+ });
+ }
+ var root = {
+ 'id': prefix + '$root',
+ 'name': '',
+ 'data': {
+ '$type': 'none',
+ '$width': 1,
+ '$height': 1
+ },
+ 'children': ch
+ };
+ st.loadJSON(root);
+
+ this.normalizeDims();
+ st.compute();
+ st.select(st.root);
+ if(animate) {
+ if(horz) {
+ st.fx.animate({
+ modes: ['node-property:width:dimArray'],
+ duration:1500,
+ onComplete: function() {
+ that.busy = false;
+ }
+ });
+ } else {
+ st.fx.animate({
+ modes: ['node-property:height:dimArray'],
+ duration:1500,
+ onComplete: function() {
+ that.busy = false;
+ }
+ });
+ }
+ } else {
+ this.busy = false;
+ }
+ },
+
+ /*
+ Method: updateJSON
+
+ Use this method when updating values for the current JSON data. If the items specified by the JSON data already exist in the graph then their values will be updated.
+
+ Parameters:
+
+ json - (object) JSON data to be updated. The JSON format corresponds to the one described in <BarChart.loadJSON>.
+ onComplete - (object) A callback object to be called when the animation transition when updating the data end.
+
+ Example:
+
+ (start code js)
+ barChart.updateJSON(json, {
+ onComplete: function() {
+ alert('update complete!');
+ }
+ });
+ (end code)
+ */
+ updateJSON: function(json, onComplete) {
+ if(this.busy) return;
+ this.busy = true;
+
+ var st = this.st;
+ var graph = st.graph;
+ var values = json.values;
+ var animate = this.config.animate;
+ var that = this;
+ var horz = this.config.orientation == 'horizontal';
+ $.each(values, function(v) {
+ var n = graph.getByName(v.label);
+ if(n) {
+ n.setData('valueArray', $.splat(v.values));
+ if(json.label) {
+ n.setData('stringArray', $.splat(json.label));
+ }
+ }
+ });
+ this.normalizeDims();
+ st.compute();
+ st.select(st.root);
+ if(animate) {
+ if(horz) {
+ st.fx.animate({
+ modes: ['node-property:width:dimArray'],
+ duration:1500,
+ onComplete: function() {
+ that.busy = false;
+ onComplete && onComplete.onComplete();
+ }
+ });
+ } else {
+ st.fx.animate({
+ modes: ['node-property:height:dimArray'],
+ duration:1500,
+ onComplete: function() {
+ that.busy = false;
+ onComplete && onComplete.onComplete();
+ }
+ });
+ }
+ }
+ },
+
+ //adds the little brown bar when hovering the node
+ select: function(id, name) {
+ if(!this.config.hoveredColor) return;
+ var s = this.selected;
+ if(s.id != id || s.name != name) {
+ s.id = id;
+ s.name = name;
+ s.color = this.config.hoveredColor;
+ this.st.graph.eachNode(function(n) {
+ if(id == n.id) {
+ n.setData('border', s);
+ } else {
+ n.setData('border', false);
+ }
+ });
+ this.st.plot();
+ }
+ },
+
+ /*
+ Method: getLegend
+
+ Returns an object containing as keys the legend names and as values hex strings with color values.
+
+ Example:
+
+ (start code js)
+ var legend = barChart.getLegend();
+ (end code)
+ */
+ getLegend: function() {
+ var legend = {};
+ var n;
+ this.st.graph.getNode(this.st.root).eachAdjacency(function(adj) {
+ n = adj.nodeTo;
+ });
+ var colors = n.getData('colorArray'),
+ len = colors.length;
+ $.each(n.getData('stringArray'), function(s, i) {
+ legend[s] = colors[i % len];
+ });
+ return legend;
+ },
+
+ /*
+ Method: getMaxValue
+
+ Returns the maximum accumulated value for the stacks. This method is used for normalizing the graph heights according to the canvas height.
+
+ Example:
+
+ (start code js)
+ var ans = barChart.getMaxValue();
+ (end code)
+
+ In some cases it could be useful to override this method to normalize heights for a group of BarCharts, like when doing small multiples.
+
+ Example:
+
+ (start code js)
+ //will return 100 for all BarChart instances,
+ //displaying all of them with the same scale
+ $jit.BarChart.implement({
+ 'getMaxValue': function() {
+ return 100;
+ }
+ });
+ (end code)
+
+ */
+ getMaxValue: function() {
+ var maxValue = 0, stacked = this.config.type.split(':')[0] == 'stacked';
+ this.st.graph.eachNode(function(n) {
+ var valArray = n.getData('valueArray'),
+ acum = 0;
+ if(!valArray) return;
+ if(stacked) {
+ $.each(valArray, function(v) {
+ acum += +v;
+ });
+ } else {
+ acum = Math.max.apply(null, valArray);
+ }
+ maxValue = maxValue>acum? maxValue:acum;
+ });
+ return maxValue;
+ },
+
+ setBarType: function(type) {
+ this.config.type = type;
+ this.st.config.Node.type = 'barchart-' + type.split(':')[0];
+ },
+
+ normalizeDims: function() {
+ //number of elements
+ var root = this.st.graph.getNode(this.st.root), l=0;
+ root.eachAdjacency(function() {
+ l++;
+ });
+ var maxValue = this.getMaxValue() || 1,
+ size = this.st.canvas.getSize(),
+ config = this.config,
+ margin = config.Margin,
+ marginWidth = margin.left + margin.right,
+ marginHeight = margin.top + margin.bottom,
+ horz = config.orientation == 'horizontal',
+ fixedDim = (size[horz? 'height':'width'] - (horz? marginHeight:marginWidth) - (l -1) * config.barsOffset) / l,
+ animate = config.animate,
+ height = size[horz? 'width':'height'] - (horz? marginWidth:marginHeight)
+ - (!horz && config.showAggregates && (config.Label.size + config.labelOffset))
+ - (config.showLabels && (config.Label.size + config.labelOffset)),
+ dim1 = horz? 'height':'width',
+ dim2 = horz? 'width':'height';
+ this.st.graph.eachNode(function(n) {
+ var acum = 0, animateValue = [];
+ $.each(n.getData('valueArray'), function(v) {
+ acum += +v;
+ animateValue.push(0);
+ });
+ n.setData(dim1, fixedDim);
+ if(animate) {
+ n.setData(dim2, acum * height / maxValue, 'end');
+ n.setData('dimArray', $.map(n.getData('valueArray'), function(n) {
+ return n * height / maxValue;
+ }), 'end');
+ var dimArray = n.getData('dimArray');
+ if(!dimArray) {
+ n.setData('dimArray', animateValue);
+ }
+ } else {
+ n.setData(dim2, acum * height / maxValue);
+ n.setData('dimArray', $.map(n.getData('valueArray'), function(n) {
+ return n * height / maxValue;
+ }));
+ }
+ });
+ }
+});
+
+/*
+ * File: Options.PieChart.js
+ *
+*/
+/*
+ Object: Options.PieChart
+
+ <PieChart> options.
+ Other options included in the PieChart are <Options.Canvas>, <Options.Label>, <Options.Tips> and <Options.Events>.
+
+ Syntax:
+
+ (start code js)
+
+ Options.PieChart = {
+ animate: true,
+ offset: 25,
+ sliceOffset:0,
+ labelOffset: 3,
+ type: 'stacked',
+ hoveredColor: '#9fd4ff',
+ showLabels: true,
+ resizeLabels: false,
+ updateHeights: false
+ };
+
+ (end code)
+
+ Example:
+
+ (start code js)
+
+ var pie = new $jit.PieChart({
+ animate: true,
+ sliceOffset: 5,
+ type: 'stacked:gradient'
+ });
+
+ (end code)
+
+ Parameters:
+
+ animate - (boolean) Default's *true*. Whether to add animated transitions when plotting/updating the visualization.
+ offset - (number) Default's *25*. Adds margin between the visualization and the canvas.
+ sliceOffset - (number) Default's *0*. Separation between the center of the canvas and each pie slice.
+ labelOffset - (number) Default's *3*. Adds margin between the label and the default place where it should be drawn.
+ type - (string) Default's *'stacked'*. Stack style. Posible values are 'stacked', 'stacked:gradient' to add gradients.
+ hoveredColor - (boolean|string) Default's *'#9fd4ff'*. Sets the selected color for a hovered pie stack.
+ showLabels - (boolean) Default's *true*. Display the name of the slots.
+ resizeLabels - (boolean|number) Default's *false*. Resize the pie labels according to their stacked values. Set a number for *resizeLabels* to set a font size minimum.
+ updateHeights - (boolean) Default's *false*. Only for mono-valued (most common) pie charts. Resize the height of the pie slices according to their current values.
+
+*/
+Options.PieChart = {
+ $extend: true,
+
+ animate: true,
+ offset: 25, // page offset
+ sliceOffset:0,
+ labelOffset: 3, // label offset
+ type: 'stacked', // gradient
+ hoveredColor: '#9fd4ff',
+ Events: {
+ enable: false,
+ onClick: $.empty
+ },
+ Tips: {
+ enable: false,
+ onShow: $.empty,
+ onHide: $.empty
+ },
+ showLabels: true,
+ resizeLabels: false,
+
+ //only valid for mono-valued datasets
+ updateHeights: false
+};
+
+/*
+ * Class: Layouts.Radial
+ *
+ * Implements a Radial Layout.
+ *
+ * Implemented By:
+ *
+ * <RGraph>, <Hypertree>
+ *
+ */
+Layouts.Radial = new Class({
+
+ /*
+ * Method: compute
+ *
+ * Computes nodes' positions.
+ *
+ * Parameters:
+ *
+ * property - _optional_ A <Graph.Node> position property to store the new
+ * positions. Possible values are 'pos', 'end' or 'start'.
+ *
+ */
+ compute : function(property) {
+ var prop = $.splat(property || [ 'current', 'start', 'end' ]);
+ NodeDim.compute(this.graph, prop, this.config);
+ this.graph.computeLevels(this.root, 0, "ignore");
+ var lengthFunc = this.createLevelDistanceFunc();
+ this.computeAngularWidths(prop);
+ this.computePositions(prop, lengthFunc);
+ },
+
+ /*
+ * computePositions
+ *
+ * Performs the main algorithm for computing node positions.
+ */
+ computePositions : function(property, getLength) {
+ var propArray = property;
+ var graph = this.graph;
+ var root = graph.getNode(this.root);
+ var parent = this.parent;
+ var config = this.config;
+
+ for ( var i=0, l=propArray.length; i < l; i++) {
+ var pi = propArray[i];
+ root.setPos($P(0, 0), pi);
+ root.setData('span', Math.PI * 2, pi);
+ }
+
+ root.angleSpan = {
+ begin : 0,
+ end : 2 * Math.PI
+ };
+
+ graph.eachBFS(this.root, function(elem) {
+ var angleSpan = elem.angleSpan.end - elem.angleSpan.begin;
+ var angleInit = elem.angleSpan.begin;
+ var len = getLength(elem);
+ //Calculate the sum of all angular widths
+ var totalAngularWidths = 0, subnodes = [], maxDim = {};
+ elem.eachSubnode(function(sib) {
+ totalAngularWidths += sib._treeAngularWidth;
+ //get max dim
+ for ( var i=0, l=propArray.length; i < l; i++) {
+ var pi = propArray[i], dim = sib.getData('dim', pi);
+ maxDim[pi] = (pi in maxDim)? (dim > maxDim[pi]? dim : maxDim[pi]) : dim;
+ }
+ subnodes.push(sib);
+ }, "ignore");
+ //Maintain children order
+ //Second constraint for <http://bailando.sims.berkeley.edu/papers/infovis01.htm>
+ if (parent && parent.id == elem.id && subnodes.length > 0
+ && subnodes[0].dist) {
+ subnodes.sort(function(a, b) {
+ return (a.dist >= b.dist) - (a.dist <= b.dist);
+ });
+ }
+ //Calculate nodes positions.
+ for (var k = 0, ls=subnodes.length; k < ls; k++) {
+ var child = subnodes[k];
+ if (!child._flag) {
+ var angleProportion = child._treeAngularWidth / totalAngularWidths * angleSpan;
+ var theta = angleInit + angleProportion / 2;
+
+ for ( var i=0, l=propArray.length; i < l; i++) {
+ var pi = propArray[i];
+ child.setPos($P(theta, len), pi);
+ child.setData('span', angleProportion, pi);
+ child.setData('dim-quotient', child.getData('dim', pi) / maxDim[pi], pi);
+ }
+
+ child.angleSpan = {
+ begin : angleInit,
+ end : angleInit + angleProportion
+ };
+ angleInit += angleProportion;
+ }
+ }
+ }, "ignore");
+ },
+
+ /*
+ * Method: setAngularWidthForNodes
+ *
+ * Sets nodes angular widths.
+ */
+ setAngularWidthForNodes : function(prop) {
+ this.graph.eachBFS(this.root, function(elem, i) {
+ var diamValue = elem.getData('angularWidth', prop[0]) || 5;
+ elem._angularWidth = diamValue / i;
+ }, "ignore");
+ },
+
+ /*
+ * Method: setSubtreesAngularWidth
+ *
+ * Sets subtrees angular widths.
+ */
+ setSubtreesAngularWidth : function() {
+ var that = this;
+ this.graph.eachNode(function(elem) {
+ that.setSubtreeAngularWidth(elem);
+ }, "ignore");
+ },
+
+ /*
+ * Method: setSubtreeAngularWidth
+ *
+ * Sets the angular width for a subtree.
+ */
+ setSubtreeAngularWidth : function(elem) {
+ var that = this, nodeAW = elem._angularWidth, sumAW = 0;
+ elem.eachSubnode(function(child) {
+ that.setSubtreeAngularWidth(child);
+ sumAW += child._treeAngularWidth;
+ }, "ignore");
+ elem._treeAngularWidth = Math.max(nodeAW, sumAW);
+ },
+
+ /*
+ * Method: computeAngularWidths
+ *
+ * Computes nodes and subtrees angular widths.
+ */
+ computeAngularWidths : function(prop) {
+ this.setAngularWidthForNodes(prop);
+ this.setSubtreesAngularWidth();
+ }
+
+});
+
+
+/*
+ * File: Sunburst.js
+ */
+
+/*
+ Class: Sunburst
+
+ A radial space filling tree visualization.
+
+ Inspired by:
+
+ Sunburst <http://www.cc.gatech.edu/gvu/ii/sunburst/>.
+
+ Note:
+
+ This visualization was built and engineered from scratch, taking only the paper as inspiration, and only shares some features with the visualization described in the paper.
+
+ Implements:
+
+ All <Loader> methods
+
+ Constructor Options:
+
+ Inherits options from
+
+ - <Options.Canvas>
+ - <Options.Controller>
+ - <Options.Node>
+ - <Options.Edge>
+ - <Options.Label>
+ - <Options.Events>
+ - <Options.Tips>
+ - <Options.NodeStyles>
+ - <Options.Navigation>
+
+ Additionally, there are other parameters and some default values changed
+
+ interpolation - (string) Default's *linear*. Describes the way nodes are interpolated. Possible values are 'linear' and 'polar'.
+ levelDistance - (number) Default's *100*. The distance between levels of the tree.
+ Node.type - Described in <Options.Node>. Default's to *multipie*.
+ Node.height - Described in <Options.Node>. Default's *0*.
+ Edge.type - Described in <Options.Edge>. Default's *none*.
+ Label.textAlign - Described in <Options.Label>. Default's *start*.
+ Label.textBaseline - Described in <Options.Label>. Default's *middle*.
+
+ Instance Properties:
+
+ canvas - Access a <Canvas> instance.
+ graph - Access a <Graph> instance.
+ op - Access a <Sunburst.Op> instance.
+ fx - Access a <Sunburst.Plot> instance.
+ labels - Access a <Sunburst.Label> interface implementation.
+
+*/
+
+$jit.Sunburst = new Class({
+
+ Implements: [ Loader, Extras, Layouts.Radial ],
+
+ initialize: function(controller) {
+ var $Sunburst = $jit.Sunburst;
+
+ var config = {
+ interpolation: 'linear',
+ levelDistance: 100,
+ Node: {
+ 'type': 'multipie',
+ 'height':0
+ },
+ Edge: {
+ 'type': 'none'
+ },
+ Label: {
+ textAlign: 'start',
+ textBaseline: 'middle'
+ }
+ };
+
+ this.controller = this.config = $.merge(Options("Canvas", "Node", "Edge",
+ "Fx", "Tips", "NodeStyles", "Events", "Navigation", "Controller", "Label"), config, controller);
+
+ var canvasConfig = this.config;
+ if(canvasConfig.useCanvas) {
+ this.canvas = canvasConfig.useCanvas;
+ this.config.labelContainer = this.canvas.id + '-label';
+ } else {
+ if(canvasConfig.background) {
+ canvasConfig.background = $.merge({
+ type: 'Circles'
+ }, canvasConfig.background);
+ }
+ this.canvas = new Canvas(this, canvasConfig);
+ this.config.labelContainer = (typeof canvasConfig.injectInto == 'string'? canvasConfig.injectInto : canvasConfig.injectInto.id) + '-label';
+ }
+
+ this.graphOptions = {
+ 'complex': false,
+ 'Node': {
+ 'selected': false,
+ 'exist': true,
+ 'drawn': true
+ }
+ };
+ this.graph = new Graph(this.graphOptions, this.config.Node,
+ this.config.Edge);
+ this.labels = new $Sunburst.Label[canvasConfig.Label.type](this);
+ this.fx = new $Sunburst.Plot(this, $Sunburst);
+ this.op = new $Sunburst.Op(this);
+ this.json = null;
+ this.root = null;
+ this.rotated = null;
+ this.busy = false;
+ // initialize extras
+ this.initializeExtras();
+ },
+
+ /*
+
+ createLevelDistanceFunc
+
+ Returns the levelDistance function used for calculating a node distance
+ to its origin. This function returns a function that is computed
+ per level and not per node, such that all nodes with the same depth will have the
+ same distance to the origin. The resulting function gets the
+ parent node as parameter and returns a float.
+
+ */
+ createLevelDistanceFunc: function() {
+ var ld = this.config.levelDistance;
+ return function(elem) {
+ return (elem._depth + 1) * ld;
+ };
+ },
+
+ /*
+ Method: refresh
+
+ Computes positions and plots the tree.
+
+ */
+ refresh: function() {
+ this.compute();
+ this.plot();
+ },
+
+ /*
+ reposition
+
+ An alias for computing new positions to _endPos_
+
+ See also:
+
+ <Sunburst.compute>
+
+ */
+ reposition: function() {
+ this.compute('end');
+ },
+
+ /*
+ Method: rotate
+
+ Rotates the graph so that the selected node is horizontal on the right.
+
+ Parameters:
+
+ node - (object) A <Graph.Node>.
+ method - (string) Whether to perform an animation or just replot the graph. Possible values are "replot" or "animate".
+ opt - (object) Configuration options merged with this visualization configuration options.
+
+ See also:
+
+ <Sunburst.rotateAngle>
+
+ */
+ rotate: function(node, method, opt) {
+ var theta = node.getPos(opt.property || 'current').getp(true).theta;
+ this.rotated = node;
+ this.rotateAngle(-theta, method, opt);
+ },
+
+ /*
+ Method: rotateAngle
+
+ Rotates the graph of an angle theta.
+
+ Parameters:
+
+ node - (object) A <Graph.Node>.
+ method - (string) Whether to perform an animation or just replot the graph. Possible values are "replot" or "animate".
+ opt - (object) Configuration options merged with this visualization configuration options.
+
+ See also:
+
+ <Sunburst.rotate>
+
+ */
+ rotateAngle: function(theta, method, opt) {
+ var that = this;
+ var options = $.merge(this.config, opt || {}, {
+ modes: [ 'polar' ]
+ });
+ var prop = opt.property || (method === "animate" ? 'end' : 'current');
+ if(method === 'animate') {
+ this.fx.animation.pause();
+ }
+ this.graph.eachNode(function(n) {
+ var p = n.getPos(prop);
+ p.theta += theta;
+ if (p.theta < 0) {
+ p.theta += Math.PI * 2;
+ }
+ });
+ if (method == 'animate') {
+ this.fx.animate(options);
+ } else if (method == 'replot') {
+ this.fx.plot();
+ this.busy = false;
+ }
+ },
+
+ /*
+ Method: plot
+
+ Plots the Sunburst. This is a shortcut to *fx.plot*.
+ */
+ plot: function() {
+ this.fx.plot();
+ }
+});
+
+$jit.Sunburst.$extend = true;
+
+(function(Sunburst) {
+
+ /*
+ Class: Sunburst.Op
+
+ Custom extension of <Graph.Op>.
+
+ Extends:
+
+ All <Graph.Op> methods
+
+ See also:
+
+ <Graph.Op>
+
+ */
+ Sunburst.Op = new Class( {
+
+ Implements: Graph.Op
+
+ });
+
+ /*
+ Class: Sunburst.Plot
+
+ Custom extension of <Graph.Plot>.
+
+ Extends:
+
+ All <Graph.Plot> methods
+
+ See also:
+
+ <Graph.Plot>
+
+ */
+ Sunburst.Plot = new Class( {
+
+ Implements: Graph.Plot
+
+ });
+
+ /*
+ Class: Sunburst.Label
+
+ Custom extension of <Graph.Label>.
+ Contains custom <Graph.Label.SVG>, <Graph.Label.HTML> and <Graph.Label.Native> extensions.
+
+ Extends:
+
+ All <Graph.Label> methods and subclasses.
+
+ See also:
+
+ <Graph.Label>, <Graph.Label.Native>, <Graph.Label.HTML>, <Graph.Label.SVG>.
+
+ */
+ Sunburst.Label = {};
+
+ /*
+ Sunburst.Label.Native
+
+ Custom extension of <Graph.Label.Native>.
+
+ Extends:
+
+ All <Graph.Label.Native> methods
+
+ See also:
+
+ <Graph.Label.Native>
+ */
+ Sunburst.Label.Native = new Class( {
+ Implements: Graph.Label.Native,
+
+ initialize: function(viz) {
+ this.viz = viz;
+ this.label = viz.config.Label;
+ this.config = viz.config;
+ },
+
+ renderLabel: function(canvas, node, controller) {
+ var span = node.getData('span');
+ if(span < Math.PI /2 && Math.tan(span) *
+ this.config.levelDistance * node._depth < 10) {
+ return;
+ }
+ var ctx = canvas.getCtx();
+ var measure = ctx.measureText(node.name);
+ if (node.id == this.viz.root) {
+ var x = -measure.width / 2, y = 0, thetap = 0;
+ var ld = 0;
+ } else {
+ var indent = 5;
+ var ld = controller.levelDistance - indent;
+ var clone = node.pos.clone();
+ clone.rho += indent;
+ var p = clone.getp(true);
+ var ct = clone.getc(true);
+ var x = ct.x, y = ct.y;
+ // get angle in degrees
+ var pi = Math.PI;
+ var cond = (p.theta > pi / 2 && p.theta < 3 * pi / 2);
+ var thetap = cond ? p.theta + pi : p.theta;
+ if (cond) {
+ x -= Math.abs(Math.cos(p.theta) * measure.width);
+ y += Math.sin(p.theta) * measure.width;
+ } else if (node.id == this.viz.root) {
+ x -= measure.width / 2;
+ }
+ }
+ ctx.save();
+ ctx.translate(x, y);
+ ctx.rotate(thetap);
+ ctx.fillText(node.name, 0, 0);
+ ctx.restore();
+ }
+ });
+
+ /*
+ Sunburst.Label.SVG
+
+ Custom extension of <Graph.Label.SVG>.
+
+ Extends:
+
+ All <Graph.Label.SVG> methods
+
+ See also:
+
+ <Graph.Label.SVG>
+
+ */
+ Sunburst.Label.SVG = new Class( {
+ Implements: Graph.Label.SVG,
+
+ initialize: function(viz) {
+ this.viz = viz;
+ },
+
+ /*
+ placeLabel
+
+ Overrides abstract method placeLabel in <Graph.Plot>.
+
+ Parameters:
+
+ tag - A DOM label element.
+ node - A <Graph.Node>.
+ controller - A configuration/controller object passed to the visualization.
+
+ */
+ placeLabel: function(tag, node, controller) {
+ var pos = node.pos.getc(true), viz = this.viz, canvas = this.viz.canvas;
+ var radius = canvas.getSize();
+ var labelPos = {
+ x: Math.round(pos.x + radius.width / 2),
+ y: Math.round(pos.y + radius.height / 2)
+ };
+ tag.setAttribute('x', labelPos.x);
+ tag.setAttribute('y', labelPos.y);
+
+ var bb = tag.getBBox();
+ if (bb) {
+ // center the label
+ var x = tag.getAttribute('x');
+ var y = tag.getAttribute('y');
+ // get polar coordinates
+ var p = node.pos.getp(true);
+ // get angle in degrees
+ var pi = Math.PI;
+ var cond = (p.theta > pi / 2 && p.theta < 3 * pi / 2);
+ if (cond) {
+ tag.setAttribute('x', x - bb.width);
+ tag.setAttribute('y', y - bb.height);
+ } else if (node.id == viz.root) {
+ tag.setAttribute('x', x - bb.width / 2);
+ }
+
+ var thetap = cond ? p.theta + pi : p.theta;
+ if(node._depth)
+ tag.setAttribute('transform', 'rotate(' + thetap * 360 / (2 * pi) + ' ' + x
+ + ' ' + y + ')');
+ }
+
+ controller.onPlaceLabel(tag, node);
+}
+ });
+
+ /*
+ Sunburst.Label.HTML
+
+ Custom extension of <Graph.Label.HTML>.
+
+ Extends:
+
+ All <Graph.Label.HTML> methods.
+
+ See also:
+
+ <Graph.Label.HTML>
+
+ */
+ Sunburst.Label.HTML = new Class( {
+ Implements: Graph.Label.HTML,
+
+ initialize: function(viz) {
+ this.viz = viz;
+ },
+ /*
+ placeLabel
+
+ Overrides abstract method placeLabel in <Graph.Plot>.
+
+ Parameters:
+
+ tag - A DOM label element.
+ node - A <Graph.Node>.
+ controller - A configuration/controller object passed to the visualization.
+
+ */
+ placeLabel: function(tag, node, controller) {
+ var pos = node.pos.clone(),
+ canvas = this.viz.canvas,
+ height = node.getData('height'),
+ ldist = ((height || node._depth == 0)? height : this.viz.config.levelDistance) /2,
+ radius = canvas.getSize();
+ pos.rho += ldist;
+ pos = pos.getc(true);
+
+ var labelPos = {
+ x: Math.round(pos.x + radius.width / 2),
+ y: Math.round(pos.y + radius.height / 2)
+ };
+
+ var style = tag.style;
+ style.left = labelPos.x + 'px';
+ style.top = labelPos.y + 'px';
+ style.display = this.fitsInCanvas(labelPos, canvas) ? '' : 'none';
+
+ controller.onPlaceLabel(tag, node);
+ }
+ });
+
+ /*
+ Class: Sunburst.Plot.NodeTypes
+
+ This class contains a list of <Graph.Node> built-in types.
+ Node types implemented are 'none', 'pie', 'multipie', 'gradient-pie' and 'gradient-multipie'.
+
+ You can add your custom node types, customizing your visualization to the extreme.
+
+ Example:
+
+ (start code js)
+ Sunburst.Plot.NodeTypes.implement({
+ 'mySpecialType': {
+ 'render': function(node, canvas) {
+ //print your custom node to canvas
+ },
+ //optional
+ 'contains': function(node, pos) {
+ //return true if pos is inside the node or false otherwise
+ }
+ }
+ });
+ (end code)
+
+ */
+ Sunburst.Plot.NodeTypes = new Class( {
+ 'none': {
+ 'render': $.empty,
+ 'contains': $.lambda(false),
+ 'anglecontains': function(node, pos) {
+ var span = node.getData('span') / 2, theta = node.pos.theta;
+ var begin = theta - span, end = theta + span;
+ if (begin < 0)
+ begin += Math.PI * 2;
+ var atan = Math.atan2(pos.y, pos.x);
+ if (atan < 0)
+ atan += Math.PI * 2;
+ if (begin > end) {
+ return (atan > begin && atan <= Math.PI * 2) || atan < end;
+ } else {
+ return atan > begin && atan < end;
+ }
+ }
+ },
+
+ 'pie': {
+ 'render': function(node, canvas) {
+ var span = node.getData('span') / 2, theta = node.pos.theta;
+ var begin = theta - span, end = theta + span;
+ var polarNode = node.pos.getp(true);
+ var polar = new Polar(polarNode.rho, begin);
+ var p1coord = polar.getc(true);
+ polar.theta = end;
+ var p2coord = polar.getc(true);
+
+ var ctx = canvas.getCtx();
+ ctx.beginPath();
+ ctx.moveTo(0, 0);
+ ctx.lineTo(p1coord.x, p1coord.y);
+ ctx.moveTo(0, 0);
+ ctx.lineTo(p2coord.x, p2coord.y);
+ ctx.moveTo(0, 0);
+ ctx.arc(0, 0, polarNode.rho * node.getData('dim-quotient'), begin, end,
+ false);
+ ctx.fill();
+ },
+ 'contains': function(node, pos) {
+ if (this.nodeTypes['none'].anglecontains.call(this, node, pos)) {
+ var rho = Math.sqrt(pos.x * pos.x + pos.y * pos.y);
+ var ld = this.config.levelDistance, d = node._depth;
+ return (rho <= ld * d);
+ }
+ return false;
+ }
+ },
+ 'multipie': {
+ 'render': function(node, canvas) {
+ var height = node.getData('height');
+ var ldist = height? height : this.config.levelDistance;
+ var span = node.getData('span') / 2, theta = node.pos.theta;
+ var begin = theta - span, end = theta + span;
+ var polarNode = node.pos.getp(true);
+
+ var polar = new Polar(polarNode.rho, begin);
+ var p1coord = polar.getc(true);
+
+ polar.theta = end;
+ var p2coord = polar.getc(true);
+
+ polar.rho += ldist;
+ var p3coord = polar.getc(true);
+
+ polar.theta = begin;
+ var p4coord = polar.getc(true);
+
+ var ctx = canvas.getCtx();
+ ctx.moveTo(0, 0);
+ ctx.beginPath();
+ ctx.arc(0, 0, polarNode.rho, begin, end, false);
+ ctx.arc(0, 0, polarNode.rho + ldist, end, begin, true);
+ ctx.moveTo(p1coord.x, p1coord.y);
+ ctx.lineTo(p4coord.x, p4coord.y);
+ ctx.moveTo(p2coord.x, p2coord.y);
+ ctx.lineTo(p3coord.x, p3coord.y);
+ ctx.fill();
+
+ if (node.collapsed) {
+ ctx.save();
+ ctx.lineWidth = 2;
+ ctx.moveTo(0, 0);
+ ctx.beginPath();
+ ctx.arc(0, 0, polarNode.rho + ldist + 5, end - 0.01, begin + 0.01,
+ true);
+ ctx.stroke();
+ ctx.restore();
+ }
+ },
+ 'contains': function(node, pos) {
+ if (this.nodeTypes['none'].anglecontains.call(this, node, pos)) {
+ var rho = Math.sqrt(pos.x * pos.x + pos.y * pos.y);
+ var height = node.getData('height');
+ var ldist = height? height : this.config.levelDistance;
+ var ld = this.config.levelDistance, d = node._depth;
+ return (rho >= ld * d) && (rho <= (ld * d + ldist));
+ }
+ return false;
+ }
+ },
+
+ 'gradient-multipie': {
+ 'render': function(node, canvas) {
+ var ctx = canvas.getCtx();
+ var height = node.getData('height');
+ var ldist = height? height : this.config.levelDistance;
+ var radialGradient = ctx.createRadialGradient(0, 0, node.getPos().rho,
+ 0, 0, node.getPos().rho + ldist);
+
+ var colorArray = $.hexToRgb(node.getData('color')), ans = [];
+ $.each(colorArray, function(i) {
+ ans.push(parseInt(i * 0.5, 10));
+ });
+ var endColor = $.rgbToHex(ans);
+ radialGradient.addColorStop(0, endColor);
+ radialGradient.addColorStop(1, node.getData('color'));
+ ctx.fillStyle = radialGradient;
+ this.nodeTypes['multipie'].render.call(this, node, canvas);
+ },
+ 'contains': function(node, pos) {
+ return this.nodeTypes['multipie'].contains.call(this, node, pos);
+ }
+ },
+
+ 'gradient-pie': {
+ 'render': function(node, canvas) {
+ var ctx = canvas.getCtx();
+ var radialGradient = ctx.createRadialGradient(0, 0, 0, 0, 0, node
+ .getPos().rho);
+
+ var colorArray = $.hexToRgb(node.getData('color')), ans = [];
+ $.each(colorArray, function(i) {
+ ans.push(parseInt(i * 0.5, 10));
+ });
+ var endColor = $.rgbToHex(ans);
+ radialGradient.addColorStop(1, endColor);
+ radialGradient.addColorStop(0, node.getData('color'));
+ ctx.fillStyle = radialGradient;
+ this.nodeTypes['pie'].render.call(this, node, canvas);
+ },
+ 'contains': function(node, pos) {
+ return this.nodeTypes['pie'].contains.call(this, node, pos);
+ }
+ }
+ });
+
+ /*
+ Class: Sunburst.Plot.EdgeTypes
+
+ This class contains a list of <Graph.Adjacence> built-in types.
+ Edge types implemented are 'none', 'line' and 'arrow'.
+
+ You can add your custom edge types, customizing your visualization to the extreme.
+
+ Example:
+
+ (start code js)
+ Sunburst.Plot.EdgeTypes.implement({
+ 'mySpecialType': {
+ 'render': function(adj, canvas) {
+ //print your custom edge to canvas
+ },
+ //optional
+ 'contains': function(adj, pos) {
+ //return true if pos is inside the arc or false otherwise
+ }
+ }
+ });
+ (end code)
+
+ */
+ Sunburst.Plot.EdgeTypes = new Class({
+ 'none': $.empty,
+ 'line': {
+ 'render': function(adj, canvas) {
+ var from = adj.nodeFrom.pos.getc(true),
+ to = adj.nodeTo.pos.getc(true);
+ this.edgeHelper.line.render(from, to, canvas);
+ },
+ 'contains': function(adj, pos) {
+ var from = adj.nodeFrom.pos.getc(true),
+ to = adj.nodeTo.pos.getc(true);
+ return this.edgeHelper.line.contains(from, to, pos, this.edge.epsilon);
+ }
+ },
+ 'arrow': {
+ 'render': function(adj, canvas) {
+ var from = adj.nodeFrom.pos.getc(true),
+ to = adj.nodeTo.pos.getc(true),
+ dim = adj.getData('dim'),
+ direction = adj.data.$direction,
+ inv = (direction && direction.length>1 && direction[0] != adj.nodeFrom.id);
+ this.edgeHelper.arrow.render(from, to, dim, inv, canvas);
+ },
+ 'contains': function(adj, pos) {
+ var from = adj.nodeFrom.pos.getc(true),
+ to = adj.nodeTo.pos.getc(true);
+ return this.edgeHelper.arrow.contains(from, to, pos, this.edge.epsilon);
+ }
+ },
+ 'hyperline': {
+ 'render': function(adj, canvas) {
+ var from = adj.nodeFrom.pos.getc(),
+ to = adj.nodeTo.pos.getc(),
+ dim = Math.max(from.norm(), to.norm());
+ this.edgeHelper.hyperline.render(from.$scale(1/dim), to.$scale(1/dim), dim, canvas);
+ },
+ 'contains': $.lambda(false) //TODO(nico): Implement this!
+ }
+ });
+
+})($jit.Sunburst);
+
+
+/*
+ * File: PieChart.js
+ *
+*/
+
+$jit.Sunburst.Plot.NodeTypes.implement({
+ 'piechart-stacked' : {
+ 'render' : function(node, canvas) {
+ var pos = node.pos.getp(true),
+ dimArray = node.getData('dimArray'),
+ valueArray = node.getData('valueArray'),
+ colorArray = node.getData('colorArray'),
+ colorLength = colorArray.length,
+ stringArray = node.getData('stringArray'),
+ span = node.getData('span') / 2,
+ theta = node.pos.theta,
+ begin = theta - span,
+ end = theta + span,
+ polar = new Polar;
+
+ var ctx = canvas.getCtx(),
+ opt = {},
+ gradient = node.getData('gradient'),
+ border = node.getData('border'),
+ config = node.getData('config'),
+ showLabels = config.showLabels,
+ resizeLabels = config.resizeLabels,
+ label = config.Label;
+
+ var xpos = config.sliceOffset * Math.cos((begin + end) /2);
+ var ypos = config.sliceOffset * Math.sin((begin + end) /2);
+
+ if (colorArray && dimArray && stringArray) {
+ for (var i=0, l=dimArray.length, acum=0, valAcum=0; i<l; i++) {
+ var dimi = dimArray[i], colori = colorArray[i % colorLength];
+ if(dimi <= 0) continue;
+ ctx.fillStyle = ctx.strokeStyle = colori;
+ if(gradient && dimi) {
+ var radialGradient = ctx.createRadialGradient(xpos, ypos, acum + config.sliceOffset,
+ xpos, ypos, acum + dimi + config.sliceOffset);
+ var colorRgb = $.hexToRgb(colori),
+ ans = $.map(colorRgb, function(i) { return (i * 0.8) >> 0; }),
+ endColor = $.rgbToHex(ans);
+
+ radialGradient.addColorStop(0, colori);
+ radialGradient.addColorStop(0.5, colori);
+ radialGradient.addColorStop(1, endColor);
+ ctx.fillStyle = radialGradient;
+ }
+
+ polar.rho = acum + config.sliceOffset;
+ polar.theta = begin;
+ var p1coord = polar.getc(true);
+ polar.theta = end;
+ var p2coord = polar.getc(true);
+ polar.rho += dimi;
+ var p3coord = polar.getc(true);
+ polar.theta = begin;
+ var p4coord = polar.getc(true);
+
+ ctx.beginPath();
+ //fixing FF arc method + fill
+ ctx.arc(xpos, ypos, acum + .01, begin, end, false);
+ ctx.arc(xpos, ypos, acum + dimi + .01, end, begin, true);
+ ctx.fill();
+ if(border && border.name == stringArray[i]) {
+ opt.acum = acum;
+ opt.dimValue = dimArray[i];
+ opt.begin = begin;
+ opt.end = end;
+ }
+ acum += (dimi || 0);
+ valAcum += (valueArray[i] || 0);
+ }
+ if(border) {
+ ctx.save();
+ ctx.globalCompositeOperation = "source-over";
+ ctx.lineWidth = 2;
+ ctx.strokeStyle = border.color;
+ var s = begin < end? 1 : -1;
+ ctx.beginPath();
+ //fixing FF arc method + fill
+ ctx.arc(xpos, ypos, opt.acum + .01 + 1, opt.begin, opt.end, false);
+ ctx.arc(xpos, ypos, opt.acum + opt.dimValue + .01 - 1, opt.end, opt.begin, true);
+ ctx.closePath();
+ ctx.stroke();
+ ctx.restore();
+ }
+ if(showLabels && label.type == 'Native') {
+ ctx.save();
+ ctx.fillStyle = ctx.strokeStyle = label.color;
+ var scale = resizeLabels? node.getData('normalizedDim') : 1,
+ fontSize = (label.size * scale) >> 0;
+ fontSize = fontSize < +resizeLabels? +resizeLabels : fontSize;
+
+ ctx.font = label.style + ' ' + fontSize + 'px ' + label.family;
+ ctx.textBaseline = 'middle';
+ ctx.textAlign = 'center';
+
+ polar.rho = acum + config.labelOffset + config.sliceOffset;
+ polar.theta = node.pos.theta;
+ var cart = polar.getc(true);
+
+ ctx.fillText(node.name, cart.x, cart.y);
+ ctx.restore();
+ }
+ }
+ },
+ 'contains': function(node, pos) {
+ if (this.nodeTypes['none'].anglecontains.call(this, node, pos)) {
+ var rho = Math.sqrt(pos.x * pos.x + pos.y * pos.y);
+ var ld = this.config.levelDistance, d = node._depth;
+ var config = node.getData('config');
+ if(rho <=ld * d + config.sliceOffset) {
+ var dimArray = node.getData('dimArray');
+ for(var i=0,l=dimArray.length,acum=config.sliceOffset; i<l; i++) {
+ var dimi = dimArray[i];
+ if(rho >= acum && rho <= acum + dimi) {
+ return {
+ name: node.getData('stringArray')[i],
+ color: node.getData('colorArray')[i],
+ value: node.getData('valueArray')[i],
+ label: node.name
+ };
+ }
+ acum += dimi;
+ }
+ }
+ return false;
+
+ }
+ return false;
+ }
+ }
+});
+
+/*
+ Class: PieChart
+
+ A visualization that displays stacked bar charts.
+
+ Constructor Options:
+
+ See <Options.PieChart>.
+
+*/
+$jit.PieChart = new Class({
+ sb: null,
+ colors: ["#416D9C", "#70A35E", "#EBB056", "#C74243", "#83548B", "#909291", "#557EAA"],
+ selected: {},
+ busy: false,
+
+ initialize: function(opt) {
+ this.controller = this.config =
+ $.merge(Options("Canvas", "PieChart", "Label"), {
+ Label: { type: 'Native' }
+ }, opt);
+ this.initializeViz();
+ },
+
+ initializeViz: function() {
+ var config = this.config, that = this;
+ var nodeType = config.type.split(":")[0];
+ var sb = new $jit.Sunburst({
+ injectInto: config.injectInto,
+ useCanvas: config.useCanvas,
+ withLabels: config.Label.type != 'Native',
+ Label: {
+ type: config.Label.type
+ },
+ Node: {
+ overridable: true,
+ type: 'piechart-' + nodeType,
+ width: 1,
+ height: 1
+ },
+ Edge: {
+ type: 'none'
+ },
+ Tips: {
+ enable: config.Tips.enable,
+ type: 'Native',
+ force: true,
+ onShow: function(tip, node, contains) {
+ var elem = contains;
+ config.Tips.onShow(tip, elem, node);
+ }
+ },
+ Events: {
+ enable: true,
+ type: 'Native',
+ onClick: function(node, eventInfo, evt) {
+ if(!config.Events.enable) return;
+ var elem = eventInfo.getContains();
+ config.Events.onClick(elem, eventInfo, evt);
+ },
+ onMouseMove: function(node, eventInfo, evt) {
+ if(!config.hoveredColor) return;
+ if(node) {
+ var elem = eventInfo.getContains();
+ that.select(node.id, elem.name, elem.index);
+ } else {
+ that.select(false, false, false);
+ }
+ }
+ },
+ onCreateLabel: function(domElement, node) {
+ var labelConf = config.Label;
+ if(config.showLabels) {
+ var style = domElement.style;
+ style.fontSize = labelConf.size + 'px';
+ style.fontFamily = labelConf.family;
+ style.color = labelConf.color;
+ style.textAlign = 'center';
+ domElement.innerHTML = node.name;
+ }
+ },
+ onPlaceLabel: function(domElement, node) {
+ if(!config.showLabels) return;
+ var pos = node.pos.getp(true),
+ dimArray = node.getData('dimArray'),
+ span = node.getData('span') / 2,
+ theta = node.pos.theta,
+ begin = theta - span,
+ end = theta + span,
+ polar = new Polar;
+
+ var showLabels = config.showLabels,
+ resizeLabels = config.resizeLabels,
+ label = config.Label;
+
+ if (dimArray) {
+ for (var i=0, l=dimArray.length, acum=0; i<l; i++) {
+ acum += dimArray[i];
+ }
+ var scale = resizeLabels? node.getData('normalizedDim') : 1,
+ fontSize = (label.size * scale) >> 0;
+ fontSize = fontSize < +resizeLabels? +resizeLabels : fontSize;
+ domElement.style.fontSize = fontSize + 'px';
+ polar.rho = acum + config.labelOffset + config.sliceOffset;
+ polar.theta = (begin + end) / 2;
+ var pos = polar.getc(true);
+ var radius = that.canvas.getSize();
+ var labelPos = {
+ x: Math.round(pos.x + radius.width / 2),
+ y: Math.round(pos.y + radius.height / 2)
+ };
+ domElement.style.left = labelPos.x + 'px';
+ domElement.style.top = labelPos.y + 'px';
+ }
+ }
+ });
+
+ var size = sb.canvas.getSize(),
+ min = Math.min;
+ sb.config.levelDistance = min(size.width, size.height)/2
+ - config.offset - config.sliceOffset;
+ this.sb = sb;
+ this.canvas = this.sb.canvas;
+ this.canvas.getCtx().globalCompositeOperation = 'lighter';
+ },
+
+ /*
+ Method: loadJSON
+
+ Loads JSON data into the visualization.
+
+ Parameters:
+
+ json - The JSON data format. This format is described in <http://blog.thejit.org/2010/04/24/new-javascript-infovis-toolkit-visualizations/#json-data-format>.
+
+ Example:
+ (start code js)
+ var pieChart = new $jit.PieChart(options);
+ pieChart.loadJSON(json);
+ (end code)
+ */
+ loadJSON: function(json) {
+ var prefix = $.time(),
+ ch = [],
+ sb = this.sb,
+ name = $.splat(json.label),
+ nameLength = name.length,
+ color = $.splat(json.color || this.colors),
+ colorLength = color.length,
+ config = this.config,
+ gradient = !!config.type.split(":")[1],
+ animate = config.animate,
+ mono = nameLength == 1;
+
+ for(var i=0, values=json.values, l=values.length; i<l; i++) {
+ var val = values[i];
+ var valArray = $.splat(val.values);
+ ch.push({
+ 'id': prefix + val.label,
+ 'name': val.label,
+ 'data': {
+ 'value': valArray,
+ '$valueArray': valArray,
+ '$colorArray': mono? $.splat(color[i % colorLength]) : color,
+ '$stringArray': name,
+ '$gradient': gradient,
+ '$config': config,
+ '$angularWidth': $.reduce(valArray, function(x,y){return x+y;})
+ },
+ 'children': []
+ });
+ }
+ var root = {
+ 'id': prefix + '$root',
+ 'name': '',
+ 'data': {
+ '$type': 'none',
+ '$width': 1,
+ '$height': 1
+ },
+ 'children': ch
+ };
+ sb.loadJSON(root);
+
+ this.normalizeDims();
+ sb.refresh();
+ if(animate) {
+ sb.fx.animate({
+ modes: ['node-property:dimArray'],
+ duration:1500
+ });
+ }
+ },
+
+ /*
+ Method: updateJSON
+
+ Use this method when updating values for the current JSON data. If the items specified by the JSON data already exist in the graph then their values will be updated.
+
+ Parameters:
+
+ json - (object) JSON data to be updated. The JSON format corresponds to the one described in <PieChart.loadJSON>.
+ onComplete - (object) A callback object to be called when the animation transition when updating the data end.
+
+ Example:
+
+ (start code js)
+ pieChart.updateJSON(json, {
+ onComplete: function() {
+ alert('update complete!');
+ }
+ });
+ (end code)
+ */
+ updateJSON: function(json, onComplete) {
+ if(this.busy) return;
+ this.busy = true;
+
+ var sb = this.sb;
+ var graph = sb.graph;
+ var values = json.values;
+ var animate = this.config.animate;
+ var that = this;
+ $.each(values, function(v) {
+ var n = graph.getByName(v.label),
+ vals = $.splat(v.values);
+ if(n) {
+ n.setData('valueArray', vals);
+ n.setData('angularWidth', $.reduce(vals, function(x,y){return x+y;}));
+ if(json.label) {
+ n.setData('stringArray', $.splat(json.label));
+ }
+ }
+ });
+ this.normalizeDims();
+ if(animate) {
+ sb.compute('end');
+ sb.fx.animate({
+ modes: ['node-property:dimArray:span', 'linear'],
+ duration:1500,
+ onComplete: function() {
+ that.busy = false;
+ onComplete && onComplete.onComplete();
+ }
+ });
+ } else {
+ sb.refresh();
+ }
+ },
+
+ //adds the little brown bar when hovering the node
+ select: function(id, name) {
+ if(!this.config.hoveredColor) return;
+ var s = this.selected;
+ if(s.id != id || s.name != name) {
+ s.id = id;
+ s.name = name;
+ s.color = this.config.hoveredColor;
+ this.sb.graph.eachNode(function(n) {
+ if(id == n.id) {
+ n.setData('border', s);
+ } else {
+ n.setData('border', false);
+ }
+ });
+ this.sb.plot();
+ }
+ },
+
+ /*
+ Method: getLegend
+
+ Returns an object containing as keys the legend names and as values hex strings with color values.
+
+ Example:
+
+ (start code js)
+ var legend = pieChart.getLegend();
+ (end code)
+ */
+ getLegend: function() {
+ var legend = {};
+ var n;
+ this.sb.graph.getNode(this.sb.root).eachAdjacency(function(adj) {
+ n = adj.nodeTo;
+ });
+ var colors = n.getData('colorArray'),
+ len = colors.length;
+ $.each(n.getData('stringArray'), function(s, i) {
+ legend[s] = colors[i % len];
+ });
+ return legend;
+ },
+
+ /*
+ Method: getMaxValue
+
+ Returns the maximum accumulated value for the stacks. This method is used for normalizing the graph heights according to the canvas height.
+
+ Example:
+
+ (start code js)
+ var ans = pieChart.getMaxValue();
+ (end code)
+
+ In some cases it could be useful to override this method to normalize heights for a group of PieCharts, like when doing small multiples.
+
+ Example:
+
+ (start code js)
+ //will return 100 for all PieChart instances,
+ //displaying all of them with the same scale
+ $jit.PieChart.implement({
+ 'getMaxValue': function() {
+ return 100;
+ }
+ });
+ (end code)
+
+ */
+ getMaxValue: function() {
+ var maxValue = 0;
+ this.sb.graph.eachNode(function(n) {
+ var valArray = n.getData('valueArray'),
+ acum = 0;
+ $.each(valArray, function(v) {
+ acum += +v;
+ });
+ maxValue = maxValue>acum? maxValue:acum;
+ });
+ return maxValue;
+ },
+
+ normalizeDims: function() {
+ //number of elements
+ var root = this.sb.graph.getNode(this.sb.root), l=0;
+ root.eachAdjacency(function() {
+ l++;
+ });
+ var maxValue = this.getMaxValue() || 1,
+ config = this.config,
+ animate = config.animate,
+ rho = this.sb.config.levelDistance;
+ this.sb.graph.eachNode(function(n) {
+ var acum = 0, animateValue = [];
+ $.each(n.getData('valueArray'), function(v) {
+ acum += +v;
+ animateValue.push(1);
+ });
+ var stat = (animateValue.length == 1) && !config.updateHeights;
+ if(animate) {
+ n.setData('dimArray', $.map(n.getData('valueArray'), function(n) {
+ return stat? rho: (n * rho / maxValue);
+ }), 'end');
+ var dimArray = n.getData('dimArray');
+ if(!dimArray) {
+ n.setData('dimArray', animateValue);
+ }
+ } else {
+ n.setData('dimArray', $.map(n.getData('valueArray'), function(n) {
+ return stat? rho : (n * rho / maxValue);
+ }));
+ }
+ n.setData('normalizedDim', acum / maxValue);
+ });
+ }
+});
+
+/*
+ * Class: Layouts.TM
+ *
+ * Implements TreeMaps layouts (SliceAndDice, Squarified, Strip).
+ *
+ * Implemented By:
+ *
+ * <TM>
+ *
+ */
+Layouts.TM = {};
+
+Layouts.TM.SliceAndDice = new Class({
+ compute: function(prop) {
+ var root = this.graph.getNode(this.clickedNode && this.clickedNode.id || this.root);
+ this.controller.onBeforeCompute(root);
+ var size = this.canvas.getSize(),
+ config = this.config,
+ width = size.width,
+ height = size.height;
+ this.graph.computeLevels(this.root, 0, "ignore");
+ //set root position and dimensions
+ root.getPos(prop).setc(-width/2, -height/2);
+ root.setData('width', width, prop);
+ root.setData('height', height + config.titleHeight, prop);
+ this.computePositions(root, root, this.layout.orientation, prop);
+ this.controller.onAfterCompute(root);
+ },
+
+ computePositions: function(par, ch, orn, prop) {
+ //compute children areas
+ var totalArea = 0;
+ par.eachSubnode(function(n) {
+ totalArea += n.getData('area', prop);
+ });
+
+ var config = this.config,
+ offst = config.offset,
+ width = par.getData('width', prop),
+ height = par.getData('height', prop) - config.titleHeight,
+ fact = par == ch? 1: (ch.getData('area', prop) / totalArea);
+
+ var otherSize, size, dim, pos, pos2, posth, pos2th;
+ var horizontal = (orn == "h");
+ if(horizontal) {
+ orn = 'v';
+ otherSize = height;
+ size = width * fact;
+ dim = 'height';
+ pos = 'y';
+ pos2 = 'x';
+ posth = config.titleHeight;
+ pos2th = 0;
+ } else {
+ orn = 'h';
+ otherSize = height * fact;
+ size = width;
+ dim = 'width';
+ pos = 'x';
+ pos2 = 'y';
+ posth = 0;
+ pos2th = config.titleHeight;
+ }
+ var cpos = ch.getPos(prop);
+ ch.setData('width', size, prop);
+ ch.setData('height', otherSize, prop);
+ var offsetSize = 0, tm = this;
+ ch.eachSubnode(function(n) {
+ var p = n.getPos(prop);
+ p[pos] = offsetSize + cpos[pos] + posth;
+ p[pos2] = cpos[pos2] + pos2th;
+ tm.computePositions(ch, n, orn, prop);
+ offsetSize += n.getData(dim, prop);
+ });
+ }
+
+});
+
+Layouts.TM.Area = {
+ /*
+ Method: compute
+
+ Called by loadJSON to calculate recursively all node positions and lay out the tree.
+
+ Parameters:
+
+ json - A JSON tree. See also <Loader.loadJSON>.
+ coord - A coordinates object specifying width, height, left and top style properties.
+ */
+ compute: function(prop) {
+ prop = prop || "current";
+ var root = this.graph.getNode(this.clickedNode && this.clickedNode.id || this.root);
+ this.controller.onBeforeCompute(root);
+ var config = this.config,
+ size = this.canvas.getSize(),
+ width = size.width,
+ height = size.height,
+ offst = config.offset,
+ offwdth = width - offst,
+ offhght = height - offst;
+ this.graph.computeLevels(this.root, 0, "ignore");
+ //set root position and dimensions
+ root.getPos(prop).setc(-width/2, -height/2);
+ root.setData('width', width, prop);
+ root.setData('height', height, prop);
+ //create a coordinates object
+ var coord = {
+ 'top': -height/2 + config.titleHeight,
+ 'left': -width/2,
+ 'width': offwdth,
+ 'height': offhght - config.titleHeight
+ };
+ this.computePositions(root, coord, prop);
+ this.controller.onAfterCompute(root);
+ },
+
+ /*
+ Method: computeDim
+
+ Computes dimensions and positions of a group of nodes
+ according to a custom layout row condition.
+
+ Parameters:
+
+ tail - An array of nodes.
+ initElem - An array of nodes (containing the initial node to be laid).
+ w - A fixed dimension where nodes will be layed out.
+ coord - A coordinates object specifying width, height, left and top style properties.
+ comp - A custom comparison function
+ */
+ computeDim: function(tail, initElem, w, coord, comp, prop) {
+ if(tail.length + initElem.length == 1) {
+ var l = (tail.length == 1)? tail : initElem;
+ this.layoutLast(l, w, coord, prop);
+ return;
+ }
+ if(tail.length >= 2 && initElem.length == 0) {
+ initElem = [tail.shift()];
+ }
+ if(tail.length == 0) {
+ if(initElem.length > 0) this.layoutRow(initElem, w, coord, prop);
+ return;
+ }
+ var c = tail[0];
+ if(comp(initElem, w) >= comp([c].concat(initElem), w)) {
+ this.computeDim(tail.slice(1), initElem.concat([c]), w, coord, comp, prop);
+ } else {
+ var newCoords = this.layoutRow(initElem, w, coord, prop);
+ this.computeDim(tail, [], newCoords.dim, newCoords, comp, prop);
+ }
+ },
+
+
+ /*
+ Method: worstAspectRatio
+
+ Calculates the worst aspect ratio of a group of rectangles.
+
+ See also:
+
+ <http://en.wikipedia.org/wiki/Aspect_ratio>
+
+ Parameters:
+
+ ch - An array of nodes.
+ w - The fixed dimension where rectangles are being laid out.
+
+ Returns:
+
+ The worst aspect ratio.
+
+
+ */
+ worstAspectRatio: function(ch, w) {
+ if(!ch || ch.length == 0) return Number.MAX_VALUE;
+ var areaSum = 0, maxArea = 0, minArea = Number.MAX_VALUE;
+ for(var i=0, l=ch.length; i<l; i++) {
+ var area = ch[i]._area;
+ areaSum += area;
+ minArea = minArea < area? minArea : area;
+ maxArea = maxArea > area? maxArea : area;
+ }
+ var sqw = w * w, sqAreaSum = areaSum * areaSum;
+ return Math.max(sqw * maxArea / sqAreaSum,
+ sqAreaSum / (sqw * minArea));
+ },
+
+ /*
+ Method: avgAspectRatio
+
+ Calculates the average aspect ratio of a group of rectangles.
+
+ See also:
+
+ <http://en.wikipedia.org/wiki/Aspect_ratio>
+
+ Parameters:
+
+ ch - An array of nodes.
+ w - The fixed dimension where rectangles are being laid out.
+
+ Returns:
+
+ The average aspect ratio.
+
+
+ */
+ avgAspectRatio: function(ch, w) {
+ if(!ch || ch.length == 0) return Number.MAX_VALUE;
+ var arSum = 0;
+ for(var i=0, l=ch.length; i<l; i++) {
+ var area = ch[i]._area;
+ var h = area / w;
+ arSum += w > h? w / h : h / w;
+ }
+ return arSum / l;
+ },
+
+ /*
+ layoutLast
+
+ Performs the layout of the last computed sibling.
+
+ Parameters:
+
+ ch - An array of nodes.
+ w - A fixed dimension where nodes will be layed out.
+ coord - A coordinates object specifying width, height, left and top style properties.
+ */
+ layoutLast: function(ch, w, coord, prop) {
+ var child = ch[0];
+ child.getPos(prop).setc(coord.left, coord.top);
+ child.setData('width', coord.width, prop);
+ child.setData('height', coord.height, prop);
+ }
+};
+
+
+Layouts.TM.Squarified = new Class({
+ Implements: Layouts.TM.Area,
+
+ computePositions: function(node, coord, prop) {
+ var config = this.config;
+
+ if (coord.width >= coord.height)
+ this.layout.orientation = 'h';
+ else
+ this.layout.orientation = 'v';
+
+ var ch = node.getSubnodes([1, 1], "ignore");
+ if(ch.length > 0) {
+ this.processChildrenLayout(node, ch, coord, prop);
+ for(var i=0, l=ch.length; i<l; i++) {
+ var chi = ch[i];
+ var offst = config.offset,
+ height = chi.getData('height', prop) - offst - config.titleHeight,
+ width = chi.getData('width', prop) - offst;
+ var chipos = chi.getPos(prop);
+ coord = {
+ 'width': width,
+ 'height': height,
+ 'top': chipos.y + config.titleHeight,
+ 'left': chipos.x
+ };
+ this.computePositions(chi, coord, prop);
+ }
+ }
+ },
+
+ /*
+ Method: processChildrenLayout
+
+ Computes children real areas and other useful parameters for performing the Squarified algorithm.
+
+ Parameters:
+
+ par - The parent node of the json subtree.
+ ch - An Array of nodes
+ coord - A coordinates object specifying width, height, left and top style properties.
+ */
+ processChildrenLayout: function(par, ch, coord, prop) {
+ //compute children real areas
+ var parentArea = coord.width * coord.height;
+ var i, l=ch.length, totalChArea=0, chArea = [];
+ for(i=0; i<l; i++) {
+ chArea[i] = parseFloat(ch[i].getData('area', prop));
+ totalChArea += chArea[i];
+ }
+ for(i=0; i<l; i++) {
+ ch[i]._area = parentArea * chArea[i] / totalChArea;
+ }
+ var minimumSideValue = this.layout.horizontal()? coord.height : coord.width;
+ ch.sort(function(a, b) {
+ var diff = b._area - a._area;
+ return diff? diff : (b.id == a.id? 0 : (b.id < a.id? 1 : -1));
+ });
+ var initElem = [ch[0]];
+ var tail = ch.slice(1);
+ this.squarify(tail, initElem, minimumSideValue, coord, prop);
+ },
+
+ /*
+ Method: squarify
+
+ Performs an heuristic method to calculate div elements sizes in order to have a good aspect ratio.
+
+ Parameters:
+
+ tail - An array of nodes.
+ initElem - An array of nodes, containing the initial node to be laid out.
+ w - A fixed dimension where nodes will be laid out.
+ coord - A coordinates object specifying width, height, left and top style properties.
+ */
+ squarify: function(tail, initElem, w, coord, prop) {
+ this.computeDim(tail, initElem, w, coord, this.worstAspectRatio, prop);
+ },
+
+ /*
+ Method: layoutRow
+
+ Performs the layout of an array of nodes.
+
+ Parameters:
+
+ ch - An array of nodes.
+ w - A fixed dimension where nodes will be laid out.
+ coord - A coordinates object specifying width, height, left and top style properties.
+ */
+ layoutRow: function(ch, w, coord, prop) {
+ if(this.layout.horizontal()) {
+ return this.layoutV(ch, w, coord, prop);
+ } else {
+ return this.layoutH(ch, w, coord, prop);
+ }
+ },
+
+ layoutV: function(ch, w, coord, prop) {
+ var totalArea = 0, rnd = function(x) { return x; };
+ $.each(ch, function(elem) { totalArea += elem._area; });
+ var width = rnd(totalArea / w), top = 0;
+ for(var i=0, l=ch.length; i<l; i++) {
+ var h = rnd(ch[i]._area / width);
+ var chi = ch[i];
+ chi.getPos(prop).setc(coord.left, coord.top + top);
+ chi.setData('width', width, prop);
+ chi.setData('height', h, prop);
+ top += h;
+ }
+ var ans = {
+ 'height': coord.height,
+ 'width': coord.width - width,
+ 'top': coord.top,
+ 'left': coord.left + width
+ };
+ //take minimum side value.
+ ans.dim = Math.min(ans.width, ans.height);
+ if(ans.dim != ans.height) this.layout.change();
+ return ans;
+ },
+
+ layoutH: function(ch, w, coord, prop) {
+ var totalArea = 0;
+ $.each(ch, function(elem) { totalArea += elem._area; });
+ var height = totalArea / w,
+ top = coord.top,
+ left = 0;
+
+ for(var i=0, l=ch.length; i<l; i++) {
+ var chi = ch[i];
+ var w = chi._area / height;
+ chi.getPos(prop).setc(coord.left + left, top);
+ chi.setData('width', w, prop);
+ chi.setData('height', height, prop);
+ left += w;
+ }
+ var ans = {
+ 'height': coord.height - height,
+ 'width': coord.width,
+ 'top': coord.top + height,
+ 'left': coord.left
+ };
+ ans.dim = Math.min(ans.width, ans.height);
+ if(ans.dim != ans.width) this.layout.change();
+ return ans;
+ }
+});
+
+Layouts.TM.Strip = new Class({
+ Implements: Layouts.TM.Area,
+
+ /*
+ Method: compute
+
+ Called by loadJSON to calculate recursively all node positions and lay out the tree.
+
+ Parameters:
+
+ json - A JSON subtree. See also <Loader.loadJSON>.
+ coord - A coordinates object specifying width, height, left and top style properties.
+ */
+ computePositions: function(node, coord, prop) {
+ var ch = node.getSubnodes([1, 1], "ignore"), config = this.config;
+ if(ch.length > 0) {
+ this.processChildrenLayout(node, ch, coord, prop);
+ for(var i=0, l=ch.length; i<l; i++) {
+ var chi = ch[i];
+ var offst = config.offset,
+ height = chi.getData('height', prop) - offst - config.titleHeight,
+ width = chi.getData('width', prop) - offst;
+ var chipos = chi.getPos(prop);
+ coord = {
+ 'width': width,
+ 'height': height,
+ 'top': chipos.y + config.titleHeight,
+ 'left': chipos.x
+ };
+ this.computePositions(chi, coord, prop);
+ }
+ }
+ },
+
+ /*
+ Method: processChildrenLayout
+
+ Computes children real areas and other useful parameters for performing the Strip algorithm.
+
+ Parameters:
+
+ par - The parent node of the json subtree.
+ ch - An Array of nodes
+ coord - A coordinates object specifying width, height, left and top style properties.
+ */
+ processChildrenLayout: function(par, ch, coord, prop) {
+ //compute children real areas
+ var parentArea = coord.width * coord.height;
+ var i, l=ch.length, totalChArea=0, chArea = [];
+ for(i=0; i<l; i++) {
+ chArea[i] = +ch[i].getData('area', prop);
+ totalChArea += chArea[i];
+ }
+ for(i=0; i<l; i++) {
+ ch[i]._area = parentArea * chArea[i] / totalChArea;
+ }
+ var side = this.layout.horizontal()? coord.width : coord.height;
+ var initElem = [ch[0]];
+ var tail = ch.slice(1);
+ this.stripify(tail, initElem, side, coord, prop);
+ },
+
+ /*
+ Method: stripify
+
+ Performs an heuristic method to calculate div elements sizes in order to have
+ a good compromise between aspect ratio and order.
+
+ Parameters:
+
+ tail - An array of nodes.
+ initElem - An array of nodes.
+ w - A fixed dimension where nodes will be layed out.
+ coord - A coordinates object specifying width, height, left and top style properties.
+ */
+ stripify: function(tail, initElem, w, coord, prop) {
+ this.computeDim(tail, initElem, w, coord, this.avgAspectRatio, prop);
+ },
+
+ /*
+ Method: layoutRow
+
+ Performs the layout of an array of nodes.
+
+ Parameters:
+
+ ch - An array of nodes.
+ w - A fixed dimension where nodes will be laid out.
+ coord - A coordinates object specifying width, height, left and top style properties.
+ */
+ layoutRow: function(ch, w, coord, prop) {
+ if(this.layout.horizontal()) {
+ return this.layoutH(ch, w, coord, prop);
+ } else {
+ return this.layoutV(ch, w, coord, prop);
+ }
+ },
+
+ layoutV: function(ch, w, coord, prop) {
+ var totalArea = 0;
+ $.each(ch, function(elem) { totalArea += elem._area; });
+ var width = totalArea / w, top = 0;
+ for(var i=0, l=ch.length; i<l; i++) {
+ var chi = ch[i];
+ var h = chi._area / width;
+ chi.getPos(prop).setc(coord.left,
+ coord.top + (w - h - top));
+ chi.setData('width', width, prop);
+ chi.setData('height', h, prop);
+ top += h;
+ }
+
+ return {
+ 'height': coord.height,
+ 'width': coord.width - width,
+ 'top': coord.top,
+ 'left': coord.left + width,
+ 'dim': w
+ };
+ },
+
+ layoutH: function(ch, w, coord, prop) {
+ var totalArea = 0;
+ $.each(ch, function(elem) { totalArea += elem._area; });
+ var height = totalArea / w,
+ top = coord.height - height,
+ left = 0;
+
+ for(var i=0, l=ch.length; i<l; i++) {
+ var chi = ch[i];
+ var s = chi._area / height;
+ chi.getPos(prop).setc(coord.left + left, coord.top + top);
+ chi.setData('width', s, prop);
+ chi.setData('height', height, prop);
+ left += s;
+ }
+ return {
+ 'height': coord.height - height,
+ 'width': coord.width,
+ 'top': coord.top,
+ 'left': coord.left,
+ 'dim': w
+ };
+ }
+ });
+
+/*
+ * Class: Layouts.Icicle
+ *
+ * Implements the icicle tree layout.
+ *
+ * Implemented By:
+ *
+ * <Icicle>
+ *
+ */
+
+Layouts.Icicle = new Class({
+ /*
+ * Method: compute
+ *
+ * Called by loadJSON to calculate all node positions.
+ *
+ * Parameters:
+ *
+ * posType - The nodes' position to compute. Either "start", "end" or
+ * "current". Defaults to "current".
+ */
+ compute: function(posType) {
+ posType = posType || "current";
+
+ var root = this.graph.getNode(this.root),
+ config = this.config,
+ size = this.canvas.getSize(),
+ width = size.width,
+ height = size.height,
+ offset = config.offset,
+ levelsToShow = config.constrained ? config.levelsToShow : Number.MAX_VALUE;
+
+ this.controller.onBeforeCompute(root);
+
+ Graph.Util.computeLevels(this.graph, root.id, 0, "ignore");
+
+ var treeDepth = 0;
+
+ Graph.Util.eachLevel(root, 0, false, function (n, d) { if(d > treeDepth) treeDepth = d; });
+
+ var startNode = this.graph.getNode(this.clickedNode && this.clickedNode.id || root.id);
+ var maxDepth = Math.min(treeDepth, levelsToShow-1);
+ var initialDepth = startNode._depth;
+ if(this.layout.horizontal()) {
+ this.computeSubtree(startNode, -width/2, -height/2, width/(maxDepth+1), height, initialDepth, maxDepth, posType);
+ } else {
+ this.computeSubtree(startNode, -width/2, -height/2, width, height/(maxDepth+1), initialDepth, maxDepth, posType);
+ }
+ },
+
+ computeSubtree: function (root, x, y, width, height, initialDepth, maxDepth, posType) {
+ root.getPos(posType).setc(x, y);
+ root.setData('width', width, posType);
+ root.setData('height', height, posType);
+
+ var nodeLength, prevNodeLength = 0, totalDim = 0;
+ var children = Graph.Util.getSubnodes(root, [1, 1]); // next level from this node
+
+ if(!children.length)
+ return;
+
+ $.each(children, function(e) { totalDim += e.getData('dim'); });
+
+ for(var i=0, l=children.length; i < l; i++) {
+ if(this.layout.horizontal()) {
+ nodeLength = height * children[i].getData('dim') / totalDim;
+ this.computeSubtree(children[i], x+width, y, width, nodeLength, initialDepth, maxDepth, posType);
+ y += nodeLength;
+ } else {
+ nodeLength = width * children[i].getData('dim') / totalDim;
+ this.computeSubtree(children[i], x, y+height, nodeLength, height, initialDepth, maxDepth, posType);
+ x += nodeLength;
+ }
+ }
+ }
+});
+
+
+
+/*
+ * File: Icicle.js
+ *
+*/
+
+/*
+ Class: Icicle
+
+ Icicle space filling visualization.
+
+ Implements:
+
+ All <Loader> methods
+
+ Constructor Options:
+
+ Inherits options from
+
+ - <Options.Canvas>
+ - <Options.Controller>
+ - <Options.Node>
+ - <Options.Edge>
+ - <Options.Label>
+ - <Options.Events>
+ - <Options.Tips>
+ - <Options.NodeStyles>
+ - <Options.Navigation>
+
+ Additionally, there are other parameters and some default values changed
+
+ orientation - (string) Default's *h*. Whether to set horizontal or vertical layouts. Possible values are 'h' and 'v'.
+ offset - (number) Default's *2*. Boxes offset.
+ constrained - (boolean) Default's *false*. Whether to show the entire tree when loaded or just the number of levels specified by _levelsToShow_.
+ levelsToShow - (number) Default's *3*. The number of levels to show for a subtree. This number is relative to the selected node.
+ animate - (boolean) Default's *false*. Whether to animate transitions.
+ Node.type - Described in <Options.Node>. Default's *rectangle*.
+ Label.type - Described in <Options.Label>. Default's *Native*.
+ duration - Described in <Options.Fx>. Default's *700*.
+ fps - Described in <Options.Fx>. Default's *45*.
+
+ Instance Properties:
+
+ canvas - Access a <Canvas> instance.
+ graph - Access a <Graph> instance.
+ op - Access a <Icicle.Op> instance.
+ fx - Access a <Icicle.Plot> instance.
+ labels - Access a <Icicle.Label> interface implementation.
+
+*/
+
+$jit.Icicle = new Class({
+ Implements: [ Loader, Extras, Layouts.Icicle ],
+
+ layout: {
+ orientation: "h",
+ vertical: function(){
+ return this.orientation == "v";
+ },
+ horizontal: function(){
+ return this.orientation == "h";
+ },
+ change: function(){
+ this.orientation = this.vertical()? "h" : "v";
+ }
+ },
+
+ initialize: function(controller) {
+ var config = {
+ animate: false,
+ orientation: "h",
+ offset: 2,
+ levelsToShow: Number.MAX_VALUE,
+ constrained: false,
+ Node: {
+ type: 'rectangle',
+ overridable: true
+ },
+ Edge: {
+ type: 'none'
+ },
+ Label: {
+ type: 'Native'
+ },
+ duration: 700,
+ fps: 45
+ };
+
+ var opts = Options("Canvas", "Node", "Edge", "Fx", "Tips", "NodeStyles",
+ "Events", "Navigation", "Controller", "Label");
+ this.controller = this.config = $.merge(opts, config, controller);
+ this.layout.orientation = this.config.orientation;
+
+ var canvasConfig = this.config;
+ if (canvasConfig.useCanvas) {
+ this.canvas = canvasConfig.useCanvas;
+ this.config.labelContainer = this.canvas.id + '-label';
+ } else {
+ this.canvas = new Canvas(this, canvasConfig);
+ this.config.labelContainer = (typeof canvasConfig.injectInto == 'string'? canvasConfig.injectInto : canvasConfig.injectInto.id) + '-label';
+ }
+
+ this.graphOptions = {
+ 'complex': true,
+ 'Node': {
+ 'selected': false,
+ 'exist': true,
+ 'drawn': true
+ }
+ };
+
+ this.graph = new Graph(
+ this.graphOptions, this.config.Node, this.config.Edge, this.config.Label);
+
+ this.labels = new $jit.Icicle.Label[this.config.Label.type](this);
+ this.fx = new $jit.Icicle.Plot(this, $jit.Icicle);
+ this.op = new $jit.Icicle.Op(this);
+ this.group = new $jit.Icicle.Group(this);
+ this.clickedNode = null;
+
+ this.initializeExtras();
+ },
+
+ /*
+ Method: refresh
+
+ Computes positions and plots the tree.
+ */
+ refresh: function(){
+ var labelType = this.config.Label.type;
+ if(labelType != 'Native') {
+ var that = this;
+ this.graph.eachNode(function(n) { that.labels.hideLabel(n, false); });
+ }
+ this.compute();
+ this.plot();
+ },
+
+ /*
+ Method: plot
+
+ Plots the Icicle visualization. This is a shortcut to *fx.plot*.
+
+ */
+ plot: function(){
+ this.fx.plot(this.config);
+ },
+
+ /*
+ Method: enter
+
+ Sets the node as root.
+
+ Parameters:
+
+ node - (object) A <Graph.Node>.
+
+ */
+ enter: function (node) {
+ if (this.busy)
+ return;
+ this.busy = true;
+
+ var that = this,
+ config = this.config;
+
+ var callback = {
+ onComplete: function() {
+ //compute positions of newly inserted nodes
+ if(config.request)
+ that.compute();
+
+ if(config.animate) {
+ that.graph.nodeList.setDataset(['current', 'end'], {
+ 'alpha': [1, 0] //fade nodes
+ });
+
+ Graph.Util.eachSubgraph(node, function(n) {
+ n.setData('alpha', 1, 'end');
+ }, "ignore");
+
+ that.fx.animate({
+ duration: 500,
+ modes:['node-property:alpha'],
+ onComplete: function() {
+ that.clickedNode = node;
+ that.compute('end');
+
+ that.fx.animate({
+ modes:['linear', 'node-property:width:height'],
+ duration: 1000,
+ onComplete: function() {
+ that.busy = false;
+ that.clickedNode = node;
+ }
+ });
+ }
+ });
+ } else {
+ that.clickedNode = node;
+ that.busy = false;
+ that.refresh();
+ }
+ }
+ };
+
+ if(config.request) {
+ this.requestNodes(clickedNode, callback);
+ } else {
+ callback.onComplete();
+ }
+ },
+
+ /*
+ Method: out
+
+ Sets the parent node of the current selected node as root.
+
+ */
+ out: function(){
+ if(this.busy)
+ return;
+
+ var that = this,
+ GUtil = Graph.Util,
+ config = this.config,
+ graph = this.graph,
+ parents = GUtil.getParents(graph.getNode(this.clickedNode && this.clickedNode.id || this.root)),
+ parent = parents[0],
+ clickedNode = parent,
+ previousClickedNode = this.clickedNode;
+
+ this.busy = true;
+ this.events.hoveredNode = false;
+
+ if(!parent) {
+ this.busy = false;
+ return;
+ }
+
+ //final plot callback
+ callback = {
+ onComplete: function() {
+ that.clickedNode = parent;
+ if(config.request) {
+ that.requestNodes(parent, {
+ onComplete: function() {
+ that.compute();
+ that.plot();
+ that.busy = false;
+ }
+ });
+ } else {
+ that.compute();
+ that.plot();
+ that.busy = false;
+ }
+ }
+ };
+
+ //animate node positions
+ if(config.animate) {
+ this.clickedNode = clickedNode;
+ this.compute('end');
+ //animate the visible subtree only
+ this.clickedNode = previousClickedNode;
+ this.fx.animate({
+ modes:['linear', 'node-property:width:height'],
+ duration: 1000,
+ onComplete: function() {
+ //animate the parent subtree
+ that.clickedNode = clickedNode;
+ //change nodes alpha
+ graph.nodeList.setDataset(['current', 'end'], {
+ 'alpha': [0, 1]
+ });
+ GUtil.eachSubgraph(previousClickedNode, function(node) {
+ node.setData('alpha', 1);
+ }, "ignore");
+ that.fx.animate({
+ duration: 500,
+ modes:['node-property:alpha'],
+ onComplete: function() {
+ callback.onComplete();
+ }
+ });
+ }
+ });
+ } else {
+ callback.onComplete();
+ }
+ },
+ requestNodes: function(node, onComplete){
+ var handler = $.merge(this.controller, onComplete),
+ levelsToShow = this.config.constrained ? this.config.levelsToShow : Number.MAX_VALUE;
+
+ if (handler.request) {
+ var leaves = [], d = node._depth;
+ Graph.Util.eachLevel(node, 0, levelsToShow, function(n){
+ if (n.drawn && !Graph.Util.anySubnode(n)) {
+ leaves.push(n);
+ n._level = n._depth - d;
+ if (this.config.constrained)
+ n._level = levelsToShow - n._level;
+
+ }
+ });
+ this.group.requestNodes(leaves, handler);
+ } else {
+ handler.onComplete();
+ }
+ }
+});
+
+/*
+ Class: Icicle.Op
+
+ Custom extension of <Graph.Op>.
+
+ Extends:
+
+ All <Graph.Op> methods
+
+ See also:
+
+ <Graph.Op>
+
+ */
+$jit.Icicle.Op = new Class({
+
+ Implements: Graph.Op
+
+});
+
+/*
+ * Performs operations on group of nodes.
+ */
+$jit.Icicle.Group = new Class({
+
+ initialize: function(viz){
+ this.viz = viz;
+ this.canvas = viz.canvas;
+ this.config = viz.config;
+ },
+
+ /*
+ * Calls the request method on the controller to request a subtree for each node.
+ */
+ requestNodes: function(nodes, controller){
+ var counter = 0, len = nodes.length, nodeSelected = {};
+ var complete = function(){
+ controller.onComplete();
+ };
+ var viz = this.viz;
+ if (len == 0)
+ complete();
+ for(var i = 0; i < len; i++) {
+ nodeSelected[nodes[i].id] = nodes[i];
+ controller.request(nodes[i].id, nodes[i]._level, {
+ onComplete: function(nodeId, data){
+ if (data && data.children) {
+ data.id = nodeId;
+ viz.op.sum(data, {
+ type: 'nothing'
+ });
+ }
+ if (++counter == len) {
+ Graph.Util.computeLevels(viz.graph, viz.root, 0);
+ complete();
+ }
+ }
+ });
+ }
+ }
+});
+
+/*
+ Class: Icicle.Plot
+
+ Custom extension of <Graph.Plot>.
+
+ Extends:
+
+ All <Graph.Plot> methods
+
+ See also:
+
+ <Graph.Plot>
+
+ */
+$jit.Icicle.Plot = new Class({
+ Implements: Graph.Plot,
+
+ plot: function(opt, animating){
+ opt = opt || this.viz.controller;
+ var viz = this.viz,
+ graph = viz.graph,
+ root = graph.getNode(viz.clickedNode && viz.clickedNode.id || viz.root),
+ initialDepth = root._depth;
+
+ viz.canvas.clear();
+ this.plotTree(root, $.merge(opt, {
+ 'withLabels': true,
+ 'hideLabels': false,
+ 'plotSubtree': function(root, node) {
+ return !viz.config.constrained ||
+ (node._depth - initialDepth < viz.config.levelsToShow);
+ }
+ }), animating);
+ }
+});
+
+/*
+ Class: Icicle.Label
+
+ Custom extension of <Graph.Label>.
+ Contains custom <Graph.Label.SVG>, <Graph.Label.HTML> and <Graph.Label.Native> extensions.
+
+ Extends:
+
+ All <Graph.Label> methods and subclasses.
+
+ See also:
+
+ <Graph.Label>, <Graph.Label.Native>, <Graph.Label.HTML>, <Graph.Label.SVG>.
+
+ */
+$jit.Icicle.Label = {};
+
+/*
+ Icicle.Label.Native
+
+ Custom extension of <Graph.Label.Native>.
+
+ Extends:
+
+ All <Graph.Label.Native> methods
+
+ See also:
+
+ <Graph.Label.Native>
+
+ */
+$jit.Icicle.Label.Native = new Class({
+ Implements: Graph.Label.Native,
+
+ renderLabel: function(canvas, node, controller) {
+ var ctx = canvas.getCtx(),
+ width = node.getData('width'),
+ height = node.getData('height'),
+ size = node.getLabelData('size'),
+ m = ctx.measureText(node.name);
+
+ // Guess as much as possible if the label will fit in the node
+ if(height < (size * 1.5) || width < m.width)
+ return;
+
+ var pos = node.pos.getc(true);
+ ctx.fillText(node.name,
+ pos.x + width / 2,
+ pos.y + height / 2);
+ }
+});
+
+/*
+ Icicle.Label.SVG
+
+ Custom extension of <Graph.Label.SVG>.
+
+ Extends:
+
+ All <Graph.Label.SVG> methods
+
+ See also:
+
+ <Graph.Label.SVG>
+*/
+$jit.Icicle.Label.SVG = new Class( {
+ Implements: Graph.Label.SVG,
+
+ initialize: function(viz){
+ this.viz = viz;
+ },
+
+ /*
+ placeLabel
+
+ Overrides abstract method placeLabel in <Graph.Plot>.
+
+ Parameters:
+
+ tag - A DOM label element.
+ node - A <Graph.Node>.
+ controller - A configuration/controller object passed to the visualization.
+ */
+ placeLabel: function(tag, node, controller){
+ var pos = node.pos.getc(true), canvas = this.viz.canvas;
+ var radius = canvas.getSize();
+ var labelPos = {
+ x: Math.round(pos.x + radius.width / 2),
+ y: Math.round(pos.y + radius.height / 2)
+ };
+ tag.setAttribute('x', labelPos.x);
+ tag.setAttribute('y', labelPos.y);
+
+ controller.onPlaceLabel(tag, node);
+ }
+});
+
+/*
+ Icicle.Label.HTML
+
+ Custom extension of <Graph.Label.HTML>.
+
+ Extends:
+
+ All <Graph.Label.HTML> methods.
+
+ See also:
+
+ <Graph.Label.HTML>
+
+ */
+$jit.Icicle.Label.HTML = new Class( {
+ Implements: Graph.Label.HTML,
+
+ initialize: function(viz){
+ this.viz = viz;
+ },
+
+ /*
+ placeLabel
+
+ Overrides abstract method placeLabel in <Graph.Plot>.
+
+ Parameters:
+
+ tag - A DOM label element.
+ node - A <Graph.Node>.
+ controller - A configuration/controller object passed to the visualization.
+ */
+ placeLabel: function(tag, node, controller){
+ var pos = node.pos.getc(true), canvas = this.viz.canvas;
+ var radius = canvas.getSize();
+ var labelPos = {
+ x: Math.round(pos.x + radius.width / 2),
+ y: Math.round(pos.y + radius.height / 2)
+ };
+
+ var style = tag.style;
+ style.left = labelPos.x + 'px';
+ style.top = labelPos.y + 'px';
+ style.display = '';
+
+ controller.onPlaceLabel(tag, node);
+ }
+});
+
+/*
+ Class: Icicle.Plot.NodeTypes
+
+ This class contains a list of <Graph.Node> built-in types.
+ Node types implemented are 'none', 'rectangle'.
+
+ You can add your custom node types, customizing your visualization to the extreme.
+
+ Example:
+
+ (start code js)
+ Icicle.Plot.NodeTypes.implement({
+ 'mySpecialType': {
+ 'render': function(node, canvas) {
+ //print your custom node to canvas
+ },
+ //optional
+ 'contains': function(node, pos) {
+ //return true if pos is inside the node or false otherwise
+ }
+ }
+ });
+ (end code)
+
+ */
+$jit.Icicle.Plot.NodeTypes = new Class( {
+ 'none': {
+ 'render': $.empty
+ },
+
+ 'rectangle': {
+ 'render': function(node, canvas, animating) {
+ var config = this.viz.config;
+ var offset = config.offset;
+ var width = node.getData('width');
+ var height = node.getData('height');
+ var border = node.getData('border');
+ var pos = node.pos.getc(true);
+ var posx = pos.x + offset / 2, posy = pos.y + offset / 2;
+ var ctx = canvas.getCtx();
+
+ if(width - offset < 2 || height - offset < 2) return;
+
+ if(config.cushion) {
+ var color = node.getData('color');
+ var lg = ctx.createRadialGradient(posx + (width - offset)/2,
+ posy + (height - offset)/2, 1,
+ posx + (width-offset)/2, posy + (height-offset)/2,
+ width < height? height : width);
+ var colorGrad = $.rgbToHex($.map($.hexToRgb(color),
+ function(r) { return r * 0.3 >> 0; }));
+ lg.addColorStop(0, color);
+ lg.addColorStop(1, colorGrad);
+ ctx.fillStyle = lg;
+ }
+
+ if (border) {
+ ctx.strokeStyle = border;
+ ctx.lineWidth = 3;
+ }
+
+ ctx.fillRect(posx, posy, Math.max(0, width - offset), Math.max(0, height - offset));
+ border && ctx.strokeRect(pos.x, pos.y, width, height);
+ },
+
+ 'contains': function(node, pos) {
+ if(this.viz.clickedNode && !$jit.Graph.Util.isDescendantOf(node, this.viz.clickedNode.id)) return false;
+ var npos = node.pos.getc(true),
+ width = node.getData('width'),
+ height = node.getData('height');
+ return this.nodeHelper.rectangle.contains({x: npos.x + width/2, y: npos.y + height/2}, pos, width, height);
+ }
+ }
+});
+
+$jit.Icicle.Plot.EdgeTypes = new Class( {
+ 'none': $.empty
+});
+
+
+
+/*
+ * File: Layouts.ForceDirected.js
+ *
+*/
+
+/*
+ * Class: Layouts.ForceDirected
+ *
+ * Implements a Force Directed Layout.
+ *
+ * Implemented By:
+ *
+ * <ForceDirected>
+ *
+ * Credits:
+ *
+ * Marcus Cobden <http://marcuscobden.co.uk>
+ *
+ */
+Layouts.ForceDirected = new Class({
+
+ getOptions: function(random) {
+ var s = this.canvas.getSize();
+ var w = s.width, h = s.height;
+ //count nodes
+ var count = 0;
+ this.graph.eachNode(function(n) {
+ count++;
+ });
+ var k2 = w * h / count, k = Math.sqrt(k2);
+ var l = this.config.levelDistance;
+
+ return {
+ width: w,
+ height: h,
+ tstart: w * 0.1,
+ nodef: function(x) { return k2 / (x || 1); },
+ edgef: function(x) { return /* x * x / k; */ k * (x - l); }
+ };
+ },
+
+ compute: function(property, incremental) {
+ var prop = $.splat(property || ['current', 'start', 'end']);
+ var opt = this.getOptions();
+ NodeDim.compute(this.graph, prop, this.config);
+ this.graph.computeLevels(this.root, 0, "ignore");
+ this.graph.eachNode(function(n) {
+ $.each(prop, function(p) {
+ var pos = n.getPos(p);
+ if(pos.equals(Complex.KER)) {
+ pos.x = opt.width/5 * (Math.random() - 0.5);
+ pos.y = opt.height/5 * (Math.random() - 0.5);
+ }
+ //initialize disp vector
+ n.disp = {};
+ $.each(prop, function(p) {
+ n.disp[p] = $C(0, 0);
+ });
+ });
+ });
+ this.computePositions(prop, opt, incremental);
+ },
+
+ computePositions: function(property, opt, incremental) {
+ var times = this.config.iterations, i = 0, that = this;
+ if(incremental) {
+ (function iter() {
+ for(var total=incremental.iter, j=0; j<total; j++) {
+ opt.t = opt.tstart * (1 - i++/(times -1));
+ that.computePositionStep(property, opt);
+ if(i >= times) {
+ incremental.onComplete();
+ return;
+ }
+ }
+ incremental.onStep(Math.round(i / (times -1) * 100));
+ setTimeout(iter, 1);
+ })();
+ } else {
+ for(; i < times; i++) {
+ opt.t = opt.tstart * (1 - i/(times -1));
+ this.computePositionStep(property, opt);
+ }
+ }
+ },
+
+ computePositionStep: function(property, opt) {
+ var graph = this.graph;
+ var min = Math.min, max = Math.max;
+ var dpos = $C(0, 0);
+ //calculate repulsive forces
+ graph.eachNode(function(v) {
+ //initialize disp
+ $.each(property, function(p) {
+ v.disp[p].x = 0; v.disp[p].y = 0;
+ });
+ graph.eachNode(function(u) {
+ if(u.id != v.id) {
+ $.each(property, function(p) {
+ var vp = v.getPos(p), up = u.getPos(p);
+ dpos.x = vp.x - up.x;
+ dpos.y = vp.y - up.y;
+ var norm = dpos.norm() || 1;
+ v.disp[p].$add(dpos
+ .$scale(opt.nodef(norm) / norm));
+ });
+ }
+ });
+ });
+ //calculate attractive forces
+ var T = !!graph.getNode(this.root).visited;
+ graph.eachNode(function(node) {
+ node.eachAdjacency(function(adj) {
+ var nodeTo = adj.nodeTo;
+ if(!!nodeTo.visited === T) {
+ $.each(property, function(p) {
+ var vp = node.getPos(p), up = nodeTo.getPos(p);
+ dpos.x = vp.x - up.x;
+ dpos.y = vp.y - up.y;
+ var norm = dpos.norm() || 1;
+ node.disp[p].$add(dpos.$scale(-opt.edgef(norm) / norm));
+ nodeTo.disp[p].$add(dpos.$scale(-1));
+ });
+ }
+ });
+ node.visited = !T;
+ });
+ //arrange positions to fit the canvas
+ var t = opt.t, w2 = opt.width / 2, h2 = opt.height / 2;
+ graph.eachNode(function(u) {
+ $.each(property, function(p) {
+ var disp = u.disp[p];
+ var norm = disp.norm() || 1;
+ var p = u.getPos(p);
+ p.$add($C(disp.x * min(Math.abs(disp.x), t) / norm,
+ disp.y * min(Math.abs(disp.y), t) / norm));
+ p.x = min(w2, max(-w2, p.x));
+ p.y = min(h2, max(-h2, p.y));
+ });
+ });
+ }
+});
+
+/*
+ * File: ForceDirected.js
+ */
+
+/*
+ Class: ForceDirected
+
+ A visualization that lays graphs using a Force-Directed layout algorithm.
+
+ Inspired by:
+
+ Force-Directed Drawing Algorithms (Stephen G. Kobourov) <http://www.cs.brown.edu/~rt/gdhandbook/chapters/force-directed.pdf>
+
+ Implements:
+
+ All <Loader> methods
+
+ Constructor Options:
+
+ Inherits options from
+
+ - <Options.Canvas>
+ - <Options.Controller>
+ - <Options.Node>
+ - <Options.Edge>
+ - <Options.Label>
+ - <Options.Events>
+ - <Options.Tips>
+ - <Options.NodeStyles>
+ - <Options.Navigation>
+
+ Additionally, there are two parameters
+
+ levelDistance - (number) Default's *50*. The natural length desired for the edges.
+ iterations - (number) Default's *50*. The number of iterations for the spring layout simulation. Depending on the browser's speed you could set this to a more 'interesting' number, like *200*.
+
+ Instance Properties:
+
+ canvas - Access a <Canvas> instance.
+ graph - Access a <Graph> instance.
+ op - Access a <ForceDirected.Op> instance.
+ fx - Access a <ForceDirected.Plot> instance.
+ labels - Access a <ForceDirected.Label> interface implementation.
+
+*/
+
+$jit.ForceDirected = new Class( {
+
+ Implements: [ Loader, Extras, Layouts.ForceDirected ],
+
+ initialize: function(controller) {
+ var $ForceDirected = $jit.ForceDirected;
+
+ var config = {
+ iterations: 50,
+ levelDistance: 50
+ };
+
+ this.controller = this.config = $.merge(Options("Canvas", "Node", "Edge",
+ "Fx", "Tips", "NodeStyles", "Events", "Navigation", "Controller", "Label"), config, controller);
+
+ var canvasConfig = this.config;
+ if(canvasConfig.useCanvas) {
+ this.canvas = canvasConfig.useCanvas;
+ this.config.labelContainer = this.canvas.id + '-label';
+ } else {
+ if(canvasConfig.background) {
+ canvasConfig.background = $.merge({
+ type: 'Circles'
+ }, canvasConfig.background);
+ }
+ this.canvas = new Canvas(this, canvasConfig);
+ this.config.labelContainer = (typeof canvasConfig.injectInto == 'string'? canvasConfig.injectInto : canvasConfig.injectInto.id) + '-label';
+ }
+
+ this.graphOptions = {
+ 'complex': true,
+ 'Node': {
+ 'selected': false,
+ 'exist': true,
+ 'drawn': true
+ }
+ };
+ this.graph = new Graph(this.graphOptions, this.config.Node,
+ this.config.Edge);
+ this.labels = new $ForceDirected.Label[canvasConfig.Label.type](this);
+ this.fx = new $ForceDirected.Plot(this, $ForceDirected);
+ this.op = new $ForceDirected.Op(this);
+ this.json = null;
+ this.busy = false;
+ // initialize extras
+ this.initializeExtras();
+ },
+
+ /*
+ Method: refresh
+
+ Computes positions and plots the tree.
+ */
+ refresh: function() {
+ this.compute();
+ this.plot();
+ },
+
+ reposition: function() {
+ this.compute('end');
+ },
+
+/*
+ Method: computeIncremental
+
+ Performs the Force Directed algorithm incrementally.
+
+ Description:
+
+ ForceDirected algorithms can perform many computations and lead to JavaScript taking too much time to complete.
+ This method splits the algorithm into smaller parts allowing the user to track the evolution of the algorithm and
+ avoiding browser messages such as "This script is taking too long to complete".
+
+ Parameters:
+
+ opt - (object) The object properties are described below
+
+ iter - (number) Default's *20*. Split the algorithm into pieces of _iter_ iterations. For example, if the _iterations_ configuration property
+ of your <ForceDirected> class is 100, then you could set _iter_ to 20 to split the main algorithm into 5 smaller pieces.
+
+ property - (string) Default's *end*. Whether to update starting, current or ending node positions. Possible values are 'end', 'start', 'current'.
+ You can also set an array of these properties. If you'd like to keep the current node positions but to perform these
+ computations for final animation positions then you can just choose 'end'.
+
+ onStep - (function) A callback function called when each "small part" of the algorithm completed. This function gets as first formal
+ parameter a percentage value.
+
+ onComplete - A callback function called when the algorithm completed.
+
+ Example:
+
+ In this example I calculate the end positions and then animate the graph to those positions
+
+ (start code js)
+ var fd = new $jit.ForceDirected(...);
+ fd.computeIncremental({
+ iter: 20,
+ property: 'end',
+ onStep: function(perc) {
+ Log.write("loading " + perc + "%");
+ },
+ onComplete: function() {
+ Log.write("done");
+ fd.animate();
+ }
+ });
+ (end code)
+
+ In this example I calculate all positions and (re)plot the graph
+
+ (start code js)
+ var fd = new ForceDirected(...);
+ fd.computeIncremental({
+ iter: 20,
+ property: ['end', 'start', 'current'],
+ onStep: function(perc) {
+ Log.write("loading " + perc + "%");
+ },
+ onComplete: function() {
+ Log.write("done");
+ fd.plot();
+ }
+ });
+ (end code)
+
+ */
+ computeIncremental: function(opt) {
+ opt = $.merge( {
+ iter: 20,
+ property: 'end',
+ onStep: $.empty,
+ onComplete: $.empty
+ }, opt || {});
+
+ this.config.onBeforeCompute(this.graph.getNode(this.root));
+ this.compute(opt.property, opt);
+ },
+
+ /*
+ Method: plot
+
+ Plots the ForceDirected graph. This is a shortcut to *fx.plot*.
+ */
+ plot: function() {
+ this.fx.plot();
+ },
+
+ /*
+ Method: animate
+
+ Animates the graph from the current positions to the 'end' node positions.
+ */
+ animate: function(opt) {
+ this.fx.animate($.merge( {
+ modes: [ 'linear' ]
+ }, opt || {}));
+ }
+});
+
+$jit.ForceDirected.$extend = true;
+
+(function(ForceDirected) {
+
+ /*
+ Class: ForceDirected.Op
+
+ Custom extension of <Graph.Op>.
+
+ Extends:
+
+ All <Graph.Op> methods
+
+ See also:
+
+ <Graph.Op>
+
+ */
+ ForceDirected.Op = new Class( {
+
+ Implements: Graph.Op
+
+ });
+
+ /*
+ Class: ForceDirected.Plot
+
+ Custom extension of <Graph.Plot>.
+
+ Extends:
+
+ All <Graph.Plot> methods
+
+ See also:
+
+ <Graph.Plot>
+
+ */
+ ForceDirected.Plot = new Class( {
+
+ Implements: Graph.Plot
+
+ });
+
+ /*
+ Class: ForceDirected.Label
+
+ Custom extension of <Graph.Label>.
+ Contains custom <Graph.Label.SVG>, <Graph.Label.HTML> and <Graph.Label.Native> extensions.
+
+ Extends:
+
+ All <Graph.Label> methods and subclasses.
+
+ See also:
+
+ <Graph.Label>, <Graph.Label.Native>, <Graph.Label.HTML>, <Graph.Label.SVG>.
+
+ */
+ ForceDirected.Label = {};
+
+ /*
+ ForceDirected.Label.Native
+
+ Custom extension of <Graph.Label.Native>.
+
+ Extends:
+
+ All <Graph.Label.Native> methods
+
+ See also:
+
+ <Graph.Label.Native>
+
+ */
+ ForceDirected.Label.Native = new Class( {
+ Implements: Graph.Label.Native
+ });
+
+ /*
+ ForceDirected.Label.SVG
+
+ Custom extension of <Graph.Label.SVG>.
+
+ Extends:
+
+ All <Graph.Label.SVG> methods
+
+ See also:
+
+ <Graph.Label.SVG>
+
+ */
+ ForceDirected.Label.SVG = new Class( {
+ Implements: Graph.Label.SVG,
+
+ initialize: function(viz) {
+ this.viz = viz;
+ },
+
+ /*
+ placeLabel
+
+ Overrides abstract method placeLabel in <Graph.Label>.
+
+ Parameters:
+
+ tag - A DOM label element.
+ node - A <Graph.Node>.
+ controller - A configuration/controller object passed to the visualization.
+
+ */
+ placeLabel: function(tag, node, controller) {
+ var pos = node.pos.getc(true),
+ canvas = this.viz.canvas,
+ ox = canvas.translateOffsetX,
+ oy = canvas.translateOffsetY,
+ sx = canvas.scaleOffsetX,
+ sy = canvas.scaleOffsetY,
+ radius = canvas.getSize();
+ var labelPos = {
+ x: Math.round(pos.x * sx + ox + radius.width / 2),
+ y: Math.round(pos.y * sy + oy + radius.height / 2)
+ };
+ tag.setAttribute('x', labelPos.x);
+ tag.setAttribute('y', labelPos.y);
+
+ controller.onPlaceLabel(tag, node);
+ }
+ });
+
+ /*
+ ForceDirected.Label.HTML
+
+ Custom extension of <Graph.Label.HTML>.
+
+ Extends:
+
+ All <Graph.Label.HTML> methods.
+
+ See also:
+
+ <Graph.Label.HTML>
+
+ */
+ ForceDirected.Label.HTML = new Class( {
+ Implements: Graph.Label.HTML,
+
+ initialize: function(viz) {
+ this.viz = viz;
+ },
+ /*
+ placeLabel
+
+ Overrides abstract method placeLabel in <Graph.Plot>.
+
+ Parameters:
+
+ tag - A DOM label element.
+ node - A <Graph.Node>.
+ controller - A configuration/controller object passed to the visualization.
+
+ */
+ placeLabel: function(tag, node, controller) {
+ var pos = node.pos.getc(true),
+ canvas = this.viz.canvas,
+ ox = canvas.translateOffsetX,
+ oy = canvas.translateOffsetY,
+ sx = canvas.scaleOffsetX,
+ sy = canvas.scaleOffsetY,
+ radius = canvas.getSize();
+ var labelPos = {
+ x: Math.round(pos.x * sx + ox + radius.width / 2),
+ y: Math.round(pos.y * sy + oy + radius.height / 2)
+ };
+ var style = tag.style;
+ style.left = labelPos.x + 'px';
+ style.top = labelPos.y + 'px';
+ style.display = this.fitsInCanvas(labelPos, canvas) ? '' : 'none';
+
+ controller.onPlaceLabel(tag, node);
+ }
+ });
+
+ /*
+ Class: ForceDirected.Plot.NodeTypes
+
+ This class contains a list of <Graph.Node> built-in types.
+ Node types implemented are 'none', 'circle', 'triangle', 'rectangle', 'star', 'ellipse' and 'square'.
+
+ You can add your custom node types, customizing your visualization to the extreme.
+
+ Example:
+
+ (start code js)
+ ForceDirected.Plot.NodeTypes.implement({
+ 'mySpecialType': {
+ 'render': function(node, canvas) {
+ //print your custom node to canvas
+ },
+ //optional
+ 'contains': function(node, pos) {
+ //return true if pos is inside the node or false otherwise
+ }
+ }
+ });
+ (end code)
+
+ */
+ ForceDirected.Plot.NodeTypes = new Class({
+ 'none': {
+ 'render': $.empty,
+ 'contains': $.lambda(false)
+ },
+ 'circle': {
+ 'render': function(node, canvas){
+ var pos = node.pos.getc(true),
+ dim = node.getData('dim');
+ this.nodeHelper.circle.render('fill', pos, dim, canvas);
+ },
+ 'contains': function(node, pos){
+ var npos = node.pos.getc(true),
+ dim = node.getData('dim');
+ return this.nodeHelper.circle.contains(npos, pos, dim);
+ }
+ },
+ 'ellipse': {
+ 'render': function(node, canvas){
+ var pos = node.pos.getc(true),
+ width = node.getData('width'),
+ height = node.getData('height');
+ this.nodeHelper.ellipse.render('fill', pos, width, height, canvas);
+ },
+ // TODO(nico): be more precise...
+ 'contains': function(node, pos){
+ var npos = node.pos.getc(true),
+ width = node.getData('width'),
+ height = node.getData('height');
+ return this.nodeHelper.ellipse.contains(npos, pos, width, height);
+ }
+ },
+ 'square': {
+ 'render': function(node, canvas){
+ var pos = node.pos.getc(true),
+ dim = node.getData('dim');
+ this.nodeHelper.square.render('fill', pos, dim, canvas);
+ },
+ 'contains': function(node, pos){
+ var npos = node.pos.getc(true),
+ dim = node.getData('dim');
+ return this.nodeHelper.square.contains(npos, pos, dim);
+ }
+ },
+ 'rectangle': {
+ 'render': function(node, canvas){
+ var pos = node.pos.getc(true),
+ width = node.getData('width'),
+ height = node.getData('height');
+ this.nodeHelper.rectangle.render('fill', pos, width, height, canvas);
+ },
+ 'contains': function(node, pos){
+ var npos = node.pos.getc(true),
+ width = node.getData('width'),
+ height = node.getData('height');
+ return this.nodeHelper.rectangle.contains(npos, pos, width, height);
+ }
+ },
+ 'triangle': {
+ 'render': function(node, canvas){
+ var pos = node.pos.getc(true),
+ dim = node.getData('dim');
+ this.nodeHelper.triangle.render('fill', pos, dim, canvas);
+ },
+ 'contains': function(node, pos) {
+ var npos = node.pos.getc(true),
+ dim = node.getData('dim');
+ return this.nodeHelper.triangle.contains(npos, pos, dim);
+ }
+ },
+ 'star': {
+ 'render': function(node, canvas){
+ var pos = node.pos.getc(true),
+ dim = node.getData('dim');
+ this.nodeHelper.star.render('fill', pos, dim, canvas);
+ },
+ 'contains': function(node, pos) {
+ var npos = node.pos.getc(true),
+ dim = node.getData('dim');
+ return this.nodeHelper.star.contains(npos, pos, dim);
+ }
+ }
+ });
+
+ /*
+ Class: ForceDirected.Plot.EdgeTypes
+
+ This class contains a list of <Graph.Adjacence> built-in types.
+ Edge types implemented are 'none', 'line' and 'arrow'.
+
+ You can add your custom edge types, customizing your visualization to the extreme.
+
+ Example:
+
+ (start code js)
+ ForceDirected.Plot.EdgeTypes.implement({
+ 'mySpecialType': {
+ 'render': function(adj, canvas) {
+ //print your custom edge to canvas
+ },
+ //optional
+ 'contains': function(adj, pos) {
+ //return true if pos is inside the arc or false otherwise
+ }
+ }
+ });
+ (end code)
+
+ */
+ ForceDirected.Plot.EdgeTypes = new Class({
+ 'none': $.empty,
+ 'line': {
+ 'render': function(adj, canvas) {
+ var from = adj.nodeFrom.pos.getc(true),
+ to = adj.nodeTo.pos.getc(true);
+ this.edgeHelper.line.render(from, to, canvas);
+ },
+ 'contains': function(adj, pos) {
+ var from = adj.nodeFrom.pos.getc(true),
+ to = adj.nodeTo.pos.getc(true);
+ return this.edgeHelper.line.contains(from, to, pos, this.edge.epsilon);
+ }
+ },
+ 'arrow': {
+ 'render': function(adj, canvas) {
+ var from = adj.nodeFrom.pos.getc(true),
+ to = adj.nodeTo.pos.getc(true),
+ dim = adj.getData('dim'),
+ direction = adj.data.$direction,
+ inv = (direction && direction.length>1 && direction[0] != adj.nodeFrom.id);
+ this.edgeHelper.arrow.render(from, to, dim, inv, canvas);
+ },
+ 'contains': function(adj, pos) {
+ var from = adj.nodeFrom.pos.getc(true),
+ to = adj.nodeTo.pos.getc(true);
+ return this.edgeHelper.arrow.contains(from, to, pos, this.edge.epsilon);
+ }
+ }
+ });
+
+})($jit.ForceDirected);
+
+
+/*
+ * File: Treemap.js
+ *
+*/
+
+$jit.TM = {};
+
+var TM = $jit.TM;
+
+$jit.TM.$extend = true;
+
+/*
+ Class: TM.Base
+
+ Abstract class providing base functionality for <TM.Squarified>, <TM.Strip> and <TM.SliceAndDice> visualizations.
+
+ Implements:
+
+ All <Loader> methods
+
+ Constructor Options:
+
+ Inherits options from
+
+ - <Options.Canvas>
+ - <Options.Controller>
+ - <Options.Node>
+ - <Options.Edge>
+ - <Options.Label>
+ - <Options.Events>
+ - <Options.Tips>
+ - <Options.NodeStyles>
+ - <Options.Navigation>
+
+ Additionally, there are other parameters and some default values changed
+
+ orientation - (string) Default's *h*. Whether to set horizontal or vertical layouts. Possible values are 'h' and 'v'.
+ titleHeight - (number) Default's *13*. The height of the title rectangle for inner (non-leaf) nodes.
+ offset - (number) Default's *2*. Boxes offset.
+ constrained - (boolean) Default's *false*. Whether to show the entire tree when loaded or just the number of levels specified by _levelsToShow_.
+ levelsToShow - (number) Default's *3*. The number of levels to show for a subtree. This number is relative to the selected node.
+ animate - (boolean) Default's *false*. Whether to animate transitions.
+ Node.type - Described in <Options.Node>. Default's *rectangle*.
+ duration - Described in <Options.Fx>. Default's *700*.
+ fps - Described in <Options.Fx>. Default's *45*.
+
+ Instance Properties:
+
+ canvas - Access a <Canvas> instance.
+ graph - Access a <Graph> instance.
+ op - Access a <TM.Op> instance.
+ fx - Access a <TM.Plot> instance.
+ labels - Access a <TM.Label> interface implementation.
+
+ Inspired by:
+
+ Squarified Treemaps (Mark Bruls, Kees Huizing, and Jarke J. van Wijk) <http://www.win.tue.nl/~vanwijk/stm.pdf>
+
+ Tree visualization with tree-maps: 2-d space-filling approach (Ben Shneiderman) <http://hcil.cs.umd.edu/trs/91-03/91-03.html>
+
+ Note:
+
+ This visualization was built and engineered from scratch, taking only the paper as inspiration, and only shares some features with the visualization described in the paper.
+
+*/
+TM.Base = {
+ layout: {
+ orientation: "h",
+ vertical: function(){
+ return this.orientation == "v";
+ },
+ horizontal: function(){
+ return this.orientation == "h";
+ },
+ change: function(){
+ this.orientation = this.vertical()? "h" : "v";
+ }
+ },
+
+ initialize: function(controller){
+ var config = {
+ orientation: "h",
+ titleHeight: 13,
+ offset: 2,
+ levelsToShow: 0,
+ constrained: false,
+ animate: false,
+ Node: {
+ type: 'rectangle',
+ overridable: true,
+ //we all know why this is not zero,
+ //right, Firefox?
+ width: 3,
+ height: 3,
+ color: '#444'
+ },
+ Label: {
+ textAlign: 'center',
+ textBaseline: 'top'
+ },
+ Edge: {
+ type: 'none'
+ },
+ duration: 700,
+ fps: 45
+ };
+
+ this.controller = this.config = $.merge(Options("Canvas", "Node", "Edge",
+ "Fx", "Controller", "Tips", "NodeStyles", "Events", "Navigation", "Label"), config, controller);
+ this.layout.orientation = this.config.orientation;
+
+ var canvasConfig = this.config;
+ if (canvasConfig.useCanvas) {
+ this.canvas = canvasConfig.useCanvas;
+ this.config.labelContainer = this.canvas.id + '-label';
+ } else {
+ if(canvasConfig.background) {
+ canvasConfig.background = $.merge({
+ type: 'Circles'
+ }, canvasConfig.background);
+ }
+ this.canvas = new Canvas(this, canvasConfig);
+ this.config.labelContainer = (typeof canvasConfig.injectInto == 'string'? canvasConfig.injectInto : canvasConfig.injectInto.id) + '-label';
+ }
+
+ this.graphOptions = {
+ 'complex': true,
+ 'Node': {
+ 'selected': false,
+ 'exist': true,
+ 'drawn': true
+ }
+ };
+ this.graph = new Graph(this.graphOptions, this.config.Node,
+ this.config.Edge);
+ this.labels = new TM.Label[canvasConfig.Label.type](this);
+ this.fx = new TM.Plot(this);
+ this.op = new TM.Op(this);
+ this.group = new TM.Group(this);
+ this.geom = new TM.Geom(this);
+ this.clickedNode = null;
+ this.busy = false;
+ // initialize extras
+ this.initializeExtras();
+ },
+
+ /*
+ Method: refresh
+
+ Computes positions and plots the tree.
+ */
+ refresh: function(){
+ if(this.busy) return;
+ this.busy = true;
+ var that = this;
+ if(this.config.animate) {
+ this.compute('end');
+ this.config.levelsToShow > 0 && this.geom.setRightLevelToShow(this.graph.getNode(this.clickedNode
+ && this.clickedNode.id || this.root));
+ this.fx.animate($.merge(this.config, {
+ modes: ['linear', 'node-property:width:height'],
+ onComplete: function() {
+ that.busy = false;
+ }
+ }));
+ } else {
+ var labelType = this.config.Label.type;
+ if(labelType != 'Native') {
+ var that = this;
+ this.graph.eachNode(function(n) { that.labels.hideLabel(n, false); });
+ }
+ this.busy = false;
+ this.compute();
+ this.config.levelsToShow > 0 && this.geom.setRightLevelToShow(this.graph.getNode(this.clickedNode
+ && this.clickedNode.id || this.root));
+ this.plot();
+ }
+ },
+
+ /*
+ Method: plot
+
+ Plots the TreeMap. This is a shortcut to *fx.plot*.
+
+ */
+ plot: function(){
+ this.fx.plot();
+ },
+
+ /*
+ Method: leaf
+
+ Returns whether the node is a leaf.
+
+ Parameters:
+
+ n - (object) A <Graph.Node>.
+
+ */
+ leaf: function(n){
+ return n.getSubnodes([
+ 1, 1
+ ], "ignore").length == 0;
+ },
+
+ /*
+ Method: enter
+
+ Sets the node as root.
+
+ Parameters:
+
+ n - (object) A <Graph.Node>.
+
+ */
+ enter: function(n){
+ if(this.busy) return;
+ this.busy = true;
+
+ var that = this,
+ config = this.config,
+ graph = this.graph,
+ clickedNode = n,
+ previousClickedNode = this.clickedNode;
+
+ var callback = {
+ onComplete: function() {
+ //ensure that nodes are shown for that level
+ if(config.levelsToShow > 0) {
+ that.geom.setRightLevelToShow(n);
+ }
+ //compute positions of newly inserted nodes
+ if(config.levelsToShow > 0 || config.request) that.compute();
+ if(config.animate) {
+ //fade nodes
+ graph.nodeList.setData('alpha', 0, 'end');
+ n.eachSubgraph(function(n) {
+ n.setData('alpha', 1, 'end');
+ }, "ignore");
+ that.fx.animate({
+ duration: 500,
+ modes:['node-property:alpha'],
+ onComplete: function() {
+ //compute end positions
+ that.clickedNode = clickedNode;
+ that.compute('end');
+ //animate positions
+ //TODO(nico) commenting this line didn't seem to throw errors...
+ that.clickedNode = previousClickedNode;
+ that.fx.animate({
+ modes:['linear', 'node-property:width:height'],
+ duration: 1000,
+ onComplete: function() {
+ that.busy = false;
+ //TODO(nico) check comment above
+ that.clickedNode = clickedNode;
+ }
+ });
+ }
+ });
+ } else {
+ that.busy = false;
+ that.clickedNode = n;
+ that.refresh();
+ }
+ }
+ };
+ if(config.request) {
+ this.requestNodes(clickedNode, callback);
+ } else {
+ callback.onComplete();
+ }
+ },
+
+ /*
+ Method: out
+
+ Sets the parent node of the current selected node as root.
+
+ */
+ out: function(){
+ if(this.busy) return;
+ this.busy = true;
+ this.events.hoveredNode = false;
+ var that = this,
+ config = this.config,
+ graph = this.graph,
+ parents = graph.getNode(this.clickedNode
+ && this.clickedNode.id || this.root).getParents(),
+ parent = parents[0],
+ clickedNode = parent,
+ previousClickedNode = this.clickedNode;
+
+ //if no parents return
+ if(!parent) {
+ this.busy = false;
+ return;
+ }
+ //final plot callback
+ callback = {
+ onComplete: function() {
+ that.clickedNode = parent;
+ if(config.request) {
+ that.requestNodes(parent, {
+ onComplete: function() {
+ that.compute();
+ that.plot();
+ that.busy = false;
+ }
+ });
+ } else {
+ that.compute();
+ that.plot();
+ that.busy = false;
+ }
+ }
+ };
+ //prune tree
+ if (config.levelsToShow > 0)
+ this.geom.setRightLevelToShow(parent);
+ //animate node positions
+ if(config.animate) {
+ this.clickedNode = clickedNode;
+ this.compute('end');
+ //animate the visible subtree only
+ this.clickedNode = previousClickedNode;
+ this.fx.animate({
+ modes:['linear', 'node-property:width:height'],
+ duration: 1000,
+ onComplete: function() {
+ //animate the parent subtree
+ that.clickedNode = clickedNode;
+ //change nodes alpha
+ graph.eachNode(function(n) {
+ n.setDataset(['current', 'end'], {
+ 'alpha': [0, 1]
+ });
+ }, "ignore");
+ previousClickedNode.eachSubgraph(function(node) {
+ node.setData('alpha', 1);
+ }, "ignore");
+ that.fx.animate({
+ duration: 500,
+ modes:['node-property:alpha'],
+ onComplete: function() {
+ callback.onComplete();
+ }
+ });
+ }
+ });
+ } else {
+ callback.onComplete();
+ }
+ },
+
+ requestNodes: function(node, onComplete){
+ var handler = $.merge(this.controller, onComplete),
+ lev = this.config.levelsToShow;
+ if (handler.request) {
+ var leaves = [], d = node._depth;
+ node.eachLevel(0, lev, function(n){
+ var nodeLevel = lev - (n._depth - d);
+ if (n.drawn && !n.anySubnode() && nodeLevel > 0) {
+ leaves.push(n);
+ n._level = nodeLevel;
+ }
+ });
+ this.group.requestNodes(leaves, handler);
+ } else {
+ handler.onComplete();
+ }
+ }
+};
+
+/*
+ Class: TM.Op
+
+ Custom extension of <Graph.Op>.
+
+ Extends:
+
+ All <Graph.Op> methods
+
+ See also:
+
+ <Graph.Op>
+
+ */
+TM.Op = new Class({
+ Implements: Graph.Op,
+
+ initialize: function(viz){
+ this.viz = viz;
+ }
+});
+
+//extend level methods of Graph.Geom
+TM.Geom = new Class({
+ Implements: Graph.Geom,
+
+ getRightLevelToShow: function() {
+ return this.viz.config.levelsToShow;
+ },
+
+ setRightLevelToShow: function(node) {
+ var level = this.getRightLevelToShow(),
+ fx = this.viz.labels;
+ node.eachLevel(0, level+1, function(n) {
+ var d = n._depth - node._depth;
+ if(d > level) {
+ n.drawn = false;
+ n.exist = false;
+ n.ignore = true;
+ fx.hideLabel(n, false);
+ } else {
+ n.drawn = true;
+ n.exist = true;
+ delete n.ignore;
+ }
+ });
+ node.drawn = true;
+ delete node.ignore;
+ }
+});
+
+/*
+
+Performs operations on group of nodes.
+
+*/
+TM.Group = new Class( {
+
+ initialize: function(viz){
+ this.viz = viz;
+ this.canvas = viz.canvas;
+ this.config = viz.config;
+ },
+
+ /*
+
+ Calls the request method on the controller to request a subtree for each node.
+ */
+ requestNodes: function(nodes, controller){
+ var counter = 0, len = nodes.length, nodeSelected = {};
+ var complete = function(){
+ controller.onComplete();
+ };
+ var viz = this.viz;
+ if (len == 0)
+ complete();
+ for ( var i = 0; i < len; i++) {
+ nodeSelected[nodes[i].id] = nodes[i];
+ controller.request(nodes[i].id, nodes[i]._level, {
+ onComplete: function(nodeId, data){
+ if (data && data.children) {
+ data.id = nodeId;
+ viz.op.sum(data, {
+ type: 'nothing'
+ });
+ }
+ if (++counter == len) {
+ viz.graph.computeLevels(viz.root, 0);
+ complete();
+ }
+ }
+ });
+ }
+ }
+});
+
+/*
+ Class: TM.Plot
+
+ Custom extension of <Graph.Plot>.
+
+ Extends:
+
+ All <Graph.Plot> methods
+
+ See also:
+
+ <Graph.Plot>
+
+ */
+TM.Plot = new Class({
+
+ Implements: Graph.Plot,
+
+ initialize: function(viz){
+ this.viz = viz;
+ this.config = viz.config;
+ this.node = this.config.Node;
+ this.edge = this.config.Edge;
+ this.animation = new Animation;
+ this.nodeTypes = new TM.Plot.NodeTypes;
+ this.edgeTypes = new TM.Plot.EdgeTypes;
+ this.labels = viz.labels;
+ },
+
+ plot: function(opt, animating){
+ var viz = this.viz,
+ graph = viz.graph;
+ viz.canvas.clear();
+ this.plotTree(graph.getNode(viz.clickedNode && viz.clickedNode.id || viz.root), $.merge(viz.config, opt || {}, {
+ 'withLabels': true,
+ 'hideLabels': false,
+ 'plotSubtree': function(n, ch){
+ return n.anySubnode("exist");
+ }
+ }), animating);
+ }
+});
+
+/*
+ Class: TM.Label
+
+ Custom extension of <Graph.Label>.
+ Contains custom <Graph.Label.SVG>, <Graph.Label.HTML> and <Graph.Label.Native> extensions.
+
+ Extends:
+
+ All <Graph.Label> methods and subclasses.
+
+ See also:
+
+ <Graph.Label>, <Graph.Label.Native>, <Graph.Label.HTML>, <Graph.Label.SVG>.
+
+*/
+TM.Label = {};
+
+/*
+ TM.Label.Native
+
+ Custom extension of <Graph.Label.Native>.
+
+ Extends:
+
+ All <Graph.Label.Native> methods
+
+ See also:
+
+ <Graph.Label.Native>
+*/
+TM.Label.Native = new Class({
+ Implements: Graph.Label.Native,
+
+ initialize: function(viz) {
+ this.config = viz.config;
+ this.leaf = viz.leaf;
+ },
+
+ renderLabel: function(canvas, node, controller){
+ if(!this.leaf(node) && !this.config.titleHeight) return;
+ var pos = node.pos.getc(true),
+ ctx = canvas.getCtx(),
+ width = node.getData('width'),
+ height = node.getData('height'),
+ x = pos.x + width/2,
+ y = pos.y;
+
+ ctx.fillText(node.name, x, y, width);
+ }
+});
+
+/*
+ TM.Label.SVG
+
+ Custom extension of <Graph.Label.SVG>.
+
+ Extends:
+
+ All <Graph.Label.SVG> methods
+
+ See also:
+
+ <Graph.Label.SVG>
+*/
+TM.Label.SVG = new Class( {
+ Implements: Graph.Label.SVG,
+
+ initialize: function(viz){
+ this.viz = viz;
+ this.leaf = viz.leaf;
+ this.config = viz.config;
+ },
+
+ /*
+ placeLabel
+
+ Overrides abstract method placeLabel in <Graph.Plot>.
+
+ Parameters:
+
+ tag - A DOM label element.
+ node - A <Graph.Node>.
+ controller - A configuration/controller object passed to the visualization.
+
+ */
+ placeLabel: function(tag, node, controller){
+ var pos = node.pos.getc(true),
+ canvas = this.viz.canvas,
+ ox = canvas.translateOffsetX,
+ oy = canvas.translateOffsetY,
+ sx = canvas.scaleOffsetX,
+ sy = canvas.scaleOffsetY,
+ radius = canvas.getSize();
+ var labelPos = {
+ x: Math.round(pos.x * sx + ox + radius.width / 2),
+ y: Math.round(pos.y * sy + oy + radius.height / 2)
+ };
+ tag.setAttribute('x', labelPos.x);
+ tag.setAttribute('y', labelPos.y);
+
+ if(!this.leaf(node) && !this.config.titleHeight) {
+ tag.style.display = 'none';
+ }
+ controller.onPlaceLabel(tag, node);
+ }
+});
+
+/*
+ TM.Label.HTML
+
+ Custom extension of <Graph.Label.HTML>.
+
+ Extends:
+
+ All <Graph.Label.HTML> methods.
+
+ See also:
+
+ <Graph.Label.HTML>
+
+*/
+TM.Label.HTML = new Class( {
+ Implements: Graph.Label.HTML,
+
+ initialize: function(viz){
+ this.viz = viz;
+ this.leaf = viz.leaf;
+ this.config = viz.config;
+ },
+
+ /*
+ placeLabel
+
+ Overrides abstract method placeLabel in <Graph.Plot>.
+
+ Parameters:
+
+ tag - A DOM label element.
+ node - A <Graph.Node>.
+ controller - A configuration/controller object passed to the visualization.
+
+ */
+ placeLabel: function(tag, node, controller){
+ var pos = node.pos.getc(true),
+ canvas = this.viz.canvas,
+ ox = canvas.translateOffsetX,
+ oy = canvas.translateOffsetY,
+ sx = canvas.scaleOffsetX,
+ sy = canvas.scaleOffsetY,
+ radius = canvas.getSize();
+ var labelPos = {
+ x: Math.round(pos.x * sx + ox + radius.width / 2),
+ y: Math.round(pos.y * sy + oy + radius.height / 2)
+ };
+
+ var style = tag.style;
+ style.left = labelPos.x + 'px';
+ style.top = labelPos.y + 'px';
+ style.width = node.getData('width') * sx + 'px';
+ style.height = node.getData('height') * sy + 'px';
+ style.zIndex = node._depth * 100;
+ style.display = '';
+
+ if(!this.leaf(node) && !this.config.titleHeight) {
+ tag.style.display = 'none';
+ }
+ controller.onPlaceLabel(tag, node);
+ }
+});
+
+/*
+ Class: TM.Plot.NodeTypes
+
+ This class contains a list of <Graph.Node> built-in types.
+ Node types implemented are 'none', 'rectangle'.
+
+ You can add your custom node types, customizing your visualization to the extreme.
+
+ Example:
+
+ (start code js)
+ TM.Plot.NodeTypes.implement({
+ 'mySpecialType': {
+ 'render': function(node, canvas) {
+ //print your custom node to canvas
+ },
+ //optional
+ 'contains': function(node, pos) {
+ //return true if pos is inside the node or false otherwise
+ }
+ }
+ });
+ (end code)
+
+*/
+TM.Plot.NodeTypes = new Class( {
+ 'none': {
+ 'render': $.empty
+ },
+
+ 'rectangle': {
+ 'render': function(node, canvas, animating){
+ var leaf = this.viz.leaf(node),
+ config = this.config,
+ offst = config.offset,
+ titleHeight = config.titleHeight,
+ pos = node.pos.getc(true),
+ width = node.getData('width'),
+ height = node.getData('height'),
+ border = node.getData('border'),
+ ctx = canvas.getCtx(),
+ posx = pos.x + offst / 2,
+ posy = pos.y + offst / 2;
+ if(width <= offst || height <= offst) return;
+ if (leaf) {
+ if(config.cushion) {
+ var lg = ctx.createRadialGradient(posx + (width-offst)/2, posy + (height-offst)/2, 1,
+ posx + (width-offst)/2, posy + (height-offst)/2, width < height? height : width);
+ var color = node.getData('color');
+ var colorGrad = $.rgbToHex($.map($.hexToRgb(color),
+ function(r) { return r * 0.2 >> 0; }));
+ lg.addColorStop(0, color);
+ lg.addColorStop(1, colorGrad);
+ ctx.fillStyle = lg;
+ }
+ ctx.fillRect(posx, posy, width - offst, height - offst);
+ if(border) {
+ ctx.save();
+ ctx.strokeStyle = border;
+ ctx.strokeRect(posx, posy, width - offst, height - offst);
+ ctx.restore();
+ }
+ } else if(titleHeight > 0){
+ ctx.fillRect(pos.x + offst / 2, pos.y + offst / 2, width - offst,
+ titleHeight - offst);
+ if(border) {
+ ctx.save();
+ ctx.strokeStyle = border;
+ ctx.strokeRect(pos.x + offst / 2, pos.y + offst / 2, width - offst,
+ height - offst);
+ ctx.restore();
+ }
+ }
+ },
+ 'contains': function(node, pos) {
+ if(this.viz.clickedNode && !node.isDescendantOf(this.viz.clickedNode.id) || node.ignore) return false;
+ var npos = node.pos.getc(true),
+ width = node.getData('width'),
+ leaf = this.viz.leaf(node),
+ height = leaf? node.getData('height') : this.config.titleHeight;
+ return this.nodeHelper.rectangle.contains({x: npos.x + width/2, y: npos.y + height/2}, pos, width, height);
+ }
+ }
+});
+
+TM.Plot.EdgeTypes = new Class( {
+ 'none': $.empty
+});
+
+/*
+ Class: TM.SliceAndDice
+
+ A slice and dice TreeMap visualization.
+
+ Implements:
+
+ All <TM.Base> methods and properties.
+*/
+TM.SliceAndDice = new Class( {
+ Implements: [
+ Loader, Extras, TM.Base, Layouts.TM.SliceAndDice
+ ]
+});
+
+/*
+ Class: TM.Squarified
+
+ A squarified TreeMap visualization.
+
+ Implements:
+
+ All <TM.Base> methods and properties.
+*/
+TM.Squarified = new Class( {
+ Implements: [
+ Loader, Extras, TM.Base, Layouts.TM.Squarified
+ ]
+});
+
+/*
+ Class: TM.Strip
+
+ A strip TreeMap visualization.
+
+ Implements:
+
+ All <TM.Base> methods and properties.
+*/
+TM.Strip = new Class( {
+ Implements: [
+ Loader, Extras, TM.Base, Layouts.TM.Strip
+ ]
+});
+
+
+/*
+ * File: RGraph.js
+ *
+ */
+
+/*
+ Class: RGraph
+
+ A radial graph visualization with advanced animations.
+
+ Inspired by:
+
+ Animated Exploration of Dynamic Graphs with Radial Layout (Ka-Ping Yee, Danyel Fisher, Rachna Dhamija, Marti Hearst) <http://bailando.sims.berkeley.edu/papers/infovis01.htm>
+
+ Note:
+
+ This visualization was built and engineered from scratch, taking only the paper as inspiration, and only shares some features with the visualization described in the paper.
+
+ Implements:
+
+ All <Loader> methods
+
+ Constructor Options:
+
+ Inherits options from
+
+ - <Options.Canvas>
+ - <Options.Controller>
+ - <Options.Node>
+ - <Options.Edge>
+ - <Options.Label>
+ - <Options.Events>
+ - <Options.Tips>
+ - <Options.NodeStyles>
+ - <Options.Navigation>
+
+ Additionally, there are other parameters and some default values changed
+
+ interpolation - (string) Default's *linear*. Describes the way nodes are interpolated. Possible values are 'linear' and 'polar'.
+ levelDistance - (number) Default's *100*. The distance between levels of the tree.
+
+ Instance Properties:
+
+ canvas - Access a <Canvas> instance.
+ graph - Access a <Graph> instance.
+ op - Access a <RGraph.Op> instance.
+ fx - Access a <RGraph.Plot> instance.
+ labels - Access a <RGraph.Label> interface implementation.
+*/
+
+$jit.RGraph = new Class( {
+
+ Implements: [
+ Loader, Extras, Layouts.Radial
+ ],
+
+ initialize: function(controller){
+ var $RGraph = $jit.RGraph;
+
+ var config = {
+ interpolation: 'linear',
+ levelDistance: 100
+ };
+
+ this.controller = this.config = $.merge(Options("Canvas", "Node", "Edge",
+ "Fx", "Controller", "Tips", "NodeStyles", "Events", "Navigation", "Label"), config, controller);
+
+ var canvasConfig = this.config;
+ if(canvasConfig.useCanvas) {
+ this.canvas = canvasConfig.useCanvas;
+ this.config.labelContainer = this.canvas.id + '-label';
+ } else {
+ if(canvasConfig.background) {
+ canvasConfig.background = $.merge({
+ type: 'Circles'
+ }, canvasConfig.background);
+ }
+ this.canvas = new Canvas(this, canvasConfig);
+ this.config.labelContainer = (typeof canvasConfig.injectInto == 'string'? canvasConfig.injectInto : canvasConfig.injectInto.id) + '-label';
+ }
+
+ this.graphOptions = {
+ 'complex': false,
+ 'Node': {
+ 'selected': false,
+ 'exist': true,
+ 'drawn': true
+ }
+ };
+ this.graph = new Graph(this.graphOptions, this.config.Node,
+ this.config.Edge);
+ this.labels = new $RGraph.Label[canvasConfig.Label.type](this);
+ this.fx = new $RGraph.Plot(this, $RGraph);
+ this.op = new $RGraph.Op(this);
+ this.json = null;
+ this.root = null;
+ this.busy = false;
+ this.parent = false;
+ // initialize extras
+ this.initializeExtras();
+ },
+
+ /*
+
+ createLevelDistanceFunc
+
+ Returns the levelDistance function used for calculating a node distance
+ to its origin. This function returns a function that is computed
+ per level and not per node, such that all nodes with the same depth will have the
+ same distance to the origin. The resulting function gets the
+ parent node as parameter and returns a float.
+
+ */
+ createLevelDistanceFunc: function(){
+ var ld = this.config.levelDistance;
+ return function(elem){
+ return (elem._depth + 1) * ld;
+ };
+ },
+
+ /*
+ Method: refresh
+
+ Computes positions and plots the tree.
+
+ */
+ refresh: function(){
+ this.compute();
+ this.plot();
+ },
+
+ reposition: function(){
+ this.compute('end');
+ },
+
+ /*
+ Method: plot
+
+ Plots the RGraph. This is a shortcut to *fx.plot*.
+ */
+ plot: function(){
+ this.fx.plot();
+ },
+ /*
+ getNodeAndParentAngle
+
+ Returns the _parent_ of the given node, also calculating its angle span.
+ */
+ getNodeAndParentAngle: function(id){
+ var theta = false;
+ var n = this.graph.getNode(id);
+ var ps = n.getParents();
+ var p = (ps.length > 0)? ps[0] : false;
+ if (p) {
+ var posParent = p.pos.getc(), posChild = n.pos.getc();
+ var newPos = posParent.add(posChild.scale(-1));
+ theta = Math.atan2(newPos.y, newPos.x);
+ if (theta < 0)
+ theta += 2 * Math.PI;
+ }
+ return {
+ parent: p,
+ theta: theta
+ };
+ },
+ /*
+ tagChildren
+
+ Enumerates the children in order to maintain child ordering (second constraint of the paper).
+ */
+ tagChildren: function(par, id){
+ if (par.angleSpan) {
+ var adjs = [];
+ par.eachAdjacency(function(elem){
+ adjs.push(elem.nodeTo);
+ }, "ignore");
+ var len = adjs.length;
+ for ( var i = 0; i < len && id != adjs[i].id; i++)
+ ;
+ for ( var j = (i + 1) % len, k = 0; id != adjs[j].id; j = (j + 1) % len) {
+ adjs[j].dist = k++;
+ }
+ }
+ },
+ /*
+ Method: onClick
+
+ Animates the <RGraph> to center the node specified by *id*.
+
+ Parameters:
+
+ id - A <Graph.Node> id.
+ opt - (optional|object) An object containing some extra properties described below
+ hideLabels - (boolean) Default's *true*. Hide labels when performing the animation.
+
+ Example:
+
+ (start code js)
+ rgraph.onClick('someid');
+ //or also...
+ rgraph.onClick('someid', {
+ hideLabels: false
+ });
+ (end code)
+
+ */
+ onClick: function(id, opt){
+ if (this.root != id && !this.busy) {
+ this.busy = true;
+ this.root = id;
+ that = this;
+ this.controller.onBeforeCompute(this.graph.getNode(id));
+ var obj = this.getNodeAndParentAngle(id);
+
+ // second constraint
+ this.tagChildren(obj.parent, id);
+ this.parent = obj.parent;
+ this.compute('end');
+
+ // first constraint
+ var thetaDiff = obj.theta - obj.parent.endPos.theta;
+ this.graph.eachNode(function(elem){
+ elem.endPos.set(elem.endPos.getp().add($P(thetaDiff, 0)));
+ });
+
+ var mode = this.config.interpolation;
+ opt = $.merge( {
+ onComplete: $.empty
+ }, opt || {});
+
+ this.fx.animate($.merge( {
+ hideLabels: true,
+ modes: [
+ mode
+ ]
+ }, opt, {
+ onComplete: function(){
+ that.busy = false;
+ opt.onComplete();
+ }
+ }));
+ }
+ }
+});
+
+$jit.RGraph.$extend = true;
+
+(function(RGraph){
+
+ /*
+ Class: RGraph.Op
+
+ Custom extension of <Graph.Op>.
+
+ Extends:
+
+ All <Graph.Op> methods
+
+ See also:
+
+ <Graph.Op>
+
+ */
+ RGraph.Op = new Class( {
+
+ Implements: Graph.Op
+
+ });
+
+ /*
+ Class: RGraph.Plot
+
+ Custom extension of <Graph.Plot>.
+
+ Extends:
+
+ All <Graph.Plot> methods
+
+ See also:
+
+ <Graph.Plot>
+
+ */
+ RGraph.Plot = new Class( {
+
+ Implements: Graph.Plot
+
+ });
+
+ /*
+ Object: RGraph.Label
+
+ Custom extension of <Graph.Label>.
+ Contains custom <Graph.Label.SVG>, <Graph.Label.HTML> and <Graph.Label.Native> extensions.
+
+ Extends:
+
+ All <Graph.Label> methods and subclasses.
+
+ See also:
+
+ <Graph.Label>, <Graph.Label.Native>, <Graph.Label.HTML>, <Graph.Label.SVG>.
+
+ */
+ RGraph.Label = {};
+
+ /*
+ RGraph.Label.Native
+
+ Custom extension of <Graph.Label.Native>.
+
+ Extends:
+
+ All <Graph.Label.Native> methods
+
+ See also:
+
+ <Graph.Label.Native>
+
+ */
+ RGraph.Label.Native = new Class( {
+ Implements: Graph.Label.Native
+ });
+
+ /*
+ RGraph.Label.SVG
+
+ Custom extension of <Graph.Label.SVG>.
+
+ Extends:
+
+ All <Graph.Label.SVG> methods
+
+ See also:
+
+ <Graph.Label.SVG>
+
+ */
+ RGraph.Label.SVG = new Class( {
+ Implements: Graph.Label.SVG,
+
+ initialize: function(viz){
+ this.viz = viz;
+ },
+
+ /*
+ placeLabel
+
+ Overrides abstract method placeLabel in <Graph.Plot>.
+
+ Parameters:
+
+ tag - A DOM label element.
+ node - A <Graph.Node>.
+ controller - A configuration/controller object passed to the visualization.
+
+ */
+ placeLabel: function(tag, node, controller){
+ var pos = node.pos.getc(true),
+ canvas = this.viz.canvas,
+ ox = canvas.translateOffsetX,
+ oy = canvas.translateOffsetY,
+ sx = canvas.scaleOffsetX,
+ sy = canvas.scaleOffsetY,
+ radius = canvas.getSize();
+ var labelPos = {
+ x: Math.round(pos.x * sx + ox + radius.width / 2),
+ y: Math.round(pos.y * sy + oy + radius.height / 2)
+ };
+ tag.setAttribute('x', labelPos.x);
+ tag.setAttribute('y', labelPos.y);
+
+ controller.onPlaceLabel(tag, node);
+ }
+ });
+
+ /*
+ RGraph.Label.HTML
+
+ Custom extension of <Graph.Label.HTML>.
+
+ Extends:
+
+ All <Graph.Label.HTML> methods.
+
+ See also:
+
+ <Graph.Label.HTML>
+
+ */
+ RGraph.Label.HTML = new Class( {
+ Implements: Graph.Label.HTML,
+
+ initialize: function(viz){
+ this.viz = viz;
+ },
+ /*
+ placeLabel
+
+ Overrides abstract method placeLabel in <Graph.Plot>.
+
+ Parameters:
+
+ tag - A DOM label element.
+ node - A <Graph.Node>.
+ controller - A configuration/controller object passed to the visualization.
+
+ */
+ placeLabel: function(tag, node, controller){
+ var pos = node.pos.getc(true),
+ canvas = this.viz.canvas,
+ ox = canvas.translateOffsetX,
+ oy = canvas.translateOffsetY,
+ sx = canvas.scaleOffsetX,
+ sy = canvas.scaleOffsetY,
+ radius = canvas.getSize();
+ var labelPos = {
+ x: Math.round(pos.x * sx + ox + radius.width / 2),
+ y: Math.round(pos.y * sy + oy + radius.height / 2)
+ };
+
+ var style = tag.style;
+ style.left = labelPos.x + 'px';
+ style.top = labelPos.y + 'px';
+ style.display = this.fitsInCanvas(labelPos, canvas)? '' : 'none';
+
+ controller.onPlaceLabel(tag, node);
+ }
+ });
+
+ /*
+ Class: RGraph.Plot.NodeTypes
+
+ This class contains a list of <Graph.Node> built-in types.
+ Node types implemented are 'none', 'circle', 'triangle', 'rectangle', 'star', 'ellipse' and 'square'.
+
+ You can add your custom node types, customizing your visualization to the extreme.
+
+ Example:
+
+ (start code js)
+ RGraph.Plot.NodeTypes.implement({
+ 'mySpecialType': {
+ 'render': function(node, canvas) {
+ //print your custom node to canvas
+ },
+ //optional
+ 'contains': function(node, pos) {
+ //return true if pos is inside the node or false otherwise
+ }
+ }
+ });
+ (end code)
+
+ */
+ RGraph.Plot.NodeTypes = new Class({
+ 'none': {
+ 'render': $.empty,
+ 'contains': $.lambda(false)
+ },
+ 'circle': {
+ 'render': function(node, canvas){
+ var pos = node.pos.getc(true),
+ dim = node.getData('dim');
+ this.nodeHelper.circle.render('fill', pos, dim, canvas);
+ },
+ 'contains': function(node, pos){
+ var npos = node.pos.getc(true),
+ dim = node.getData('dim');
+ return this.nodeHelper.circle.contains(npos, pos, dim);
+ }
+ },
+ 'ellipse': {
+ 'render': function(node, canvas){
+ var pos = node.pos.getc(true),
+ width = node.getData('width'),
+ height = node.getData('height');
+ this.nodeHelper.ellipse.render('fill', pos, width, height, canvas);
+ },
+ // TODO(nico): be more precise...
+ 'contains': function(node, pos){
+ var npos = node.pos.getc(true),
+ width = node.getData('width'),
+ height = node.getData('height');
+ return this.nodeHelper.ellipse.contains(npos, pos, width, height);
+ }
+ },
+ 'square': {
+ 'render': function(node, canvas){
+ var pos = node.pos.getc(true),
+ dim = node.getData('dim');
+ this.nodeHelper.square.render('fill', pos, dim, canvas);
+ },
+ 'contains': function(node, pos){
+ var npos = node.pos.getc(true),
+ dim = node.getData('dim');
+ return this.nodeHelper.square.contains(npos, pos, dim);
+ }
+ },
+ 'rectangle': {
+ 'render': function(node, canvas){
+ var pos = node.pos.getc(true),
+ width = node.getData('width'),
+ height = node.getData('height');
+ this.nodeHelper.rectangle.render('fill', pos, width, height, canvas);
+ },
+ 'contains': function(node, pos){
+ var npos = node.pos.getc(true),
+ width = node.getData('width'),
+ height = node.getData('height');
+ return this.nodeHelper.rectangle.contains(npos, pos, width, height);
+ }
+ },
+ 'triangle': {
+ 'render': function(node, canvas){
+ var pos = node.pos.getc(true),
+ dim = node.getData('dim');
+ this.nodeHelper.triangle.render('fill', pos, dim, canvas);
+ },
+ 'contains': function(node, pos) {
+ var npos = node.pos.getc(true),
+ dim = node.getData('dim');
+ return this.nodeHelper.triangle.contains(npos, pos, dim);
+ }
+ },
+ 'star': {
+ 'render': function(node, canvas){
+ var pos = node.pos.getc(true),
+ dim = node.getData('dim');
+ this.nodeHelper.star.render('fill', pos, dim, canvas);
+ },
+ 'contains': function(node, pos) {
+ var npos = node.pos.getc(true),
+ dim = node.getData('dim');
+ return this.nodeHelper.star.contains(npos, pos, dim);
+ }
+ }
+ });
+
+ /*
+ Class: RGraph.Plot.EdgeTypes
+
+ This class contains a list of <Graph.Adjacence> built-in types.
+ Edge types implemented are 'none', 'line' and 'arrow'.
+
+ You can add your custom edge types, customizing your visualization to the extreme.
+
+ Example:
+
+ (start code js)
+ RGraph.Plot.EdgeTypes.implement({
+ 'mySpecialType': {
+ 'render': function(adj, canvas) {
+ //print your custom edge to canvas
+ },
+ //optional
+ 'contains': function(adj, pos) {
+ //return true if pos is inside the arc or false otherwise
+ }
+ }
+ });
+ (end code)
+
+ */
+ RGraph.Plot.EdgeTypes = new Class({
+ 'none': $.empty,
+ 'line': {
+ 'render': function(adj, canvas) {
+ var from = adj.nodeFrom.pos.getc(true),
+ to = adj.nodeTo.pos.getc(true);
+ this.edgeHelper.line.render(from, to, canvas);
+ },
+ 'contains': function(adj, pos) {
+ var from = adj.nodeFrom.pos.getc(true),
+ to = adj.nodeTo.pos.getc(true);
+ return this.edgeHelper.line.contains(from, to, pos, this.edge.epsilon);
+ }
+ },
+ 'arrow': {
+ 'render': function(adj, canvas) {
+ var from = adj.nodeFrom.pos.getc(true),
+ to = adj.nodeTo.pos.getc(true),
+ dim = adj.getData('dim'),
+ direction = adj.data.$direction,
+ inv = (direction && direction.length>1 && direction[0] != adj.nodeFrom.id);
+ this.edgeHelper.arrow.render(from, to, dim, inv, canvas);
+ },
+ 'contains': function(adj, pos) {
+ var from = adj.nodeFrom.pos.getc(true),
+ to = adj.nodeTo.pos.getc(true);
+ return this.edgeHelper.arrow.contains(from, to, pos, this.edge.epsilon);
+ }
+ }
+ });
+
+})($jit.RGraph);
+
+
+/*
+ * File: Hypertree.js
+ *
+*/
+
+/*
+ Complex
+
+ A multi-purpose Complex Class with common methods. Extended for the Hypertree.
+
+*/
+/*
+ moebiusTransformation
+
+ Calculates a moebius transformation for this point / complex.
+ For more information go to:
+ http://en.wikipedia.org/wiki/Moebius_transformation.
+
+ Parameters:
+
+ c - An initialized Complex instance representing a translation Vector.
+*/
+
+Complex.prototype.moebiusTransformation = function(c) {
+ var num = this.add(c);
+ var den = c.$conjugate().$prod(this);
+ den.x++;
+ return num.$div(den);
+};
+
+/*
+ moebiusTransformation
+
+ Calculates a moebius transformation for the hyperbolic tree.
+
+ <http://en.wikipedia.org/wiki/Moebius_transformation>
+
+ Parameters:
+
+ graph - A <Graph> instance.
+ pos - A <Complex>.
+ prop - A property array.
+ theta - Rotation angle.
+ startPos - _optional_ start position.
+*/
+Graph.Util.moebiusTransformation = function(graph, pos, prop, startPos, flags) {
+ this.eachNode(graph, function(elem) {
+ for ( var i = 0; i < prop.length; i++) {
+ var p = pos[i].scale(-1), property = startPos ? startPos : prop[i];
+ elem.getPos(prop[i]).set(elem.getPos(property).getc().moebiusTransformation(p));
+ }
+ }, flags);
+};
+
+/*
+ Class: Hypertree
+
+ A Hyperbolic Tree/Graph visualization.
+
+ Inspired by:
+
+ A Focus+Context Technique Based on Hyperbolic Geometry for Visualizing Large Hierarchies (John Lamping, Ramana Rao, and Peter Pirolli).
+ <http://www.cs.tau.ac.il/~asharf/shrek/Projects/HypBrowser/startree-chi95.pdf>
+
+ Note:
+
+ This visualization was built and engineered from scratch, taking only the paper as inspiration, and only shares some features with the Hypertree described in the paper.
+
+ Implements:
+
+ All <Loader> methods
+
+ Constructor Options:
+
+ Inherits options from
+
+ - <Options.Canvas>
+ - <Options.Controller>
+ - <Options.Node>
+ - <Options.Edge>
+ - <Options.Label>
+ - <Options.Events>
+ - <Options.Tips>
+ - <Options.NodeStyles>
+ - <Options.Navigation>
+
+ Additionally, there are other parameters and some default values changed
+
+ radius - (string|number) Default's *auto*. The radius of the disc to plot the <Hypertree> in. 'auto' will take the smaller value from the width and height canvas dimensions. You can also set this to a custom value, for example *250*.
+ offset - (number) Default's *0*. A number in the range [0, 1) that will be substracted to each node position to make a more compact <Hypertree>. This will avoid placing nodes too far from each other when a there's a selected node.
+ fps - Described in <Options.Fx>. It's default value has been changed to *35*.
+ duration - Described in <Options.Fx>. It's default value has been changed to *1500*.
+ Edge.type - Described in <Options.Edge>. It's default value has been changed to *hyperline*.
+
+ Instance Properties:
+
+ canvas - Access a <Canvas> instance.
+ graph - Access a <Graph> instance.
+ op - Access a <Hypertree.Op> instance.
+ fx - Access a <Hypertree.Plot> instance.
+ labels - Access a <Hypertree.Label> interface implementation.
+
+*/
+
+$jit.Hypertree = new Class( {
+
+ Implements: [ Loader, Extras, Layouts.Radial ],
+
+ initialize: function(controller) {
+ var $Hypertree = $jit.Hypertree;
+
+ var config = {
+ radius: "auto",
+ offset: 0,
+ Edge: {
+ type: 'hyperline'
+ },
+ duration: 1500,
+ fps: 35
+ };
+ this.controller = this.config = $.merge(Options("Canvas", "Node", "Edge",
+ "Fx", "Tips", "NodeStyles", "Events", "Navigation", "Controller", "Label"), config, controller);
+
+ var canvasConfig = this.config;
+ if(canvasConfig.useCanvas) {
+ this.canvas = canvasConfig.useCanvas;
+ this.config.labelContainer = this.canvas.id + '-label';
+ } else {
+ if(canvasConfig.background) {
+ canvasConfig.background = $.merge({
+ type: 'Circles'
+ }, canvasConfig.background);
+ }
+ this.canvas = new Canvas(this, canvasConfig);
+ this.config.labelContainer = (typeof canvasConfig.injectInto == 'string'? canvasConfig.injectInto : canvasConfig.injectInto.id) + '-label';
+ }
+
+ this.graphOptions = {
+ 'complex': false,
+ 'Node': {
+ 'selected': false,
+ 'exist': true,
+ 'drawn': true
+ }
+ };
+ this.graph = new Graph(this.graphOptions, this.config.Node,
+ this.config.Edge);
+ this.labels = new $Hypertree.Label[canvasConfig.Label.type](this);
+ this.fx = new $Hypertree.Plot(this, $Hypertree);
+ this.op = new $Hypertree.Op(this);
+ this.json = null;
+ this.root = null;
+ this.busy = false;
+ // initialize extras
+ this.initializeExtras();
+ },
+
+ /*
+
+ createLevelDistanceFunc
+
+ Returns the levelDistance function used for calculating a node distance
+ to its origin. This function returns a function that is computed
+ per level and not per node, such that all nodes with the same depth will have the
+ same distance to the origin. The resulting function gets the
+ parent node as parameter and returns a float.
+
+ */
+ createLevelDistanceFunc: function() {
+ // get max viz. length.
+ var r = this.getRadius();
+ // get max depth.
+ var depth = 0, max = Math.max, config = this.config;
+ this.graph.eachNode(function(node) {
+ depth = max(node._depth, depth);
+ }, "ignore");
+ depth++;
+ // node distance generator
+ var genDistFunc = function(a) {
+ return function(node) {
+ node.scale = r;
+ var d = node._depth + 1;
+ var acum = 0, pow = Math.pow;
+ while (d) {
+ acum += pow(a, d--);
+ }
+ return acum - config.offset;
+ };
+ };
+ // estimate better edge length.
+ for ( var i = 0.51; i <= 1; i += 0.01) {
+ var valSeries = (1 - Math.pow(i, depth)) / (1 - i);
+ if (valSeries >= 2) { return genDistFunc(i - 0.01); }
+ }
+ return genDistFunc(0.75);
+ },
+
+ /*
+ Method: getRadius
+
+ Returns the current radius of the visualization. If *config.radius* is *auto* then it
+ calculates the radius by taking the smaller size of the <Canvas> widget.
+
+ See also:
+
+ <Canvas.getSize>
+
+ */
+ getRadius: function() {
+ var rad = this.config.radius;
+ if (rad !== "auto") { return rad; }
+ var s = this.canvas.getSize();
+ return Math.min(s.width, s.height) / 2;
+ },
+
+ /*
+ Method: refresh
+
+ Computes positions and plots the tree.
+
+ Parameters:
+
+ reposition - (optional|boolean) Set this to *true* to force all positions (current, start, end) to match.
+
+ */
+ refresh: function(reposition) {
+ if (reposition) {
+ this.reposition();
+ this.graph.eachNode(function(node) {
+ node.startPos.rho = node.pos.rho = node.endPos.rho;
+ node.startPos.theta = node.pos.theta = node.endPos.theta;
+ });
+ } else {
+ this.compute();
+ }
+ this.plot();
+ },
+
+ /*
+ reposition
+
+ Computes nodes' positions and restores the tree to its previous position.
+
+ For calculating nodes' positions the root must be placed on its origin. This method does this
+ and then attemps to restore the hypertree to its previous position.
+
+ */
+ reposition: function() {
+ this.compute('end');
+ var vector = this.graph.getNode(this.root).pos.getc().scale(-1);
+ Graph.Util.moebiusTransformation(this.graph, [ vector ], [ 'end' ],
+ 'end', "ignore");
+ this.graph.eachNode(function(node) {
+ if (node.ignore) {
+ node.endPos.rho = node.pos.rho;
+ node.endPos.theta = node.pos.theta;
+ }
+ });
+ },
+
+ /*
+ Method: plot
+
+ Plots the <Hypertree>. This is a shortcut to *fx.plot*.
+
+ */
+ plot: function() {
+ this.fx.plot();
+ },
+
+ /*
+ Method: onClick
+
+ Animates the <Hypertree> to center the node specified by *id*.
+
+ Parameters:
+
+ id - A <Graph.Node> id.
+ opt - (optional|object) An object containing some extra properties described below
+ hideLabels - (boolean) Default's *true*. Hide labels when performing the animation.
+
+ Example:
+
+ (start code js)
+ ht.onClick('someid');
+ //or also...
+ ht.onClick('someid', {
+ hideLabels: false
+ });
+ (end code)
+
+ */
+ onClick: function(id, opt) {
+ var pos = this.graph.getNode(id).pos.getc(true);
+ this.move(pos, opt);
+ },
+
+ /*
+ Method: move
+
+ Translates the tree to the given position.
+
+ Parameters:
+
+ pos - (object) A *x, y* coordinate object where x, y in [0, 1), to move the tree to.
+ opt - This object has been defined in <Hypertree.onClick>
+
+ Example:
+
+ (start code js)
+ ht.move({ x: 0, y: 0.7 }, {
+ hideLabels: false
+ });
+ (end code)
+
+ */
+ move: function(pos, opt) {
+ var versor = $C(pos.x, pos.y);
+ if (this.busy === false && versor.norm() < 1) {
+ this.busy = true;
+ var root = this.graph.getClosestNodeToPos(versor), that = this;
+ this.graph.computeLevels(root.id, 0);
+ this.controller.onBeforeCompute(root);
+ opt = $.merge( {
+ onComplete: $.empty
+ }, opt || {});
+ this.fx.animate($.merge( {
+ modes: [ 'moebius' ],
+ hideLabels: true
+ }, opt, {
+ onComplete: function() {
+ that.busy = false;
+ opt.onComplete();
+ }
+ }), versor);
+ }
+ }
+});
+
+$jit.Hypertree.$extend = true;
+
+(function(Hypertree) {
+
+ /*
+ Class: Hypertree.Op
+
+ Custom extension of <Graph.Op>.
+
+ Extends:
+
+ All <Graph.Op> methods
+
+ See also:
+
+ <Graph.Op>
+
+ */
+ Hypertree.Op = new Class( {
+
+ Implements: Graph.Op
+
+ });
+
+ /*
+ Class: Hypertree.Plot
+
+ Custom extension of <Graph.Plot>.
+
+ Extends:
+
+ All <Graph.Plot> methods
+
+ See also:
+
+ <Graph.Plot>
+
+ */
+ Hypertree.Plot = new Class( {
+
+ Implements: Graph.Plot
+
+ });
+
+ /*
+ Object: Hypertree.Label
+
+ Custom extension of <Graph.Label>.
+ Contains custom <Graph.Label.SVG>, <Graph.Label.HTML> and <Graph.Label.Native> extensions.
+
+ Extends:
+
+ All <Graph.Label> methods and subclasses.
+
+ See also:
+
+ <Graph.Label>, <Graph.Label.Native>, <Graph.Label.HTML>, <Graph.Label.SVG>.
+
+ */
+ Hypertree.Label = {};
+
+ /*
+ Hypertree.Label.Native
+
+ Custom extension of <Graph.Label.Native>.
+
+ Extends:
+
+ All <Graph.Label.Native> methods
+
+ See also:
+
+ <Graph.Label.Native>
+
+ */
+ Hypertree.Label.Native = new Class( {
+ Implements: Graph.Label.Native,
+
+ initialize: function(viz) {
+ this.viz = viz;
+ },
+
+ renderLabel: function(canvas, node, controller) {
+ var ctx = canvas.getCtx();
+ var coord = node.pos.getc(true);
+ var s = this.viz.getRadius();
+ ctx.fillText(node.name, coord.x * s, coord.y * s);
+ }
+ });
+
+ /*
+ Hypertree.Label.SVG
+
+ Custom extension of <Graph.Label.SVG>.
+
+ Extends:
+
+ All <Graph.Label.SVG> methods
+
+ See also:
+
+ <Graph.Label.SVG>
+
+ */
+ Hypertree.Label.SVG = new Class( {
+ Implements: Graph.Label.SVG,
+
+ initialize: function(viz) {
+ this.viz = viz;
+ },
+
+ /*
+ placeLabel
+
+ Overrides abstract method placeLabel in <Graph.Plot>.
+
+ Parameters:
+
+ tag - A DOM label element.
+ node - A <Graph.Node>.
+ controller - A configuration/controller object passed to the visualization.
+
+ */
+ placeLabel: function(tag, node, controller) {
+ var pos = node.pos.getc(true),
+ canvas = this.viz.canvas,
+ ox = canvas.translateOffsetX,
+ oy = canvas.translateOffsetY,
+ sx = canvas.scaleOffsetX,
+ sy = canvas.scaleOffsetY,
+ radius = canvas.getSize(),
+ r = this.viz.getRadius();
+ var labelPos = {
+ x: Math.round((pos.x * sx) * r + ox + radius.width / 2),
+ y: Math.round((pos.y * sy) * r + oy + radius.height / 2)
+ };
+ tag.setAttribute('x', labelPos.x);
+ tag.setAttribute('y', labelPos.y);
+ controller.onPlaceLabel(tag, node);
+ }
+ });
+
+ /*
+ Hypertree.Label.HTML
+
+ Custom extension of <Graph.Label.HTML>.
+
+ Extends:
+
+ All <Graph.Label.HTML> methods.
+
+ See also:
+
+ <Graph.Label.HTML>
+
+ */
+ Hypertree.Label.HTML = new Class( {
+ Implements: Graph.Label.HTML,
+
+ initialize: function(viz) {
+ this.viz = viz;
+ },
+ /*
+ placeLabel
+
+ Overrides abstract method placeLabel in <Graph.Plot>.
+
+ Parameters:
+
+ tag - A DOM label element.
+ node - A <Graph.Node>.
+ controller - A configuration/controller object passed to the visualization.
+
+ */
+ placeLabel: function(tag, node, controller) {
+ var pos = node.pos.getc(true),
+ canvas = this.viz.canvas,
+ ox = canvas.translateOffsetX,
+ oy = canvas.translateOffsetY,
+ sx = canvas.scaleOffsetX,
+ sy = canvas.scaleOffsetY,
+ radius = canvas.getSize(),
+ r = this.viz.getRadius();
+ var labelPos = {
+ x: Math.round((pos.x * sx) * r + ox + radius.width / 2),
+ y: Math.round((pos.y * sy) * r + oy + radius.height / 2)
+ };
+ var style = tag.style;
+ style.left = labelPos.x + 'px';
+ style.top = labelPos.y + 'px';
+ style.display = this.fitsInCanvas(labelPos, canvas) ? '' : 'none';
+
+ controller.onPlaceLabel(tag, node);
+ }
+ });
+
+ /*
+ Class: Hypertree.Plot.NodeTypes
+
+ This class contains a list of <Graph.Node> built-in types.
+ Node types implemented are 'none', 'circle', 'triangle', 'rectangle', 'star', 'ellipse' and 'square'.
+
+ You can add your custom node types, customizing your visualization to the extreme.
+
+ Example:
+
+ (start code js)
+ Hypertree.Plot.NodeTypes.implement({
+ 'mySpecialType': {
+ 'render': function(node, canvas) {
+ //print your custom node to canvas
+ },
+ //optional
+ 'contains': function(node, pos) {
+ //return true if pos is inside the node or false otherwise
+ }
+ }
+ });
+ (end code)
+
+ */
+ Hypertree.Plot.NodeTypes = new Class({
+ 'none': {
+ 'render': $.empty,
+ 'contains': $.lambda(false)
+ },
+ 'circle': {
+ 'render': function(node, canvas) {
+ var nconfig = this.node,
+ dim = node.getData('dim'),
+ p = node.pos.getc();
+ dim = nconfig.transform? dim * (1 - p.squaredNorm()) : dim;
+ p.$scale(node.scale);
+ if (dim > 0.2) {
+ this.nodeHelper.circle.render('fill', p, dim, canvas);
+ }
+ },
+ 'contains': function(node, pos) {
+ var dim = node.getData('dim'),
+ npos = node.pos.getc().$scale(node.scale);
+ return this.nodeHelper.circle.contains(npos, pos, dim);
+ }
+ },
+ 'ellipse': {
+ 'render': function(node, canvas) {
+ var pos = node.pos.getc().$scale(node.scale),
+ width = node.getData('width'),
+ height = node.getData('height');
+ this.nodeHelper.ellipse.render('fill', pos, width, height, canvas);
+ },
+ 'contains': function(node, pos) {
+ var width = node.getData('width'),
+ height = node.getData('height'),
+ npos = node.pos.getc().$scale(node.scale);
+ return this.nodeHelper.circle.contains(npos, pos, width, height);
+ }
+ },
+ 'square': {
+ 'render': function(node, canvas) {
+ var nconfig = this.node,
+ dim = node.getData('dim'),
+ p = node.pos.getc();
+ dim = nconfig.transform? dim * (1 - p.squaredNorm()) : dim;
+ p.$scale(node.scale);
+ if (dim > 0.2) {
+ this.nodeHelper.square.render('fill', p, dim, canvas);
+ }
+ },
+ 'contains': function(node, pos) {
+ var dim = node.getData('dim'),
+ npos = node.pos.getc().$scale(node.scale);
+ return this.nodeHelper.square.contains(npos, pos, dim);
+ }
+ },
+ 'rectangle': {
+ 'render': function(node, canvas) {
+ var nconfig = this.node,
+ width = node.getData('width'),
+ height = node.getData('height'),
+ pos = node.pos.getc();
+ width = nconfig.transform? width * (1 - pos.squaredNorm()) : width;
+ height = nconfig.transform? height * (1 - pos.squaredNorm()) : height;
+ pos.$scale(node.scale);
+ if (width > 0.2 && height > 0.2) {
+ this.nodeHelper.rectangle.render('fill', pos, width, height, canvas);
+ }
+ },
+ 'contains': function(node, pos) {
+ var width = node.getData('width'),
+ height = node.getData('height'),
+ npos = node.pos.getc().$scale(node.scale);
+ return this.nodeHelper.square.contains(npos, pos, width, height);
+ }
+ },
+ 'triangle': {
+ 'render': function(node, canvas) {
+ var nconfig = this.node,
+ dim = node.getData('dim'),
+ p = node.pos.getc();
+ dim = nconfig.transform? dim * (1 - p.squaredNorm()) : dim;
+ p.$scale(node.scale);
+ if (dim > 0.2) {
+ this.nodeHelper.triangle.render('fill', p, dim, canvas);
+ }
+ },
+ 'contains': function(node, pos) {
+ var dim = node.getData('dim'),
+ npos = node.pos.getc().$scale(node.scale);
+ return this.nodeHelper.triangle.contains(npos, pos, dim);
+ }
+ },
+ 'star': {
+ 'render': function(node, canvas) {
+ var nconfig = this.node,
+ dim = node.getData('dim'),
+ p = node.pos.getc();
+ dim = nconfig.transform? dim * (1 - p.squaredNorm()) : dim;
+ p.$scale(node.scale);
+ if (dim > 0.2) {
+ this.nodeHelper.star.render('fill', p, dim, canvas);
+ }
+ },
+ 'contains': function(node, pos) {
+ var dim = node.getData('dim'),
+ npos = node.pos.getc().$scale(node.scale);
+ return this.nodeHelper.star.contains(npos, pos, dim);
+ }
+ }
+ });
+
+ /*
+ Class: Hypertree.Plot.EdgeTypes
+
+ This class contains a list of <Graph.Adjacence> built-in types.
+ Edge types implemented are 'none', 'line', 'arrow' and 'hyperline'.
+
+ You can add your custom edge types, customizing your visualization to the extreme.
+
+ Example:
+
+ (start code js)
+ Hypertree.Plot.EdgeTypes.implement({
+ 'mySpecialType': {
+ 'render': function(adj, canvas) {
+ //print your custom edge to canvas
+ },
+ //optional
+ 'contains': function(adj, pos) {
+ //return true if pos is inside the arc or false otherwise
+ }
+ }
+ });
+ (end code)
+
+ */
+ Hypertree.Plot.EdgeTypes = new Class({
+ 'none': $.empty,
+ 'line': {
+ 'render': function(adj, canvas) {
+ var from = adj.nodeFrom.pos.getc(true),
+ to = adj.nodeTo.pos.getc(true),
+ r = adj.nodeFrom.scale;
+ this.edgeHelper.line.render({x:from.x*r, y:from.y*r}, {x:to.x*r, y:to.y*r}, canvas);
+ },
+ 'contains': function(adj, pos) {
+ var from = adj.nodeFrom.pos.getc(true),
+ to = adj.nodeTo.pos.getc(true),
+ r = adj.nodeFrom.scale;
+ this.edgeHelper.line.contains({x:from.x*r, y:from.y*r}, {x:to.x*r, y:to.y*r}, pos, this.edge.epsilon);
+ }
+ },
+ 'arrow': {
+ 'render': function(adj, canvas) {
+ var from = adj.nodeFrom.pos.getc(true),
+ to = adj.nodeTo.pos.getc(true),
+ r = adj.nodeFrom.scale,
+ dim = adj.getData('dim'),
+ direction = adj.data.$direction,
+ inv = (direction && direction.length>1 && direction[0] != adj.nodeFrom.id);
+ this.edgeHelper.arrow.render({x:from.x*r, y:from.y*r}, {x:to.x*r, y:to.y*r}, dim, inv, canvas);
+ },
+ 'contains': function(adj, pos) {
+ var from = adj.nodeFrom.pos.getc(true),
+ to = adj.nodeTo.pos.getc(true),
+ r = adj.nodeFrom.scale;
+ this.edgeHelper.arrow.contains({x:from.x*r, y:from.y*r}, {x:to.x*r, y:to.y*r}, pos, this.edge.epsilon);
+ }
+ },
+ 'hyperline': {
+ 'render': function(adj, canvas) {
+ var from = adj.nodeFrom.pos.getc(),
+ to = adj.nodeTo.pos.getc(),
+ dim = this.viz.getRadius();
+ this.edgeHelper.hyperline.render(from, to, dim, canvas);
+ },
+ 'contains': $.lambda(false)
+ }
+ });
+
+})($jit.Hypertree);
+
+
+
+
+ })(); \ No newline at end of file
diff --git a/js/jscalendar/calendar-blue.css b/js/jscalendar/calendar-blue.css
new file mode 100644
index 0000000..ca33cde
--- /dev/null
+++ b/js/jscalendar/calendar-blue.css
@@ -0,0 +1,232 @@
+/* The main calendar widget. DIV containing a table. */
+
+div.calendar { position: relative; }
+
+.calendar, .calendar table {
+ border: 1px solid #556;
+ font-size: 11px;
+ color: #000;
+ cursor: default;
+ background: #eef;
+ font-family: tahoma,verdana,sans-serif;
+}
+
+/* Header part -- contains navigation buttons and day names. */
+
+.calendar .button { /* "<<", "<", ">", ">>" buttons have this class */
+ text-align: center; /* They are the navigation buttons */
+ padding: 2px; /* Make the buttons seem like they're pressing */
+}
+
+.calendar .nav {
+ background: #778 url(menuarrow.gif) no-repeat 100% 100%;
+}
+
+.calendar thead .title { /* This holds the current "month, year" */
+ font-weight: bold; /* Pressing it will take you to the current date */
+ text-align: center;
+ background: #fff;
+ color: #000;
+ padding: 2px;
+}
+
+.calendar thead .headrow { /* Row <TR> containing navigation buttons */
+ background: #778;
+ color: #fff;
+}
+
+.calendar thead .daynames { /* Row <TR> containing the day names */
+ background: #bdf;
+}
+
+.calendar thead .name { /* Cells <TD> containing the day names */
+ border-bottom: 1px solid #556;
+ padding: 2px;
+ text-align: center;
+ color: #000;
+}
+
+.calendar thead .weekend { /* How a weekend day name shows in header */
+ color: #a66;
+}
+
+.calendar thead .hilite { /* How do the buttons in header appear when hover */
+ background-color: #aaf;
+ color: #000;
+ border: 1px solid #04f;
+ padding: 1px;
+}
+
+.calendar thead .active { /* Active (pressed) buttons in header */
+ background-color: #77c;
+ padding: 2px 0px 0px 2px;
+}
+
+/* The body part -- contains all the days in month. */
+
+.calendar tbody .day { /* Cells <TD> containing month days dates */
+ width: 2em;
+ color: #456;
+ text-align: right;
+ padding: 2px 4px 2px 2px;
+}
+.calendar tbody .day.othermonth {
+ font-size: 80%;
+ color: #bbb;
+}
+.calendar tbody .day.othermonth.oweekend {
+ color: #fbb;
+}
+
+.calendar table .wn {
+ padding: 2px 3px 2px 2px;
+ border-right: 1px solid #000;
+ background: #bdf;
+}
+
+.calendar tbody .rowhilite td {
+ background: #def;
+}
+
+.calendar tbody .rowhilite td.wn {
+ background: #eef;
+}
+
+.calendar tbody td.hilite { /* Hovered cells <TD> */
+ background: #def;
+ padding: 1px 3px 1px 1px;
+ border: 1px solid #bbb;
+}
+
+.calendar tbody td.active { /* Active (pressed) cells <TD> */
+ background: #cde;
+ padding: 2px 2px 0px 2px;
+}
+
+.calendar tbody td.selected { /* Cell showing today date */
+ font-weight: bold;
+ border: 1px solid #000;
+ padding: 1px 3px 1px 1px;
+ background: #fff;
+ color: #000;
+}
+
+.calendar tbody td.weekend { /* Cells showing weekend days */
+ color: #a66;
+}
+
+.calendar tbody td.today { /* Cell showing selected date */
+ font-weight: bold;
+ color: #00f;
+}
+
+.calendar tbody .disabled { color: #999; }
+
+.calendar tbody .emptycell { /* Empty cells (the best is to hide them) */
+ visibility: hidden;
+}
+
+.calendar tbody .emptyrow { /* Empty row (some months need less than 6 rows) */
+ display: none;
+}
+
+/* The footer part -- status bar and "Close" button */
+
+.calendar tfoot .footrow { /* The <TR> in footer (only one right now) */
+ text-align: center;
+ background: #556;
+ color: #fff;
+}
+
+.calendar tfoot .ttip { /* Tooltip (status bar) cell <TD> */
+ background: #fff;
+ color: #445;
+ border-top: 1px solid #556;
+ padding: 1px;
+}
+
+.calendar tfoot .hilite { /* Hover style for buttons in footer */
+ background: #aaf;
+ border: 1px solid #04f;
+ color: #000;
+ padding: 1px;
+}
+
+.calendar tfoot .active { /* Active (pressed) style for buttons in footer */
+ background: #77c;
+ padding: 2px 0px 0px 2px;
+}
+
+/* Combo boxes (menus that display months/years for direct selection) */
+
+.calendar .combo {
+ position: absolute;
+ display: none;
+ top: 0px;
+ left: 0px;
+ width: 4em;
+ cursor: default;
+ border: 1px solid #655;
+ background: #def;
+ color: #000;
+ font-size: 90%;
+ z-index: 100;
+}
+
+.calendar .combo .label,
+.calendar .combo .label-IEfix {
+ text-align: center;
+ padding: 1px;
+}
+
+.calendar .combo .label-IEfix {
+ width: 4em;
+}
+
+.calendar .combo .hilite {
+ background: #acf;
+}
+
+.calendar .combo .active {
+ border-top: 1px solid #46a;
+ border-bottom: 1px solid #46a;
+ background: #eef;
+ font-weight: bold;
+}
+
+.calendar td.time {
+ border-top: 1px solid #000;
+ padding: 1px 0px;
+ text-align: center;
+ background-color: #f4f0e8;
+}
+
+.calendar td.time .hour,
+.calendar td.time .minute,
+.calendar td.time .ampm {
+ padding: 0px 3px 0px 4px;
+ border: 1px solid #889;
+ font-weight: bold;
+ background-color: #fff;
+}
+
+.calendar td.time .ampm {
+ text-align: center;
+}
+
+.calendar td.time .colon {
+ padding: 0px 2px 0px 3px;
+ font-weight: bold;
+}
+
+.calendar td.time span.hilite {
+ border-color: #000;
+ background-color: #667;
+ color: #fff;
+}
+
+.calendar td.time span.active {
+ border-color: #f00;
+ background-color: #000;
+ color: #0f0;
+}
diff --git a/js/jscalendar/calendar-blue2.css b/js/jscalendar/calendar-blue2.css
new file mode 100644
index 0000000..47128ec
--- /dev/null
+++ b/js/jscalendar/calendar-blue2.css
@@ -0,0 +1,236 @@
+/* The main calendar widget. DIV containing a table. */
+
+div.calendar { position: relative; }
+
+.calendar, .calendar table {
+ border: 1px solid #206A9B;
+ font-size: 11px;
+ color: #000;
+ cursor: default;
+ background: #F1F8FC;
+ font-family: tahoma,verdana,sans-serif;
+}
+
+/* Header part -- contains navigation buttons and day names. */
+
+.calendar .button { /* "<<", "<", ">", ">>" buttons have this class */
+ text-align: center; /* They are the navigation buttons */
+ padding: 2px; /* Make the buttons seem like they're pressing */
+}
+
+.calendar .nav {
+ background: #007ED1 url(menuarrow2.gif) no-repeat 100% 100%;
+}
+
+.calendar thead .title { /* This holds the current "month, year" */
+ font-weight: bold; /* Pressing it will take you to the current date */
+ text-align: center;
+ background: #000;
+ color: #fff;
+ padding: 2px;
+}
+
+.calendar thead tr { /* Row <TR> containing navigation buttons */
+ background: #007ED1;
+ color: #fff;
+}
+
+.calendar thead .daynames { /* Row <TR> containing the day names */
+ background: #C7E1F3;
+}
+
+.calendar thead .name { /* Cells <TD> containing the day names */
+ border-bottom: 1px solid #206A9B;
+ padding: 2px;
+ text-align: center;
+ color: #000;
+}
+
+.calendar thead .weekend { /* How a weekend day name shows in header */
+ color: #a66;
+}
+
+.calendar thead .hilite { /* How do the buttons in header appear when hover */
+ background-color: #34ABFA;
+ color: #000;
+ border: 1px solid #016DC5;
+ padding: 1px;
+}
+
+.calendar thead .active { /* Active (pressed) buttons in header */
+ background-color: #006AA9;
+ border: 1px solid #008AFF;
+ padding: 2px 0px 0px 2px;
+}
+
+/* The body part -- contains all the days in month. */
+
+.calendar tbody .day { /* Cells <TD> containing month days dates */
+ width: 2em;
+ color: #456;
+ text-align: right;
+ padding: 2px 4px 2px 2px;
+}
+.calendar tbody .day.othermonth {
+ font-size: 80%;
+ color: #bbb;
+}
+.calendar tbody .day.othermonth.oweekend {
+ color: #fbb;
+}
+
+.calendar table .wn {
+ padding: 2px 3px 2px 2px;
+ border-right: 1px solid #000;
+ background: #C7E1F3;
+}
+
+.calendar tbody .rowhilite td {
+ background: #def;
+}
+
+.calendar tbody .rowhilite td.wn {
+ background: #F1F8FC;
+}
+
+.calendar tbody td.hilite { /* Hovered cells <TD> */
+ background: #def;
+ padding: 1px 3px 1px 1px;
+ border: 1px solid #8FC4E8;
+}
+
+.calendar tbody td.active { /* Active (pressed) cells <TD> */
+ background: #cde;
+ padding: 2px 2px 0px 2px;
+}
+
+.calendar tbody td.selected { /* Cell showing today date */
+ font-weight: bold;
+ border: 1px solid #000;
+ padding: 1px 3px 1px 1px;
+ background: #fff;
+ color: #000;
+}
+
+.calendar tbody td.weekend { /* Cells showing weekend days */
+ color: #a66;
+}
+
+.calendar tbody td.today { /* Cell showing selected date */
+ font-weight: bold;
+ color: #D50000;
+}
+
+.calendar tbody .disabled { color: #999; }
+
+.calendar tbody .emptycell { /* Empty cells (the best is to hide them) */
+ visibility: hidden;
+}
+
+.calendar tbody .emptyrow { /* Empty row (some months need less than 6 rows) */
+ display: none;
+}
+
+/* The footer part -- status bar and "Close" button */
+
+.calendar tfoot .footrow { /* The <TR> in footer (only one right now) */
+ text-align: center;
+ background: #206A9B;
+ color: #fff;
+}
+
+.calendar tfoot .ttip { /* Tooltip (status bar) cell <TD> */
+ background: #000;
+ color: #fff;
+ border-top: 1px solid #206A9B;
+ padding: 1px;
+}
+
+.calendar tfoot .hilite { /* Hover style for buttons in footer */
+ background: #B8DAF0;
+ border: 1px solid #178AEB;
+ color: #000;
+ padding: 1px;
+}
+
+.calendar tfoot .active { /* Active (pressed) style for buttons in footer */
+ background: #006AA9;
+ padding: 2px 0px 0px 2px;
+}
+
+/* Combo boxes (menus that display months/years for direct selection) */
+
+.calendar .combo {
+ position: absolute;
+ display: none;
+ top: 0px;
+ left: 0px;
+ width: 4em;
+ cursor: default;
+ border: 1px solid #655;
+ background: #def;
+ color: #000;
+ font-size: 90%;
+ z-index: 100;
+}
+
+.calendar .combo .label,
+.calendar .combo .label-IEfix {
+ text-align: center;
+ padding: 1px;
+}
+
+.calendar .combo .label-IEfix {
+ width: 4em;
+}
+
+.calendar .combo .hilite {
+ background: #34ABFA;
+ border-top: 1px solid #46a;
+ border-bottom: 1px solid #46a;
+ font-weight: bold;
+}
+
+.calendar .combo .active {
+ border-top: 1px solid #46a;
+ border-bottom: 1px solid #46a;
+ background: #F1F8FC;
+ font-weight: bold;
+}
+
+.calendar td.time {
+ border-top: 1px solid #000;
+ padding: 1px 0px;
+ text-align: center;
+ background-color: #E3F0F9;
+}
+
+.calendar td.time .hour,
+.calendar td.time .minute,
+.calendar td.time .ampm {
+ padding: 0px 3px 0px 4px;
+ border: 1px solid #889;
+ font-weight: bold;
+ background-color: #F1F8FC;
+}
+
+.calendar td.time .ampm {
+ text-align: center;
+}
+
+.calendar td.time .colon {
+ padding: 0px 2px 0px 3px;
+ font-weight: bold;
+}
+
+.calendar td.time span.hilite {
+ border-color: #000;
+ background-color: #267DB7;
+ color: #fff;
+}
+
+.calendar td.time span.active {
+ border-color: red;
+ background-color: #000;
+ color: #A5FF00;
+}
diff --git a/js/jscalendar/calendar-brown.css b/js/jscalendar/calendar-brown.css
new file mode 100644
index 0000000..c42da5e
--- /dev/null
+++ b/js/jscalendar/calendar-brown.css
@@ -0,0 +1,225 @@
+/* The main calendar widget. DIV containing a table. */
+
+div.calendar { position: relative; }
+
+.calendar, .calendar table {
+ border: 1px solid #655;
+ font-size: 11px;
+ color: #000;
+ cursor: default;
+ background: #ffd;
+ font-family: tahoma,verdana,sans-serif;
+}
+
+/* Header part -- contains navigation buttons and day names. */
+
+.calendar .button { /* "<<", "<", ">", ">>" buttons have this class */
+ text-align: center; /* They are the navigation buttons */
+ padding: 2px; /* Make the buttons seem like they're pressing */
+}
+
+.calendar .nav {
+ background: #edc url(menuarrow.gif) no-repeat 100% 100%;
+}
+
+.calendar thead .title { /* This holds the current "month, year" */
+ font-weight: bold; /* Pressing it will take you to the current date */
+ text-align: center;
+ background: #654;
+ color: #fed;
+ padding: 2px;
+}
+
+.calendar thead .headrow { /* Row <TR> containing navigation buttons */
+ background: #edc;
+ color: #000;
+}
+
+.calendar thead .name { /* Cells <TD> containing the day names */
+ border-bottom: 1px solid #655;
+ padding: 2px;
+ text-align: center;
+ color: #000;
+}
+
+.calendar thead .weekend { /* How a weekend day name shows in header */
+ color: #f00;
+}
+
+.calendar thead .hilite { /* How do the buttons in header appear when hover */
+ background-color: #faa;
+ color: #000;
+ border: 1px solid #f40;
+ padding: 1px;
+}
+
+.calendar thead .active { /* Active (pressed) buttons in header */
+ background-color: #c77;
+ padding: 2px 0px 0px 2px;
+}
+
+.calendar thead .daynames { /* Row <TR> containing the day names */
+ background: #fed;
+}
+
+/* The body part -- contains all the days in month. */
+
+.calendar tbody .day { /* Cells <TD> containing month days dates */
+ width: 2em;
+ text-align: right;
+ padding: 2px 4px 2px 2px;
+}
+.calendar tbody .day.othermonth {
+ font-size: 80%;
+ color: #bbb;
+}
+.calendar tbody .day.othermonth.oweekend {
+ color: #fbb;
+}
+
+.calendar table .wn {
+ padding: 2px 3px 2px 2px;
+ border-right: 1px solid #000;
+ background: #fed;
+}
+
+.calendar tbody .rowhilite td {
+ background: #ddf;
+}
+
+.calendar tbody .rowhilite td.wn {
+ background: #efe;
+}
+
+.calendar tbody td.hilite { /* Hovered cells <TD> */
+ background: #ffe;
+ padding: 1px 3px 1px 1px;
+ border: 1px solid #bbb;
+}
+
+.calendar tbody td.active { /* Active (pressed) cells <TD> */
+ background: #ddc;
+ padding: 2px 2px 0px 2px;
+}
+
+.calendar tbody td.selected { /* Cell showing today date */
+ font-weight: bold;
+ border: 1px solid #000;
+ padding: 1px 3px 1px 1px;
+ background: #fea;
+}
+
+.calendar tbody td.weekend { /* Cells showing weekend days */
+ color: #f00;
+}
+
+.calendar tbody td.today { font-weight: bold; }
+
+.calendar tbody .disabled { color: #999; }
+
+.calendar tbody .emptycell { /* Empty cells (the best is to hide them) */
+ visibility: hidden;
+}
+
+.calendar tbody .emptyrow { /* Empty row (some months need less than 6 rows) */
+ display: none;
+}
+
+/* The footer part -- status bar and "Close" button */
+
+.calendar tfoot .footrow { /* The <TR> in footer (only one right now) */
+ text-align: center;
+ background: #988;
+ color: #000;
+}
+
+.calendar tfoot .ttip { /* Tooltip (status bar) cell <TD> */
+ border-top: 1px solid #655;
+ background: #dcb;
+ color: #840;
+}
+
+.calendar tfoot .hilite { /* Hover style for buttons in footer */
+ background: #faa;
+ border: 1px solid #f40;
+ padding: 1px;
+}
+
+.calendar tfoot .active { /* Active (pressed) style for buttons in footer */
+ background: #c77;
+ padding: 2px 0px 0px 2px;
+}
+
+/* Combo boxes (menus that display months/years for direct selection) */
+
+.calendar .combo {
+ position: absolute;
+ display: none;
+ top: 0px;
+ left: 0px;
+ width: 4em;
+ cursor: default;
+ border: 1px solid #655;
+ background: #ffe;
+ color: #000;
+ font-size: 90%;
+ z-index: 100;
+}
+
+.calendar .combo .label,
+.calendar .combo .label-IEfix {
+ text-align: center;
+ padding: 1px;
+}
+
+.calendar .combo .label-IEfix {
+ width: 4em;
+}
+
+.calendar .combo .hilite {
+ background: #fc8;
+}
+
+.calendar .combo .active {
+ border-top: 1px solid #a64;
+ border-bottom: 1px solid #a64;
+ background: #fee;
+ font-weight: bold;
+}
+
+.calendar td.time {
+ border-top: 1px solid #a88;
+ padding: 1px 0px;
+ text-align: center;
+ background-color: #fed;
+}
+
+.calendar td.time .hour,
+.calendar td.time .minute,
+.calendar td.time .ampm {
+ padding: 0px 3px 0px 4px;
+ border: 1px solid #988;
+ font-weight: bold;
+ background-color: #fff;
+}
+
+.calendar td.time .ampm {
+ text-align: center;
+}
+
+.calendar td.time .colon {
+ padding: 0px 2px 0px 3px;
+ font-weight: bold;
+}
+
+.calendar td.time span.hilite {
+ border-color: #000;
+ background-color: #866;
+ color: #fff;
+}
+
+.calendar td.time span.active {
+ border-color: #f00;
+ background-color: #000;
+ color: #0f0;
+}
diff --git a/js/jscalendar/calendar-green.css b/js/jscalendar/calendar-green.css
new file mode 100644
index 0000000..2e1867a
--- /dev/null
+++ b/js/jscalendar/calendar-green.css
@@ -0,0 +1,229 @@
+/* The main calendar widget. DIV containing a table. */
+
+div.calendar { position: relative; }
+
+.calendar, .calendar table {
+ border: 1px solid #565;
+ font-size: 11px;
+ color: #000;
+ cursor: default;
+ background: #efe;
+ font-family: tahoma,verdana,sans-serif;
+}
+
+/* Header part -- contains navigation buttons and day names. */
+
+.calendar .button { /* "<<", "<", ">", ">>" buttons have this class */
+ text-align: center; /* They are the navigation buttons */
+ padding: 2px; /* Make the buttons seem like they're pressing */
+ background: #676;
+ color: #fff;
+ font-size: 90%;
+}
+
+.calendar .nav {
+ background: #676 url(menuarrow.gif) no-repeat 100% 100%;
+}
+
+.calendar thead .title { /* This holds the current "month, year" */
+ font-weight: bold; /* Pressing it will take you to the current date */
+ text-align: center;
+ padding: 2px;
+ background: #250;
+ color: #efa;
+}
+
+.calendar thead .headrow { /* Row <TR> containing navigation buttons */
+}
+
+.calendar thead .name { /* Cells <TD> containing the day names */
+ border-bottom: 1px solid #565;
+ padding: 2px;
+ text-align: center;
+ color: #000;
+}
+
+.calendar thead .weekend { /* How a weekend day name shows in header */
+ color: #a66;
+}
+
+.calendar thead .hilite { /* How do the buttons in header appear when hover */
+ background-color: #afa;
+ color: #000;
+ border: 1px solid #084;
+ padding: 1px;
+}
+
+.calendar thead .active { /* Active (pressed) buttons in header */
+ background-color: #7c7;
+ padding: 2px 0px 0px 2px;
+}
+
+.calendar thead .daynames { /* Row <TR> containing the day names */
+ background: #dfb;
+}
+
+/* The body part -- contains all the days in month. */
+
+.calendar tbody .day { /* Cells <TD> containing month days dates */
+ width: 2em;
+ color: #564;
+ text-align: right;
+ padding: 2px 4px 2px 2px;
+}
+.calendar tbody .day.othermonth {
+ font-size: 80%;
+ color: #bbb;
+}
+.calendar tbody .day.othermonth.oweekend {
+ color: #fbb;
+}
+
+.calendar table .wn {
+ padding: 2px 3px 2px 2px;
+ border-right: 1px solid #8a8;
+ background: #dfb;
+}
+
+.calendar tbody .rowhilite td {
+ background: #dfd;
+}
+
+.calendar tbody .rowhilite td.wn {
+ background: #efe;
+}
+
+.calendar tbody td.hilite { /* Hovered cells <TD> */
+ background: #efd;
+ padding: 1px 3px 1px 1px;
+ border: 1px solid #bbb;
+}
+
+.calendar tbody td.active { /* Active (pressed) cells <TD> */
+ background: #dec;
+ padding: 2px 2px 0px 2px;
+}
+
+.calendar tbody td.selected { /* Cell showing today date */
+ font-weight: bold;
+ border: 1px solid #000;
+ padding: 1px 3px 1px 1px;
+ background: #f8fff8;
+ color: #000;
+}
+
+.calendar tbody td.weekend { /* Cells showing weekend days */
+ color: #a66;
+}
+
+.calendar tbody td.today { font-weight: bold; color: #0a0; }
+
+.calendar tbody .disabled { color: #999; }
+
+.calendar tbody .emptycell { /* Empty cells (the best is to hide them) */
+ visibility: hidden;
+}
+
+.calendar tbody .emptyrow { /* Empty row (some months need less than 6 rows) */
+ display: none;
+}
+
+/* The footer part -- status bar and "Close" button */
+
+.calendar tfoot .footrow { /* The <TR> in footer (only one right now) */
+ text-align: center;
+ background: #565;
+ color: #fff;
+}
+
+.calendar tfoot .ttip { /* Tooltip (status bar) cell <TD> */
+ padding: 2px;
+ background: #250;
+ color: #efa;
+}
+
+.calendar tfoot .hilite { /* Hover style for buttons in footer */
+ background: #afa;
+ border: 1px solid #084;
+ color: #000;
+ padding: 1px;
+}
+
+.calendar tfoot .active { /* Active (pressed) style for buttons in footer */
+ background: #7c7;
+ padding: 2px 0px 0px 2px;
+}
+
+/* Combo boxes (menus that display months/years for direct selection) */
+
+.calendar .combo {
+ position: absolute;
+ display: none;
+ top: 0px;
+ left: 0px;
+ width: 4em;
+ cursor: default;
+ border: 1px solid #565;
+ background: #efd;
+ color: #000;
+ font-size: 90%;
+ z-index: 100;
+}
+
+.calendar .combo .label,
+.calendar .combo .label-IEfix {
+ text-align: center;
+ padding: 1px;
+}
+
+.calendar .combo .label-IEfix {
+ width: 4em;
+}
+
+.calendar .combo .hilite {
+ background: #af8;
+}
+
+.calendar .combo .active {
+ border-top: 1px solid #6a4;
+ border-bottom: 1px solid #6a4;
+ background: #efe;
+ font-weight: bold;
+}
+
+.calendar td.time {
+ border-top: 1px solid #8a8;
+ padding: 1px 0px;
+ text-align: center;
+ background-color: #dfb;
+}
+
+.calendar td.time .hour,
+.calendar td.time .minute,
+.calendar td.time .ampm {
+ padding: 0px 3px 0px 4px;
+ border: 1px solid #898;
+ font-weight: bold;
+ background-color: #fff;
+}
+
+.calendar td.time .ampm {
+ text-align: center;
+}
+
+.calendar td.time .colon {
+ padding: 0px 2px 0px 3px;
+ font-weight: bold;
+}
+
+.calendar td.time span.hilite {
+ border-color: #000;
+ background-color: #686;
+ color: #fff;
+}
+
+.calendar td.time span.active {
+ border-color: #f00;
+ background-color: #000;
+ color: #0f0;
+}
diff --git a/js/jscalendar/calendar-setup.js b/js/jscalendar/calendar-setup.js
new file mode 100644
index 0000000..2519335
--- /dev/null
+++ b/js/jscalendar/calendar-setup.js
@@ -0,0 +1,203 @@
+/* Copyright Mihai Bazon, 2002, 2003 | http://dynarch.com/mishoo/
+ * ---------------------------------------------------------------------------
+ *
+ * The DHTML Calendar
+ *
+ * Details and latest version at:
+ * http://dynarch.com/mishoo/calendar.epl
+ *
+ * This script is distributed under the GNU Lesser General Public License.
+ * Read the entire license text here: http://www.gnu.org/licenses/lgpl.html
+ *
+ * This file defines helper functions for setting up the calendar. They are
+ * intended to help non-programmers get a working calendar on their site
+ * quickly. This script should not be seen as part of the calendar. It just
+ * shows you what one can do with the calendar, while in the same time
+ * providing a quick and simple method for setting it up. If you need
+ * exhaustive customization of the calendar creation process feel free to
+ * modify this code to suit your needs (this is recommended and much better
+ * than modifying calendar.js itself).
+ */
+
+// $Id$
+
+/**
+ * This function "patches" an input field (or other element) to use a calendar
+ * widget for date selection.
+ *
+ * The "params" is a single object that can have the following properties:
+ *
+ * prop. name | description
+ * -------------------------------------------------------------------------------------------------
+ * inputField | the ID of an input field to store the date
+ * displayArea | the ID of a DIV or other element to show the date
+ * button | ID of a button or other element that will trigger the calendar
+ * eventName | event that will trigger the calendar, without the "on" prefix (default: "click")
+ * ifFormat | date format that will be stored in the input field
+ * daFormat | the date format that will be used to display the date in displayArea
+ * singleClick | (true/false) wether the calendar is in single click mode or not (default: true)
+ * firstDay | numeric: 0 to 6. "0" means display Sunday first, "1" means display Monday first, etc.
+ * align | alignment (default: "Br"); if you don't know what's this see the calendar documentation
+ * range | array with 2 elements. Default: [1900, 2999] -- the range of years available
+ * weekNumbers | (true/false) if it's true (default) the calendar will display week numbers
+ * flat | null or element ID; if not null the calendar will be a flat calendar having the parent with the given ID
+ * flatCallback | function that receives a JS Date object and returns an URL to point the browser to (for flat calendar)
+ * disableFunc | function that receives a JS Date object and should return true if that date has to be disabled in the calendar
+ * onSelect | function that gets called when a date is selected. You don't _have_ to supply this (the default is generally okay)
+ * onClose | function that gets called when the calendar is closed. [default]
+ * onUpdate | function that gets called after the date is updated in the input field. Receives a reference to the calendar.
+ * date | the date that the calendar will be initially displayed to
+ * showsTime | default: false; if true the calendar will include a time selector
+ * timeFormat | the time format; can be "12" or "24", default is "12"
+ * electric | if true (default) then given fields/date areas are updated for each move; otherwise they're updated only on close
+ * step | configures the step of the years in drop-down boxes; default: 2
+ * position | configures the calendar absolute position; default: null
+ * cache | if "true" (but default: "false") it will reuse the same calendar object, where possible
+ * showOthers | if "true" (but default: "false") it will show days from other months too
+ *
+ * None of them is required, they all have default values. However, if you
+ * pass none of "inputField", "displayArea" or "button" you'll get a warning
+ * saying "nothing to setup".
+ */
+Calendar.setup = function (params) {
+ function param_default(pname, def) { if (typeof params[pname] == "undefined") { params[pname] = def; } };
+
+ param_default("inputField", null);
+ param_default("displayArea", null);
+ param_default("button", null);
+ param_default("eventName", "click");
+ param_default("ifFormat", "%Y/%m/%d");
+ param_default("daFormat", "%Y/%m/%d");
+ param_default("singleClick", true);
+ param_default("disableFunc", null);
+ param_default("dateStatusFunc", params["disableFunc"]); // takes precedence if both are defined
+ param_default("dateTooltipFunc", null);
+ param_default("dateText", null);
+ param_default("firstDay", null);
+ param_default("align", "Br");
+ param_default("range", [1900, 2999]);
+ param_default("weekNumbers", true);
+ param_default("flat", null);
+ param_default("flatCallback", null);
+ param_default("onSelect", null);
+ param_default("onClose", null);
+ param_default("onUpdate", null);
+ param_default("date", null);
+ param_default("showsTime", false);
+ param_default("timeFormat", "24");
+ param_default("electric", true);
+ param_default("step", 2);
+ param_default("position", null);
+ param_default("cache", false);
+ param_default("showOthers", false);
+ param_default("multiple", null);
+
+ var tmp = ["inputField", "displayArea", "button"];
+ for (var i in tmp) {
+ if (typeof params[tmp[i]] == "string") {
+ params[tmp[i]] = document.getElementById(params[tmp[i]]);
+ }
+ }
+ if (!(params.flat || params.multiple || params.inputField || params.displayArea || params.button)) {
+ alert("Calendar.setup:\n Nothing to setup (no fields found). Please check your code");
+ return false;
+ }
+
+ function onSelect(cal) {
+ var p = cal.params;
+ var update = (cal.dateClicked || p.electric);
+ if (update && p.inputField) {
+ p.inputField.value = cal.date.print(p.ifFormat);
+ if (typeof p.inputField.onchange == "function")
+ p.inputField.onchange();
+ }
+ if (update && p.displayArea)
+ p.displayArea.innerHTML = cal.date.print(p.daFormat);
+ if (update && typeof p.onUpdate == "function")
+ p.onUpdate(cal);
+ if (update && p.flat) {
+ if (typeof p.flatCallback == "function")
+ p.flatCallback(cal);
+ }
+ if (update && p.singleClick && cal.dateClicked)
+ cal.callCloseHandler();
+ };
+
+ if (params.flat != null) {
+ if (typeof params.flat == "string")
+ params.flat = document.getElementById(params.flat);
+ if (!params.flat) {
+ alert("Calendar.setup:\n Flat specified but can't find parent.");
+ return false;
+ }
+ var cal = new Calendar(params.firstDay, params.date, params.onSelect || onSelect);
+ cal.setDateToolTipHandler(params.dateTooltipFunc);
+ cal.showsOtherMonths = params.showOthers;
+ cal.showsTime = params.showsTime;
+ cal.time24 = (params.timeFormat == "24");
+ cal.params = params;
+ cal.weekNumbers = params.weekNumbers;
+ cal.setRange(params.range[0], params.range[1]);
+ cal.setDateStatusHandler(params.dateStatusFunc);
+ cal.getDateText = params.dateText;
+ if (params.ifFormat) {
+ cal.setDateFormat(params.ifFormat);
+ }
+ if (params.inputField && typeof params.inputField.value == "string") {
+ cal.parseDate(params.inputField.value);
+ }
+ cal.create(params.flat);
+ cal.show();
+ return false;
+ }
+
+ var triggerEl = params.button || params.displayArea || params.inputField;
+ triggerEl["on" + params.eventName] = function() {
+ var dateEl = params.inputField || params.displayArea;
+ var dateFmt = params.inputField ? params.ifFormat : params.daFormat;
+ var mustCreate = false;
+ var cal = window.calendar;
+ if (dateEl)
+ params.date = Date.parseDate(dateEl.value || dateEl.innerHTML, dateFmt);
+ if (!(cal && params.cache)) {
+ window.calendar = cal = new Calendar(params.firstDay,
+ params.date,
+ params.onSelect || onSelect,
+ params.onClose || function(cal) { cal.hide(); });
+ cal.setDateToolTipHandler(params.dateTooltipFunc);
+ cal.showsTime = params.showsTime;
+ cal.time24 = (params.timeFormat == "24");
+ cal.weekNumbers = params.weekNumbers;
+ mustCreate = true;
+ } else {
+ if (params.date)
+ cal.setDate(params.date);
+ cal.hide();
+ }
+ if (params.multiple) {
+ cal.multiple = {};
+ for (var i = params.multiple.length; --i >= 0;) {
+ var d = params.multiple[i];
+ var ds = d.print("%Y%m%d");
+ cal.multiple[ds] = d;
+ }
+ }
+ cal.showsOtherMonths = params.showOthers;
+ cal.yearStep = params.step;
+ cal.setRange(params.range[0], params.range[1]);
+ cal.params = params;
+ cal.setDateStatusHandler(params.dateStatusFunc);
+ cal.getDateText = params.dateText;
+ cal.setDateFormat(dateFmt);
+ if (mustCreate)
+ cal.create();
+ cal.refresh();
+ if (!params.position)
+ cal.showAtElement(params.button || params.displayArea || params.inputField, params.align);
+ else
+ cal.showAt(params.position[0], params.position[1]);
+ return false;
+ };
+
+ return cal;
+};
diff --git a/js/jscalendar/calendar-setup_stripped.js b/js/jscalendar/calendar-setup_stripped.js
new file mode 100644
index 0000000..5285df9
--- /dev/null
+++ b/js/jscalendar/calendar-setup_stripped.js
@@ -0,0 +1,22 @@
+/* Copyright Mihai Bazon, 2002, 2003 | http://dynarch.com/mishoo/
+ * ---------------------------------------------------------------------------
+ *
+ * The DHTML Calendar
+ *
+ * Details and latest version at:
+ * http://dynarch.com/mishoo/calendar.epl
+ *
+ * This script is distributed under the GNU Lesser General Public License.
+ * Read the entire license text here: http://www.gnu.org/licenses/lgpl.html
+ *
+ * This file defines helper functions for setting up the calendar. They are
+ * intended to help non-programmers get a working calendar on their site
+ * quickly. This script should not be seen as part of the calendar. It just
+ * shows you what one can do with the calendar, while in the same time
+ * providing a quick and simple method for setting it up. If you need
+ * exhaustive customization of the calendar creation process feel free to
+ * modify this code to suit your needs (this is recommended and much better
+ * than modifying calendar.js itself).
+ */
+ Calendar.setup=function(params){function param_default(pname,def){if(typeof params[pname]=="undefined"){params[pname]=def;}};param_default("inputField",null);param_default("displayArea",null);param_default("button",null);param_default("eventName","click");param_default("ifFormat","%Y-%m-%d");param_default("daFormat","%Y-%m-%d");param_default("singleClick",true);param_default("disableFunc",null);param_default("dateStatusFunc",params["disableFunc"]);param_default("dateText",null);param_default("firstDay",null);param_default("align","Br");param_default("range",[1900,2999]);param_default("weekNumbers",true);param_default("flat",null);param_default("flatCallback",null);param_default("onSelect",null);param_default("onClose",null);param_default("onUpdate",null);param_default("date",null);param_default("showsTime",false);param_default("timeFormat","24");param_default("electric",true);param_default("step",2);param_default("position",null);param_default("cache",false);param_default("showOthers",false);param_default("multiple",null);var tmp=["inputField","displayArea","button"];for(var i in tmp){if(typeof params[tmp[i]]=="string"){params[tmp[i]]=document.getElementById(params[tmp[i]]);}}if(!(params.flat||params.multiple||params.inputField||params.displayArea||params.button)){alert("Calendar.setup:\n Nothing to setup (no fields found). Please check your code");return false;}function onSelect(cal){var p=cal.params;var update=(cal.dateClicked||p.electric);if(update&&p.inputField){p.inputField.value=cal.date.print(p.ifFormat);if(typeof p.inputField.onchange=="function")p.inputField.onchange();}if(update&&p.displayArea)p.displayArea.innerHTML=cal.date.print(p.daFormat);if(update&&typeof p.onUpdate=="function")p.onUpdate(cal);if(update&&p.flat){if(typeof p.flatCallback=="function")p.flatCallback(cal);}if(update&&p.singleClick&&cal.dateClicked)cal.callCloseHandler();};if(params.flat!=null){if(typeof params.flat=="string")params.flat=document.getElementById(params.flat);if(!params.flat){alert("Calendar.setup:\n Flat specified but can't find parent.");return false;}var cal=new Calendar(params.firstDay,params.date,params.onSelect||onSelect);cal.showsOtherMonths=params.showOthers;cal.showsTime=params.showsTime;cal.time24=(params.timeFormat=="24");cal.params=params;cal.weekNumbers=params.weekNumbers;cal.setRange(params.range[0],params.range[1]);cal.setDateStatusHandler(params.dateStatusFunc);cal.getDateText=params.dateText;if(params.ifFormat){cal.setDateFormat(params.ifFormat);}if(params.inputField&&typeof params.inputField.value=="string"){cal.parseDate(params.inputField.value);}cal.create(params.flat);cal.show();return false;}var triggerEl=params.button||params.displayArea||params.inputField;triggerEl["on"+params.eventName]=function(){var dateEl=params.inputField||params.displayArea;var dateFmt=params.inputField?params.ifFormat:params.daFormat;var mustCreate=false;var cal=window.calendar;if(dateEl)params.date=Date.parseDate(dateEl.value||dateEl.innerHTML,dateFmt);if(!(cal&&params.cache)){window.calendar=cal=new Calendar(params.firstDay,params.date,params.onSelect||onSelect,params.onClose||function(cal){cal.hide();});cal.showsTime=params.showsTime;cal.time24=(params.timeFormat=="24");cal.weekNumbers=params.weekNumbers;mustCreate=true;}else{if(params.date)cal.setDate(params.date);cal.hide();}if(params.multiple){cal.multiple={};for(var i=params.multiple.length;--i>=0;){var d=params.multiple[i];var ds=d.print("%Y%m%d");cal.multiple[ds]=d;}}cal.showsOtherMonths=params.showOthers;cal.yearStep=params.step;cal.setRange(params.range[0],params.range[1]);cal.params=params;cal.setDateStatusHandler(params.dateStatusFunc);cal.getDateText=params.dateText;cal.setDateFormat(dateFmt);if(mustCreate)cal.create();cal.refresh();if(!params.position)cal.showAtElement(params.button||params.displayArea||params.inputField,params.align);else cal.showAt(params.position[0],params.position[1]);return false;};return cal;};
+ Calendar._FD = 0; \ No newline at end of file
diff --git a/js/jscalendar/calendar-system.css b/js/jscalendar/calendar-system.css
new file mode 100644
index 0000000..9f18b95
--- /dev/null
+++ b/js/jscalendar/calendar-system.css
@@ -0,0 +1,225 @@
+/* The main calendar widget. DIV containing a table. */
+
+.calendar {
+ position: relative;
+ display: none;
+ border: 1px solid;
+ border-color: #fff #000 #000 #fff;
+ cursor: default;
+ background: Window;
+ color: WindowText;
+}
+
+.calendar table {
+ border: 1px solid #ccc;
+ background: Window;
+ color: WindowText;
+ margin:auto;
+}
+
+/* Header part -- contains navigation buttons and day names. */
+
+.calendar .button { /* "<<", "<", ">", ">>" buttons have this class */
+ text-align: center;
+ border: 1px solid;
+ border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight;
+ background: ButtonFace;
+ display:table-cell;
+ cursor:pointer;
+}
+
+.calendar .nav {
+ background: ButtonFace url(menuarrow.gif) no-repeat 100% 100%;
+}
+
+.calendar thead .title { /* This holds the current "month, year" */
+ font-weight: bold;
+/* background: ActiveCaption;
+ color: CaptionText;
+*/
+ text-align: center;
+}
+
+.calendar thead .headrow { /* Row <TR> containing navigation buttons */
+}
+
+.calendar thead .daynames { /* Row <TR> containing the day names */
+}
+
+.calendar thead .name { /* Cells <TD> containing the day names */
+ border-bottom: 1px solid ButtonShadow;
+ text-align: center;
+ background: ButtonFace;
+ color: ButtonText;
+ cursor:pointer;
+}
+
+.calendar thead .weekend { /* How a weekend day name shows in header */
+ color: #999;
+}
+
+.calendar thead .hilite { /* How do the buttons in header appear when hover */
+ border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight;
+}
+
+.calendar thead .active { /* Active (pressed) buttons in header */
+ border-color: ButtonShadow ButtonHighlight ButtonHighlight ButtonShadow;
+}
+
+/* The body part -- contains all the days in month. */
+
+.calendar tbody .day { /* Cells <TD> containing month days dates */
+ width: 2em;
+ text-align: right;
+ padding: 2px 4px 2px 2px;
+ cursor:pointer;
+}
+.calendar tbody .day.othermonth {
+ font-size: 80%;
+ color: #aaa;
+}
+.calendar tbody .day.othermonth.oweekend {
+ color: #faa;
+}
+
+.calendar table .wn {
+ padding: 2px 3px 2px 2px;
+ border-right: 1px solid ButtonShadow;
+ background: ButtonFace;
+ color: ButtonText;
+}
+
+.calendar tbody .rowhilite td {
+/* think it is a bit annoying
+ background: Highlight;
+ color: HighlightText;
+*/
+}
+
+.calendar tbody td.hilite { /* Hovered cells <TD> */
+}
+
+.calendar tbody td.active { /* Active (pressed) cells <TD> */
+ border-color: ButtonShadow ButtonHighlight ButtonHighlight ButtonShadow;
+}
+
+.calendar tbody td.selected { /* Cell showing selected date */
+ font-weight: bold;
+ border-color: ButtonShadow ButtonHighlight ButtonHighlight ButtonShadow;
+ background: ButtonFace;
+ color: ButtonText;
+}
+
+.calendar tbody td.weekend { /* Cells showing weekend days */
+ color: #666;
+ background-color:#ddd;
+}
+
+.calendar tbody td.today { /* Cell showing today date */
+ font-weight: bold;
+ background-color: #78bf34;
+ color:#000;
+}
+
+.calendar tbody td.disabled { color: GrayText; }
+
+.calendar tbody .emptycell { /* Empty cells (the best is to hide them) */
+ visibility: hidden;
+}
+
+.calendar tbody .emptyrow { /* Empty row (some months need less than 6 rows) */
+ display: none;
+}
+
+/* The footer part -- status bar and "Close" button */
+
+.calendar tfoot .footrow { /* The <TR> in footer (only one right now) */
+}
+
+.calendar tfoot .ttip { /* Tooltip (status bar) cell <TD> */
+ background: ButtonFace;
+ padding: 1px;
+ border: 1px solid;
+ border-color: ButtonShadow ButtonHighlight ButtonHighlight ButtonShadow;
+ color: ButtonText;
+ text-align: center;
+}
+
+.calendar tfoot .hilite { /* Hover style for buttons in footer */
+ background: #e4e0d8;
+}
+
+/* Combo boxes (menus that display months/years for direct selection) */
+
+.calendar .combo {
+ position: absolute;
+ display: none;
+ width: 4em;
+ top: 0px;
+ left: 0px;
+ cursor: default;
+ border: 1px solid;
+ border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight;
+ background: Menu;
+ color: MenuText;
+ font-size: 90%;
+ padding: 1px;
+ z-index: 100;
+}
+
+.calendar .combo .label,
+.calendar .combo .label-IEfix {
+ text-align: center;
+ padding: 1px;
+}
+
+.calendar .combo .label-IEfix {
+ width: 4em;
+}
+
+.calendar .combo .active {
+ padding: 0px;
+ border: 1px solid #000;
+}
+
+.calendar .combo .hilite {
+ background: Highlight;
+ color: HighlightText;
+}
+
+.calendar td.time {
+ border-top: 1px solid ButtonShadow;
+ padding: 1px 0px;
+ text-align: center;
+ background-color: ButtonFace;
+}
+
+.calendar td.time .hour,
+.calendar td.time .minute,
+.calendar td.time .ampm {
+ padding: 0px 3px 0px 4px;
+ border: 1px solid #889;
+ font-weight: bold;
+ background-color: Menu;
+}
+
+.calendar td.time .ampm {
+ text-align: center;
+}
+
+.calendar td.time .colon {
+ padding: 0px 2px 0px 3px;
+ font-weight: bold;
+}
+
+.calendar td.time span.hilite {
+ border-color: #000;
+ background-color: Highlight;
+ color: HighlightText;
+}
+
+.calendar td.time span.active {
+ border-color: #f00;
+ background-color: #000;
+ color: #0f0;
+}
diff --git a/js/jscalendar/calendar-tas.css b/js/jscalendar/calendar-tas.css
new file mode 100644
index 0000000..c2f8721
--- /dev/null
+++ b/js/jscalendar/calendar-tas.css
@@ -0,0 +1,239 @@
+/* The main calendar widget. DIV containing a table. */
+
+div.calendar { position: relative; }
+
+.calendar, .calendar table {
+ border: 1px solid #655;
+ font-size: 11px;
+ color: #000;
+ cursor: default;
+ background: #ffd;
+ font-family: tahoma,verdana,sans-serif;
+ filter:
+progid:DXImageTransform.Microsoft.Gradient(GradientType=0,StartColorStr=#DDDCCC,EndColorStr=#FFFFFF);
+}
+
+/* Header part -- contains navigation buttons and day names. */
+
+.calendar .button { /* "<<", "<", ">", ">>" buttons have this class */
+ text-align: center; /* They are the navigation buttons */
+ padding: 2px; /* Make the buttons seem like they're pressing */
+ color:#363636;
+}
+
+.calendar .nav {
+ background: #edc url(menuarrow.gif) no-repeat 100% 100%;
+}
+
+.calendar thead .title { /* This holds the current "month, year" */
+ font-weight: bold; /* Pressing it will take you to the current date */
+ text-align: center;
+ background: #654;
+ color: #363636;
+ padding: 2px;
+ filter:
+progid:DXImageTransform.Microsoft.Gradient(GradientType=0,StartColorStr=#ffffff,EndColorStr=#dddccc);
+}
+
+.calendar thead .headrow { /* Row <TR> containing navigation buttons */
+ /*background: #3B86A0;*/
+ color: #363636;
+ font-weight: bold;
+filter:
+progid:DXImageTransform.Microsoft.Gradient(GradientType=0,StartColorStr=#ffffff,EndColorStr=#3b86a0);
+}
+
+.calendar thead .name { /* Cells <TD> containing the day names */
+ border-bottom: 1px solid #655;
+ padding: 2px;
+ text-align: center;
+ color: #363636;
+ filter:
+progid:DXImageTransform.Microsoft.Gradient(GradientType=0,StartColorStr=#DDDCCC,EndColorStr=#FFFFFF);
+}
+
+.calendar thead .weekend { /* How a weekend day name shows in header */
+ color: #f00;
+}
+
+.calendar thead .hilite { /* How do the buttons in header appear when hover */
+ background-color: #ffcc86;
+ color: #000;
+ border: 1px solid #b59345;
+ padding: 1px;
+}
+
+.calendar thead .active { /* Active (pressed) buttons in header */
+ background-color: #c77;
+ padding: 2px 0px 0px 2px;
+}
+
+.calendar thead .daynames { /* Row <TR> containing the day names */
+ background: #fed;
+}
+
+/* The body part -- contains all the days in month. */
+
+.calendar tbody .day { /* Cells <TD> containing month days dates */
+ width: 2em;
+ text-align: right;
+ padding: 2px 4px 2px 2px;
+}
+.calendar tbody .day.othermonth {
+ font-size: 80%;
+ color: #aaa;
+}
+.calendar tbody .day.othermonth.oweekend {
+ color: #faa;
+}
+
+.calendar table .wn {
+ padding: 2px 3px 2px 2px;
+ border-right: 1px solid #000;
+ background: #fed;
+}
+
+.calendar tbody .rowhilite td {
+ background: #ddf;
+
+}
+
+.calendar tbody .rowhilite td.wn {
+ background: #efe;
+}
+
+.calendar tbody td.hilite { /* Hovered cells <TD> */
+ background: #ffe;
+ padding: 1px 3px 1px 1px;
+ border: 1px solid #bbb;
+}
+
+.calendar tbody td.active { /* Active (pressed) cells <TD> */
+ background: #ddc;
+ padding: 2px 2px 0px 2px;
+}
+
+.calendar tbody td.selected { /* Cell showing today date */
+ font-weight: bold;
+ border: 1px solid #000;
+ padding: 1px 3px 1px 1px;
+ background: #fea;
+}
+
+.calendar tbody td.weekend { /* Cells showing weekend days */
+ color: #f00;
+}
+
+.calendar tbody td.today { font-weight: bold; }
+
+.calendar tbody .disabled { color: #999; }
+
+.calendar tbody .emptycell { /* Empty cells (the best is to hide them) */
+ visibility: hidden;
+}
+
+.calendar tbody .emptyrow { /* Empty row (some months need less than 6 rows) */
+ display: none;
+}
+
+/* The footer part -- status bar and "Close" button */
+
+.calendar tfoot .footrow { /* The <TR> in footer (only one right now) */
+ text-align: center;
+ background: #988;
+ color: #000;
+
+}
+
+.calendar tfoot .ttip { /* Tooltip (status bar) cell <TD> */
+ border-top: 1px solid #655;
+ background: #dcb;
+ color: #363636;
+ font-weight: bold;
+ filter:
+progid:DXImageTransform.Microsoft.Gradient(GradientType=0,StartColorStr=#FFFFFF,EndColorStr=#DDDCCC);
+}
+.calendar tfoot .hilite { /* Hover style for buttons in footer */
+ background: #faa;
+ border: 1px solid #f40;
+ padding: 1px;
+}
+
+.calendar tfoot .active { /* Active (pressed) style for buttons in footer */
+ background: #c77;
+ padding: 2px 0px 0px 2px;
+}
+
+/* Combo boxes (menus that display months/years for direct selection) */
+
+.combo {
+ position: absolute;
+ display: none;
+ top: 0px;
+ left: 0px;
+ width: 4em;
+ cursor: default;
+ border: 1px solid #655;
+ background: #ffe;
+ color: #000;
+ font-size: smaller;
+ z-index: 100;
+}
+
+.combo .label,
+.combo .label-IEfix {
+ text-align: center;
+ padding: 1px;
+}
+
+.combo .label-IEfix {
+ width: 4em;
+}
+
+.combo .hilite {
+ background: #fc8;
+}
+
+.combo .active {
+ border-top: 1px solid #a64;
+ border-bottom: 1px solid #a64;
+ background: #fee;
+ font-weight: bold;
+}
+
+.calendar td.time {
+ border-top: 1px solid #a88;
+ padding: 1px 0px;
+ text-align: center;
+ background-color: #fed;
+}
+
+.calendar td.time .hour,
+.calendar td.time .minute,
+.calendar td.time .ampm {
+ padding: 0px 3px 0px 4px;
+ border: 1px solid #988;
+ font-weight: bold;
+ background-color: #fff;
+}
+
+.calendar td.time .ampm {
+ text-align: center;
+}
+
+.calendar td.time .colon {
+ padding: 0px 2px 0px 3px;
+ font-weight: bold;
+}
+
+.calendar td.time span.hilite {
+ border-color: #000;
+ background-color: #866;
+ color: #fff;
+}
+
+.calendar td.time span.active {
+ border-color: #f00;
+ background-color: #000;
+ color: #0f0;
+}
diff --git a/js/jscalendar/calendar-win2k-1.css b/js/jscalendar/calendar-win2k-1.css
new file mode 100644
index 0000000..8c5d026
--- /dev/null
+++ b/js/jscalendar/calendar-win2k-1.css
@@ -0,0 +1,271 @@
+/* The main calendar widget. DIV containing a table. */
+
+.calendar {
+ position: relative;
+ display: none;
+ border-top: 2px solid #fff;
+ border-right: 2px solid #000;
+ border-bottom: 2px solid #000;
+ border-left: 2px solid #fff;
+ font-size: 11px;
+ color: #000;
+ cursor: default;
+ background: #d4d0c8;
+ font-family: tahoma,verdana,sans-serif;
+}
+
+.calendar table {
+ border-top: 1px solid #000;
+ border-right: 1px solid #fff;
+ border-bottom: 1px solid #fff;
+ border-left: 1px solid #000;
+ font-size: 11px;
+ color: #000;
+ cursor: default;
+ background: #d4d0c8;
+ font-family: tahoma,verdana,sans-serif;
+}
+
+/* Header part -- contains navigation buttons and day names. */
+
+.calendar .button { /* "<<", "<", ">", ">>" buttons have this class */
+ text-align: center;
+ padding: 1px;
+ border-top: 1px solid #fff;
+ border-right: 1px solid #000;
+ border-bottom: 1px solid #000;
+ border-left: 1px solid #fff;
+}
+
+.calendar .nav {
+ background: transparent url(menuarrow.gif) no-repeat 100% 100%;
+}
+
+.calendar thead .title { /* This holds the current "month, year" */
+ font-weight: bold;
+ padding: 1px;
+ border: 1px solid #000;
+ background: #848078;
+ color: #fff;
+ text-align: center;
+}
+
+.calendar thead .headrow { /* Row <TR> containing navigation buttons */
+}
+
+.calendar thead .daynames { /* Row <TR> containing the day names */
+}
+
+.calendar thead .name { /* Cells <TD> containing the day names */
+ border-bottom: 1px solid #000;
+ padding: 2px;
+ text-align: center;
+ background: #f4f0e8;
+}
+
+.calendar thead .weekend { /* How a weekend day name shows in header */
+ color: #f00;
+}
+
+.calendar thead .hilite { /* How do the buttons in header appear when hover */
+ border-top: 2px solid #fff;
+ border-right: 2px solid #000;
+ border-bottom: 2px solid #000;
+ border-left: 2px solid #fff;
+ padding: 0px;
+ background-color: #e4e0d8;
+}
+
+.calendar thead .active { /* Active (pressed) buttons in header */
+ padding: 2px 0px 0px 2px;
+ border-top: 1px solid #000;
+ border-right: 1px solid #fff;
+ border-bottom: 1px solid #fff;
+ border-left: 1px solid #000;
+ background-color: #c4c0b8;
+}
+
+/* The body part -- contains all the days in month. */
+
+.calendar tbody .day { /* Cells <TD> containing month days dates */
+ width: 2em;
+ text-align: right;
+ padding: 2px 4px 2px 2px;
+}
+.calendar tbody .day.othermonth {
+ font-size: 80%;
+ color: #aaa;
+}
+.calendar tbody .day.othermonth.oweekend {
+ color: #faa;
+}
+
+.calendar table .wn {
+ padding: 2px 3px 2px 2px;
+ border-right: 1px solid #000;
+ background: #f4f0e8;
+}
+
+.calendar tbody .rowhilite td {
+ background: #e4e0d8;
+}
+
+.calendar tbody .rowhilite td.wn {
+ background: #d4d0c8;
+}
+
+.calendar tbody td.hilite { /* Hovered cells <TD> */
+ padding: 1px 3px 1px 1px;
+ border-top: 1px solid #fff;
+ border-right: 1px solid #000;
+ border-bottom: 1px solid #000;
+ border-left: 1px solid #fff;
+}
+
+.calendar tbody td.active { /* Active (pressed) cells <TD> */
+ padding: 2px 2px 0px 2px;
+ border-top: 1px solid #000;
+ border-right: 1px solid #fff;
+ border-bottom: 1px solid #fff;
+ border-left: 1px solid #000;
+}
+
+.calendar tbody td.selected { /* Cell showing selected date */
+ font-weight: bold;
+ border-top: 1px solid #000;
+ border-right: 1px solid #fff;
+ border-bottom: 1px solid #fff;
+ border-left: 1px solid #000;
+ padding: 2px 2px 0px 2px;
+ background: #e4e0d8;
+}
+
+.calendar tbody td.weekend { /* Cells showing weekend days */
+ color: #f00;
+}
+
+.calendar tbody td.today { /* Cell showing today date */
+ font-weight: bold;
+ color: #00f;
+}
+
+.calendar tbody .disabled { color: #999; }
+
+.calendar tbody .emptycell { /* Empty cells (the best is to hide them) */
+ visibility: hidden;
+}
+
+.calendar tbody .emptyrow { /* Empty row (some months need less than 6 rows) */
+ display: none;
+}
+
+/* The footer part -- status bar and "Close" button */
+
+.calendar tfoot .footrow { /* The <TR> in footer (only one right now) */
+}
+
+.calendar tfoot .ttip { /* Tooltip (status bar) cell <TD> */
+ background: #f4f0e8;
+ padding: 1px;
+ border: 1px solid #000;
+ background: #848078;
+ color: #fff;
+ text-align: center;
+}
+
+.calendar tfoot .hilite { /* Hover style for buttons in footer */
+ border-top: 1px solid #fff;
+ border-right: 1px solid #000;
+ border-bottom: 1px solid #000;
+ border-left: 1px solid #fff;
+ padding: 1px;
+ background: #e4e0d8;
+}
+
+.calendar tfoot .active { /* Active (pressed) style for buttons in footer */
+ padding: 2px 0px 0px 2px;
+ border-top: 1px solid #000;
+ border-right: 1px solid #fff;
+ border-bottom: 1px solid #fff;
+ border-left: 1px solid #000;
+}
+
+/* Combo boxes (menus that display months/years for direct selection) */
+
+.calendar .combo {
+ position: absolute;
+ display: none;
+ width: 4em;
+ top: 0px;
+ left: 0px;
+ cursor: default;
+ border-top: 1px solid #fff;
+ border-right: 1px solid #000;
+ border-bottom: 1px solid #000;
+ border-left: 1px solid #fff;
+ background: #e4e0d8;
+ font-size: 90%;
+ padding: 1px;
+ z-index: 100;
+}
+
+.calendar .combo .label,
+.calendar .combo .label-IEfix {
+ text-align: center;
+ padding: 1px;
+}
+
+.calendar .combo .label-IEfix {
+ width: 4em;
+}
+
+.calendar .combo .active {
+ background: #c4c0b8;
+ padding: 0px;
+ border-top: 1px solid #000;
+ border-right: 1px solid #fff;
+ border-bottom: 1px solid #fff;
+ border-left: 1px solid #000;
+}
+
+.calendar .combo .hilite {
+ background: #048;
+ color: #fea;
+}
+
+.calendar td.time {
+ border-top: 1px solid #000;
+ padding: 1px 0px;
+ text-align: center;
+ background-color: #f4f0e8;
+}
+
+.calendar td.time .hour,
+.calendar td.time .minute,
+.calendar td.time .ampm {
+ padding: 0px 3px 0px 4px;
+ border: 1px solid #889;
+ font-weight: bold;
+ background-color: #fff;
+}
+
+.calendar td.time .ampm {
+ text-align: center;
+}
+
+.calendar td.time .colon {
+ padding: 0px 2px 0px 3px;
+ font-weight: bold;
+}
+
+.calendar td.time span.hilite {
+ border-color: #000;
+ background-color: #766;
+ color: #fff;
+}
+
+.calendar td.time span.active {
+ border-color: #f00;
+ background-color: #000;
+ color: #0f0;
+}
diff --git a/js/jscalendar/calendar-win2k-2.css b/js/jscalendar/calendar-win2k-2.css
new file mode 100644
index 0000000..6f37b7d
--- /dev/null
+++ b/js/jscalendar/calendar-win2k-2.css
@@ -0,0 +1,271 @@
+/* The main calendar widget. DIV containing a table. */
+
+.calendar {
+ position: relative;
+ display: none;
+ border-top: 2px solid #fff;
+ border-right: 2px solid #000;
+ border-bottom: 2px solid #000;
+ border-left: 2px solid #fff;
+ font-size: 11px;
+ color: #000;
+ cursor: default;
+ background: #d4c8d0;
+ font-family: tahoma,verdana,sans-serif;
+}
+
+.calendar table {
+ border-top: 1px solid #000;
+ border-right: 1px solid #fff;
+ border-bottom: 1px solid #fff;
+ border-left: 1px solid #000;
+ font-size: 11px;
+ color: #000;
+ cursor: default;
+ background: #d4c8d0;
+ font-family: tahoma,verdana,sans-serif;
+}
+
+/* Header part -- contains navigation buttons and day names. */
+
+.calendar .button { /* "<<", "<", ">", ">>" buttons have this class */
+ text-align: center;
+ padding: 1px;
+ border-top: 1px solid #fff;
+ border-right: 1px solid #000;
+ border-bottom: 1px solid #000;
+ border-left: 1px solid #fff;
+}
+
+.calendar .nav {
+ background: transparent url(menuarrow.gif) no-repeat 100% 100%;
+}
+
+.calendar thead .title { /* This holds the current "month, year" */
+ font-weight: bold;
+ padding: 1px;
+ border: 1px solid #000;
+ background: #847880;
+ color: #fff;
+ text-align: center;
+}
+
+.calendar thead .headrow { /* Row <TR> containing navigation buttons */
+}
+
+.calendar thead .daynames { /* Row <TR> containing the day names */
+}
+
+.calendar thead .name { /* Cells <TD> containing the day names */
+ border-bottom: 1px solid #000;
+ padding: 2px;
+ text-align: center;
+ background: #f4e8f0;
+}
+
+.calendar thead .weekend { /* How a weekend day name shows in header */
+ color: #f00;
+}
+
+.calendar thead .hilite { /* How do the buttons in header appear when hover */
+ border-top: 2px solid #fff;
+ border-right: 2px solid #000;
+ border-bottom: 2px solid #000;
+ border-left: 2px solid #fff;
+ padding: 0px;
+ background-color: #e4d8e0;
+}
+
+.calendar thead .active { /* Active (pressed) buttons in header */
+ padding: 2px 0px 0px 2px;
+ border-top: 1px solid #000;
+ border-right: 1px solid #fff;
+ border-bottom: 1px solid #fff;
+ border-left: 1px solid #000;
+ background-color: #c4b8c0;
+}
+
+/* The body part -- contains all the days in month. */
+
+.calendar tbody .day { /* Cells <TD> containing month days dates */
+ width: 2em;
+ text-align: right;
+ padding: 2px 4px 2px 2px;
+}
+.calendar tbody .day.othermonth {
+ font-size: 80%;
+ color: #aaa;
+}
+.calendar tbody .day.othermonth.oweekend {
+ color: #faa;
+}
+
+.calendar table .wn {
+ padding: 2px 3px 2px 2px;
+ border-right: 1px solid #000;
+ background: #f4e8f0;
+}
+
+.calendar tbody .rowhilite td {
+ background: #e4d8e0;
+}
+
+.calendar tbody .rowhilite td.wn {
+ background: #d4c8d0;
+}
+
+.calendar tbody td.hilite { /* Hovered cells <TD> */
+ padding: 1px 3px 1px 1px;
+ border-top: 1px solid #fff;
+ border-right: 1px solid #000;
+ border-bottom: 1px solid #000;
+ border-left: 1px solid #fff;
+}
+
+.calendar tbody td.active { /* Active (pressed) cells <TD> */
+ padding: 2px 2px 0px 2px;
+ border-top: 1px solid #000;
+ border-right: 1px solid #fff;
+ border-bottom: 1px solid #fff;
+ border-left: 1px solid #000;
+}
+
+.calendar tbody td.selected { /* Cell showing selected date */
+ font-weight: bold;
+ border-top: 1px solid #000;
+ border-right: 1px solid #fff;
+ border-bottom: 1px solid #fff;
+ border-left: 1px solid #000;
+ padding: 2px 2px 0px 2px;
+ background: #e4d8e0;
+}
+
+.calendar tbody td.weekend { /* Cells showing weekend days */
+ color: #f00;
+}
+
+.calendar tbody td.today { /* Cell showing today date */
+ font-weight: bold;
+ color: #00f;
+}
+
+.calendar tbody .disabled { color: #999; }
+
+.calendar tbody .emptycell { /* Empty cells (the best is to hide them) */
+ visibility: hidden;
+}
+
+.calendar tbody .emptyrow { /* Empty row (some months need less than 6 rows) */
+ display: none;
+}
+
+/* The footer part -- status bar and "Close" button */
+
+.calendar tfoot .footrow { /* The <TR> in footer (only one right now) */
+}
+
+.calendar tfoot .ttip { /* Tooltip (status bar) cell <TD> */
+ background: #f4e8f0;
+ padding: 1px;
+ border: 1px solid #000;
+ background: #847880;
+ color: #fff;
+ text-align: center;
+}
+
+.calendar tfoot .hilite { /* Hover style for buttons in footer */
+ border-top: 1px solid #fff;
+ border-right: 1px solid #000;
+ border-bottom: 1px solid #000;
+ border-left: 1px solid #fff;
+ padding: 1px;
+ background: #e4d8e0;
+}
+
+.calendar tfoot .active { /* Active (pressed) style for buttons in footer */
+ padding: 2px 0px 0px 2px;
+ border-top: 1px solid #000;
+ border-right: 1px solid #fff;
+ border-bottom: 1px solid #fff;
+ border-left: 1px solid #000;
+}
+
+/* Combo boxes (menus that display months/years for direct selection) */
+
+.calendar .combo {
+ position: absolute;
+ display: none;
+ width: 4em;
+ top: 0px;
+ left: 0px;
+ cursor: default;
+ border-top: 1px solid #fff;
+ border-right: 1px solid #000;
+ border-bottom: 1px solid #000;
+ border-left: 1px solid #fff;
+ background: #e4d8e0;
+ font-size: 90%;
+ padding: 1px;
+ z-index: 100;
+}
+
+.calendar .combo .label,
+.calendar .combo .label-IEfix {
+ text-align: center;
+ padding: 1px;
+}
+
+.calendar .combo .label-IEfix {
+ width: 4em;
+}
+
+.calendar .combo .active {
+ background: #d4c8d0;
+ padding: 0px;
+ border-top: 1px solid #000;
+ border-right: 1px solid #fff;
+ border-bottom: 1px solid #fff;
+ border-left: 1px solid #000;
+}
+
+.calendar .combo .hilite {
+ background: #408;
+ color: #fea;
+}
+
+.calendar td.time {
+ border-top: 1px solid #000;
+ padding: 1px 0px;
+ text-align: center;
+ background-color: #f4f0e8;
+}
+
+.calendar td.time .hour,
+.calendar td.time .minute,
+.calendar td.time .ampm {
+ padding: 0px 3px 0px 4px;
+ border: 1px solid #889;
+ font-weight: bold;
+ background-color: #fff;
+}
+
+.calendar td.time .ampm {
+ text-align: center;
+}
+
+.calendar td.time .colon {
+ padding: 0px 2px 0px 3px;
+ font-weight: bold;
+}
+
+.calendar td.time span.hilite {
+ border-color: #000;
+ background-color: #766;
+ color: #fff;
+}
+
+.calendar td.time span.active {
+ border-color: #f00;
+ background-color: #000;
+ color: #0f0;
+}
diff --git a/js/jscalendar/calendar-win2k-cold-1.css b/js/jscalendar/calendar-win2k-cold-1.css
new file mode 100644
index 0000000..fa5c093
--- /dev/null
+++ b/js/jscalendar/calendar-win2k-cold-1.css
@@ -0,0 +1,265 @@
+/* The main calendar widget. DIV containing a table. */
+
+.calendar {
+ position: relative;
+ display: none;
+ border-top: 2px solid #fff;
+ border-right: 2px solid #000;
+ border-bottom: 2px solid #000;
+ border-left: 2px solid #fff;
+ font-size: 11px;
+ color: #000;
+ cursor: default;
+ background: #c8d0d4;
+ font-family: tahoma,verdana,sans-serif;
+}
+
+.calendar table {
+ border-top: 1px solid #000;
+ border-right: 1px solid #fff;
+ border-bottom: 1px solid #fff;
+ border-left: 1px solid #000;
+ font-size: 11px;
+ color: #000;
+ cursor: default;
+ background: #c8d0d4;
+ font-family: tahoma,verdana,sans-serif;
+}
+
+/* Header part -- contains navigation buttons and day names. */
+
+.calendar .button { /* "<<", "<", ">", ">>" buttons have this class */
+ text-align: center;
+ padding: 1px;
+ border-top: 1px solid #fff;
+ border-right: 1px solid #000;
+ border-bottom: 1px solid #000;
+ border-left: 1px solid #fff;
+}
+
+.calendar .nav {
+ background: transparent url(menuarrow.gif) no-repeat 100% 100%;
+}
+
+.calendar thead .title { /* This holds the current "month, year" */
+ font-weight: bold;
+ padding: 1px;
+ border: 1px solid #000;
+ background: #788084;
+ color: #fff;
+ text-align: center;
+}
+
+.calendar thead .headrow { /* Row <TR> containing navigation buttons */
+}
+
+.calendar thead .daynames { /* Row <TR> containing the day names */
+}
+
+.calendar thead .name { /* Cells <TD> containing the day names */
+ border-bottom: 1px solid #000;
+ padding: 2px;
+ text-align: center;
+ background: #e8f0f4;
+}
+
+.calendar thead .weekend { /* How a weekend day name shows in header */
+ color: #f00;
+}
+
+.calendar thead .hilite { /* How do the buttons in header appear when hover */
+ border-top: 2px solid #fff;
+ border-right: 2px solid #000;
+ border-bottom: 2px solid #000;
+ border-left: 2px solid #fff;
+ padding: 0px;
+ background-color: #d8e0e4;
+}
+
+.calendar thead .active { /* Active (pressed) buttons in header */
+ padding: 2px 0px 0px 2px;
+ border-top: 1px solid #000;
+ border-right: 1px solid #fff;
+ border-bottom: 1px solid #fff;
+ border-left: 1px solid #000;
+ background-color: #b8c0c4;
+}
+
+/* The body part -- contains all the days in month. */
+
+.calendar tbody .day { /* Cells <TD> containing month days dates */
+ width: 2em;
+ text-align: right;
+ padding: 2px 4px 2px 2px;
+}
+.calendar tbody .day.othermonth {
+ font-size: 80%;
+ color: #aaa;
+}
+.calendar tbody .day.othermonth.oweekend {
+ color: #faa;
+}
+
+.calendar table .wn {
+ padding: 2px 3px 2px 2px;
+ border-right: 1px solid #000;
+ background: #e8f4f0;
+}
+
+.calendar tbody .rowhilite td {
+ background: #d8e4e0;
+}
+
+.calendar tbody .rowhilite td.wn {
+ background: #c8d4d0;
+}
+
+.calendar tbody td.hilite { /* Hovered cells <TD> */
+ padding: 1px 3px 1px 1px;
+ border: 1px solid;
+ border-color: #fff #000 #000 #fff;
+}
+
+.calendar tbody td.active { /* Active (pressed) cells <TD> */
+ padding: 2px 2px 0px 2px;
+ border: 1px solid;
+ border-color: #000 #fff #fff #000;
+}
+
+.calendar tbody td.selected { /* Cell showing selected date */
+ font-weight: bold;
+ padding: 2px 2px 0px 2px;
+ border: 1px solid;
+ border-color: #000 #fff #fff #000;
+ background: #d8e0e4;
+}
+
+.calendar tbody td.weekend { /* Cells showing weekend days */
+ color: #f00;
+}
+
+.calendar tbody td.today { /* Cell showing today date */
+ font-weight: bold;
+ color: #00f;
+}
+
+.calendar tbody .disabled { color: #999; }
+
+.calendar tbody .emptycell { /* Empty cells (the best is to hide them) */
+ visibility: hidden;
+}
+
+.calendar tbody .emptyrow { /* Empty row (some months need less than 6 rows) */
+ display: none;
+}
+
+/* The footer part -- status bar and "Close" button */
+
+.calendar tfoot .footrow { /* The <TR> in footer (only one right now) */
+}
+
+.calendar tfoot .ttip { /* Tooltip (status bar) cell <TD> */
+ background: #e8f0f4;
+ padding: 1px;
+ border: 1px solid #000;
+ background: #788084;
+ color: #fff;
+ text-align: center;
+}
+
+.calendar tfoot .hilite { /* Hover style for buttons in footer */
+ border-top: 1px solid #fff;
+ border-right: 1px solid #000;
+ border-bottom: 1px solid #000;
+ border-left: 1px solid #fff;
+ padding: 1px;
+ background: #d8e0e4;
+}
+
+.calendar tfoot .active { /* Active (pressed) style for buttons in footer */
+ padding: 2px 0px 0px 2px;
+ border-top: 1px solid #000;
+ border-right: 1px solid #fff;
+ border-bottom: 1px solid #fff;
+ border-left: 1px solid #000;
+}
+
+/* Combo boxes (menus that display months/years for direct selection) */
+
+.calendar .combo {
+ position: absolute;
+ display: none;
+ width: 4em;
+ top: 0px;
+ left: 0px;
+ cursor: default;
+ border-top: 1px solid #fff;
+ border-right: 1px solid #000;
+ border-bottom: 1px solid #000;
+ border-left: 1px solid #fff;
+ background: #d8e0e4;
+ font-size: 90%;
+ padding: 1px;
+ z-index: 100;
+}
+
+.calendar .combo .label,
+.calendar .combo .label-IEfix {
+ text-align: center;
+ padding: 1px;
+}
+
+.calendar .combo .label-IEfix {
+ width: 4em;
+}
+
+.calendar .combo .active {
+ background: #c8d0d4;
+ padding: 0px;
+ border-top: 1px solid #000;
+ border-right: 1px solid #fff;
+ border-bottom: 1px solid #fff;
+ border-left: 1px solid #000;
+}
+
+.calendar .combo .hilite {
+ background: #048;
+ color: #aef;
+}
+
+.calendar td.time {
+ border-top: 1px solid #000;
+ padding: 1px 0px;
+ text-align: center;
+ background-color: #e8f0f4;
+}
+
+.calendar td.time .hour,
+.calendar td.time .minute,
+.calendar td.time .ampm {
+ padding: 0px 3px 0px 4px;
+ border: 1px solid #889;
+ font-weight: bold;
+ background-color: #fff;
+}
+
+.calendar td.time .ampm {
+ text-align: center;
+}
+
+.calendar td.time .colon {
+ padding: 0px 2px 0px 3px;
+ font-weight: bold;
+}
+
+.calendar td.time span.hilite {
+ border-color: #000;
+ background-color: #667;
+ color: #fff;
+}
+
+.calendar td.time span.active {
+ border-color: #f00;
+ background-color: #000;
+ color: #0f0;
+}
diff --git a/js/jscalendar/calendar-win2k-cold-2.css b/js/jscalendar/calendar-win2k-cold-2.css
new file mode 100644
index 0000000..8e930c8
--- /dev/null
+++ b/js/jscalendar/calendar-win2k-cold-2.css
@@ -0,0 +1,271 @@
+/* The main calendar widget. DIV containing a table. */
+
+.calendar {
+ position: relative;
+ display: none;
+ border-top: 2px solid #fff;
+ border-right: 2px solid #000;
+ border-bottom: 2px solid #000;
+ border-left: 2px solid #fff;
+ font-size: 11px;
+ color: #000;
+ cursor: default;
+ background: #c8d4d0;
+ font-family: tahoma,verdana,sans-serif;
+}
+
+.calendar table {
+ border-top: 1px solid #000;
+ border-right: 1px solid #fff;
+ border-bottom: 1px solid #fff;
+ border-left: 1px solid #000;
+ font-size: 11px;
+ color: #000;
+ cursor: default;
+ background: #c8d4d0;
+ font-family: tahoma,verdana,sans-serif;
+}
+
+/* Header part -- contains navigation buttons and day names. */
+
+.calendar .button { /* "<<", "<", ">", ">>" buttons have this class */
+ text-align: center;
+ padding: 1px;
+ border-top: 1px solid #fff;
+ border-right: 1px solid #000;
+ border-bottom: 1px solid #000;
+ border-left: 1px solid #fff;
+}
+
+.calendar .nav {
+ background: transparent url(menuarrow.gif) no-repeat 100% 100%;
+}
+
+.calendar thead .title { /* This holds the current "month, year" */
+ font-weight: bold;
+ padding: 1px;
+ border: 1px solid #000;
+ background: #788480;
+ color: #fff;
+ text-align: center;
+}
+
+.calendar thead .headrow { /* Row <TR> containing navigation buttons */
+}
+
+.calendar thead .daynames { /* Row <TR> containing the day names */
+}
+
+.calendar thead .name { /* Cells <TD> containing the day names */
+ border-bottom: 1px solid #000;
+ padding: 2px;
+ text-align: center;
+ background: #e8f4f0;
+}
+
+.calendar thead .weekend { /* How a weekend day name shows in header */
+ color: #f00;
+}
+
+.calendar thead .hilite { /* How do the buttons in header appear when hover */
+ border-top: 2px solid #fff;
+ border-right: 2px solid #000;
+ border-bottom: 2px solid #000;
+ border-left: 2px solid #fff;
+ padding: 0px;
+ background-color: #d8e4e0;
+}
+
+.calendar thead .active { /* Active (pressed) buttons in header */
+ padding: 2px 0px 0px 2px;
+ border-top: 1px solid #000;
+ border-right: 1px solid #fff;
+ border-bottom: 1px solid #fff;
+ border-left: 1px solid #000;
+ background-color: #b8c4c0;
+}
+
+/* The body part -- contains all the days in month. */
+
+.calendar tbody .day { /* Cells <TD> containing month days dates */
+ width: 2em;
+ text-align: right;
+ padding: 2px 4px 2px 2px;
+}
+.calendar tbody .day.othermonth {
+ font-size: 80%;
+ color: #aaa;
+}
+.calendar tbody .day.othermonth.oweekend {
+ color: #faa;
+}
+
+.calendar table .wn {
+ padding: 2px 3px 2px 2px;
+ border-right: 1px solid #000;
+ background: #e8f4f0;
+}
+
+.calendar tbody .rowhilite td {
+ background: #d8e4e0;
+}
+
+.calendar tbody .rowhilite td.wn {
+ background: #c8d4d0;
+}
+
+.calendar tbody td.hilite { /* Hovered cells <TD> */
+ padding: 1px 3px 1px 1px;
+ border-top: 1px solid #fff;
+ border-right: 1px solid #000;
+ border-bottom: 1px solid #000;
+ border-left: 1px solid #fff;
+}
+
+.calendar tbody td.active { /* Active (pressed) cells <TD> */
+ padding: 2px 2px 0px 2px;
+ border-top: 1px solid #000;
+ border-right: 1px solid #fff;
+ border-bottom: 1px solid #fff;
+ border-left: 1px solid #000;
+}
+
+.calendar tbody td.selected { /* Cell showing selected date */
+ font-weight: bold;
+ border-top: 1px solid #000;
+ border-right: 1px solid #fff;
+ border-bottom: 1px solid #fff;
+ border-left: 1px solid #000;
+ padding: 2px 2px 0px 2px;
+ background: #d8e4e0;
+}
+
+.calendar tbody td.weekend { /* Cells showing weekend days */
+ color: #f00;
+}
+
+.calendar tbody td.today { /* Cell showing today date */
+ font-weight: bold;
+ color: #00f;
+}
+
+.calendar tbody .disabled { color: #999; }
+
+.calendar tbody .emptycell { /* Empty cells (the best is to hide them) */
+ visibility: hidden;
+}
+
+.calendar tbody .emptyrow { /* Empty row (some months need less than 6 rows) */
+ display: none;
+}
+
+/* The footer part -- status bar and "Close" button */
+
+.calendar tfoot .footrow { /* The <TR> in footer (only one right now) */
+}
+
+.calendar tfoot .ttip { /* Tooltip (status bar) cell <TD> */
+ background: #e8f4f0;
+ padding: 1px;
+ border: 1px solid #000;
+ background: #788480;
+ color: #fff;
+ text-align: center;
+}
+
+.calendar tfoot .hilite { /* Hover style for buttons in footer */
+ border-top: 1px solid #fff;
+ border-right: 1px solid #000;
+ border-bottom: 1px solid #000;
+ border-left: 1px solid #fff;
+ padding: 1px;
+ background: #d8e4e0;
+}
+
+.calendar tfoot .active { /* Active (pressed) style for buttons in footer */
+ padding: 2px 0px 0px 2px;
+ border-top: 1px solid #000;
+ border-right: 1px solid #fff;
+ border-bottom: 1px solid #fff;
+ border-left: 1px solid #000;
+}
+
+/* Combo boxes (menus that display months/years for direct selection) */
+
+.calendar .combo {
+ position: absolute;
+ display: none;
+ width: 4em;
+ top: 0px;
+ left: 0px;
+ cursor: default;
+ border-top: 1px solid #fff;
+ border-right: 1px solid #000;
+ border-bottom: 1px solid #000;
+ border-left: 1px solid #fff;
+ background: #d8e4e0;
+ font-size: 90%;
+ padding: 1px;
+ z-index: 100;
+}
+
+.calendar .combo .label,
+.calendar .combo .label-IEfix {
+ text-align: center;
+ padding: 1px;
+}
+
+.calendar .combo .label-IEfix {
+ width: 4em;
+}
+
+.calendar .combo .active {
+ background: #c8d4d0;
+ padding: 0px;
+ border-top: 1px solid #000;
+ border-right: 1px solid #fff;
+ border-bottom: 1px solid #fff;
+ border-left: 1px solid #000;
+}
+
+.calendar .combo .hilite {
+ background: #048;
+ color: #aef;
+}
+
+.calendar td.time {
+ border-top: 1px solid #000;
+ padding: 1px 0px;
+ text-align: center;
+ background-color: #e8f0f4;
+}
+
+.calendar td.time .hour,
+.calendar td.time .minute,
+.calendar td.time .ampm {
+ padding: 0px 3px 0px 4px;
+ border: 1px solid #889;
+ font-weight: bold;
+ background-color: #fff;
+}
+
+.calendar td.time .ampm {
+ text-align: center;
+}
+
+.calendar td.time .colon {
+ padding: 0px 2px 0px 3px;
+ font-weight: bold;
+}
+
+.calendar td.time span.hilite {
+ border-color: #000;
+ background-color: #667;
+ color: #fff;
+}
+
+.calendar td.time span.active {
+ border-color: #f00;
+ background-color: #000;
+ color: #0f0;
+}
diff --git a/js/jscalendar/calendar.js b/js/jscalendar/calendar.js
new file mode 100644
index 0000000..27f253a
--- /dev/null
+++ b/js/jscalendar/calendar.js
@@ -0,0 +1,1807 @@
+/* Copyright Mihai Bazon, 2002-2005 | www.bazon.net/mishoo
+ * -----------------------------------------------------------
+ *
+ * The DHTML Calendar, version 1.0 "It is happening again"
+ *
+ * Details and latest version at:
+ * www.dynarch.com/projects/calendar
+ *
+ * This script is developed by Dynarch.com. Visit us at www.dynarch.com.
+ *
+ * This script is distributed under the GNU Lesser General Public License.
+ * Read the entire license text here: http://www.gnu.org/licenses/lgpl.html
+ */
+
+// $Id$
+
+/** The Calendar object constructor. */
+Calendar = function (firstDayOfWeek, dateStr, onSelected, onClose) {
+ // member variables
+ this.activeDiv = null;
+ this.currentDateEl = null;
+ this.getDateStatus = null;
+ this.getDateToolTip = null;
+ this.getDateText = null;
+ this.timeout = null;
+ this.onSelected = onSelected || null;
+ this.onClose = onClose || null;
+ this.dragging = false;
+ this.hidden = false;
+ this.minYear = 1970;
+ this.maxYear = 2050;
+ this.dateFormat = Calendar._TT["DEF_DATE_FORMAT"];
+ this.ttDateFormat = Calendar._TT["TT_DATE_FORMAT"];
+ this.isPopup = true;
+ this.weekNumbers = true;
+ this.firstDayOfWeek = typeof firstDayOfWeek == "number" ? firstDayOfWeek : Calendar._FD; // 0 for Sunday, 1 for Monday, etc.
+ this.showsOtherMonths = false;
+ this.dateStr = dateStr;
+ this.ar_days = null;
+ this.showsTime = false;
+ this.time24 = true;
+ this.yearStep = 2;
+ this.hiliteToday = true;
+ this.multiple = null;
+ // HTML elements
+ this.table = null;
+ this.element = null;
+ this.tbody = null;
+ this.firstdayname = null;
+ // Combo boxes
+ this.monthsCombo = null;
+ this.yearsCombo = null;
+ this.hilitedMonth = null;
+ this.activeMonth = null;
+ this.hilitedYear = null;
+ this.activeYear = null;
+ // Information
+ this.dateClicked = false;
+
+ // one-time initializations
+ if (typeof Calendar._SDN == "undefined") {
+ // table of short day names
+ if (typeof Calendar._SDN_len == "undefined")
+ Calendar._SDN_len = 3;
+ var ar = new Array();
+ for (var i = 8; i > 0;) {
+ ar[--i] = Calendar._DN[i].substr(0, Calendar._SDN_len);
+ }
+ Calendar._SDN = ar;
+ // table of short month names
+ if (typeof Calendar._SMN_len == "undefined")
+ Calendar._SMN_len = 3;
+ ar = new Array();
+ for (var i = 12; i > 0;) {
+ ar[--i] = Calendar._MN[i].substr(0, Calendar._SMN_len);
+ }
+ Calendar._SMN = ar;
+ }
+};
+
+// ** constants
+
+/// "static", needed for event handlers.
+Calendar._C = null;
+
+/// detect a special case of "web browser"
+Calendar.is_ie = ( /msie/i.test(navigator.userAgent) &&
+ !/opera/i.test(navigator.userAgent) );
+
+Calendar.is_ie5 = ( Calendar.is_ie && /msie 5\.0/i.test(navigator.userAgent) );
+
+/// detect Opera browser
+Calendar.is_opera = /opera/i.test(navigator.userAgent);
+
+/// detect KHTML-based browsers
+Calendar.is_khtml = /Konqueror|Safari|KHTML/i.test(navigator.userAgent);
+
+// BEGIN: UTILITY FUNCTIONS; beware that these might be moved into a separate
+// library, at some point.
+
+Calendar.getAbsolutePos = function(el) {
+ var SL = 0, ST = 0;
+ var is_div = /^div$/i.test(el.tagName);
+ if (is_div && el.scrollLeft)
+ SL = el.scrollLeft;
+ if (is_div && el.scrollTop)
+ ST = el.scrollTop;
+ var r = { x: el.offsetLeft - SL, y: el.offsetTop - ST };
+ if (el.offsetParent) {
+ var tmp = this.getAbsolutePos(el.offsetParent);
+ r.x += tmp.x;
+ r.y += tmp.y;
+ }
+ return r;
+};
+
+Calendar.isRelated = function (el, evt) {
+ var related = evt.relatedTarget;
+ if (!related) {
+ var type = evt.type;
+ if (type == "mouseover") {
+ related = evt.fromElement;
+ } else if (type == "mouseout") {
+ related = evt.toElement;
+ }
+ }
+ while (related) {
+ if (related == el) {
+ return true;
+ }
+ related = related.parentNode;
+ }
+ return false;
+};
+
+Calendar.removeClass = function(el, className) {
+ if (!(el && el.className)) {
+ return;
+ }
+ var cls = el.className.split(" ");
+ var ar = new Array();
+ for (var i = cls.length; i > 0;) {
+ if (cls[--i] != className) {
+ ar[ar.length] = cls[i];
+ }
+ }
+ el.className = ar.join(" ");
+};
+
+Calendar.addClass = function(el, className) {
+ Calendar.removeClass(el, className);
+ el.className += " " + className;
+};
+
+// FIXME: the following 2 functions totally suck, are useless and should be replaced immediately.
+Calendar.getElement = function(ev) {
+ var f = Calendar.is_ie ? window.event.srcElement : ev.currentTarget;
+ while (f.nodeType != 1 || /^div$/i.test(f.tagName))
+ f = f.parentNode;
+ return f;
+};
+
+Calendar.getTargetElement = function(ev) {
+ var f = Calendar.is_ie ? window.event.srcElement : ev.target;
+ while (f.nodeType != 1)
+ f = f.parentNode;
+ return f;
+};
+
+Calendar.stopEvent = function(ev) {
+ ev || (ev = window.event);
+ if (Calendar.is_ie) {
+ ev.cancelBubble = true;
+ ev.returnValue = false;
+ } else {
+ ev.preventDefault();
+ ev.stopPropagation();
+ }
+ return false;
+};
+
+Calendar.addEvent = function(el, evname, func) {
+ if (el.attachEvent) { // IE
+ el.attachEvent("on" + evname, func);
+ } else if (el.addEventListener) { // Gecko / W3C
+ el.addEventListener(evname, func, true);
+ } else {
+ el["on" + evname] = func;
+ }
+};
+
+Calendar.removeEvent = function(el, evname, func) {
+ if (el.detachEvent) { // IE
+ el.detachEvent("on" + evname, func);
+ } else if (el.removeEventListener) { // Gecko / W3C
+ el.removeEventListener(evname, func, true);
+ } else {
+ el["on" + evname] = null;
+ }
+};
+
+Calendar.createElement = function(type, parent) {
+ var el = null;
+ if (document.createElementNS) {
+ // use the XHTML namespace; IE won't normally get here unless
+ // _they_ "fix" the DOM2 implementation.
+ el = document.createElementNS("http://www.w3.org/1999/xhtml", type);
+ } else {
+ el = document.createElement(type);
+ }
+ if (typeof parent != "undefined") {
+ parent.appendChild(el);
+ }
+ return el;
+};
+
+// END: UTILITY FUNCTIONS
+
+// BEGIN: CALENDAR STATIC FUNCTIONS
+
+/** Internal -- adds a set of events to make some element behave like a button. */
+Calendar._add_evs = function(el) {
+ with (Calendar) {
+ addEvent(el, "mouseover", dayMouseOver);
+ addEvent(el, "mousedown", dayMouseDown);
+ addEvent(el, "mouseout", dayMouseOut);
+ if (is_ie) {
+ addEvent(el, "dblclick", dayMouseDblClick);
+ el.setAttribute("unselectable", true);
+ }
+ }
+};
+
+Calendar.findMonth = function(el) {
+ if (typeof el.month != "undefined") {
+ return el;
+ } else if (typeof el.parentNode.month != "undefined") {
+ return el.parentNode;
+ }
+ return null;
+};
+
+Calendar.findYear = function(el) {
+ if (typeof el.year != "undefined") {
+ return el;
+ } else if (typeof el.parentNode.year != "undefined") {
+ return el.parentNode;
+ }
+ return null;
+};
+
+Calendar.showMonthsCombo = function () {
+ var cal = Calendar._C;
+ if (!cal) {
+ return false;
+ }
+ var cal = cal;
+ var cd = cal.activeDiv;
+ var mc = cal.monthsCombo;
+ if (cal.hilitedMonth) {
+ Calendar.removeClass(cal.hilitedMonth, "hilite");
+ }
+ if (cal.activeMonth) {
+ Calendar.removeClass(cal.activeMonth, "active");
+ }
+ var mon = cal.monthsCombo.getElementsByTagName("div")[cal.date.getMonth()];
+ Calendar.addClass(mon, "active");
+ cal.activeMonth = mon;
+ var s = mc.style;
+ s.display = "block";
+ if (cd.navtype < 0)
+ s.left = cd.offsetLeft + "px";
+ else {
+ var mcw = mc.offsetWidth;
+ if (typeof mcw == "undefined")
+ // Konqueror brain-dead techniques
+ mcw = 50;
+ s.left = (cd.offsetLeft + cd.offsetWidth - mcw) + "px";
+ }
+ s.top = (cd.offsetTop + cd.offsetHeight) + "px";
+};
+
+Calendar.showYearsCombo = function (fwd) {
+ var cal = Calendar._C;
+ if (!cal) {
+ return false;
+ }
+ var cal = cal;
+ var cd = cal.activeDiv;
+ var yc = cal.yearsCombo;
+ if (cal.hilitedYear) {
+ Calendar.removeClass(cal.hilitedYear, "hilite");
+ }
+ if (cal.activeYear) {
+ Calendar.removeClass(cal.activeYear, "active");
+ }
+ cal.activeYear = null;
+ var Y = cal.date.getFullYear() + (fwd ? 1 : -1);
+ var yr = yc.firstChild;
+ var show = false;
+ for (var i = 12; i > 0; --i) {
+ if (Y >= cal.minYear && Y <= cal.maxYear) {
+ yr.innerHTML = Y;
+ yr.year = Y;
+ yr.style.display = "block";
+ show = true;
+ } else {
+ yr.style.display = "none";
+ }
+ yr = yr.nextSibling;
+ Y += fwd ? cal.yearStep : -cal.yearStep;
+ }
+ if (show) {
+ var s = yc.style;
+ s.display = "block";
+ if (cd.navtype < 0)
+ s.left = cd.offsetLeft + "px";
+ else {
+ var ycw = yc.offsetWidth;
+ if (typeof ycw == "undefined")
+ // Konqueror brain-dead techniques
+ ycw = 50;
+ s.left = (cd.offsetLeft + cd.offsetWidth - ycw) + "px";
+ }
+ s.top = (cd.offsetTop + cd.offsetHeight) + "px";
+ }
+};
+
+// event handlers
+
+Calendar.tableMouseUp = function(ev) {
+ var cal = Calendar._C;
+ if (!cal) {
+ return false;
+ }
+ if (cal.timeout) {
+ clearTimeout(cal.timeout);
+ }
+ var el = cal.activeDiv;
+ if (!el) {
+ return false;
+ }
+ var target = Calendar.getTargetElement(ev);
+ ev || (ev = window.event);
+ Calendar.removeClass(el, "active");
+ if (target == el || target.parentNode == el) {
+ Calendar.cellClick(el, ev);
+ }
+ var mon = Calendar.findMonth(target);
+ var date = null;
+ if (mon) {
+ date = new Date(cal.date);
+ if (mon.month != date.getMonth()) {
+ date.setMonth(mon.month);
+ cal.setDate(date);
+ cal.dateClicked = false;
+ cal.callHandler();
+ }
+ } else {
+ var year = Calendar.findYear(target);
+ if (year) {
+ date = new Date(cal.date);
+ if (year.year != date.getFullYear()) {
+ date.setFullYear(year.year);
+ cal.setDate(date);
+ cal.dateClicked = false;
+ cal.callHandler();
+ }
+ }
+ }
+ with (Calendar) {
+ removeEvent(document, "mouseup", tableMouseUp);
+ removeEvent(document, "mouseover", tableMouseOver);
+ removeEvent(document, "mousemove", tableMouseOver);
+ cal._hideCombos();
+ _C = null;
+ return stopEvent(ev);
+ }
+};
+
+Calendar.tableMouseOver = function (ev) {
+ var cal = Calendar._C;
+ if (!cal) {
+ return;
+ }
+ var el = cal.activeDiv;
+ var target = Calendar.getTargetElement(ev);
+ if (target == el || target.parentNode == el) {
+ Calendar.addClass(el, "hilite active");
+ Calendar.addClass(el.parentNode, "rowhilite");
+ } else {
+ if (typeof el.navtype == "undefined" || (el.navtype != 50 && (el.navtype == 0 || Math.abs(el.navtype) > 2)))
+ Calendar.removeClass(el, "active");
+ Calendar.removeClass(el, "hilite");
+ Calendar.removeClass(el.parentNode, "rowhilite");
+ }
+ ev || (ev = window.event);
+ if (el.navtype == 50 && target != el) {
+ var pos = Calendar.getAbsolutePos(el);
+ var w = el.offsetWidth;
+ var x = ev.clientX;
+ var dx;
+ var decrease = true;
+ if (x > pos.x + w) {
+ dx = x - pos.x - w;
+ decrease = false;
+ } else
+ dx = pos.x - x;
+
+ if (dx < 0) dx = 0;
+ var range = el._range;
+ var current = el._current;
+ var count = Math.floor(dx / 10) % range.length;
+ for (var i = range.length; --i >= 0;)
+ if (range[i] == current)
+ break;
+ while (count-- > 0)
+ if (decrease) {
+ if (--i < 0)
+ i = range.length - 1;
+ } else if ( ++i >= range.length )
+ i = 0;
+ var newval = range[i];
+ el.innerHTML = newval;
+
+ cal.onUpdateTime();
+ }
+ var mon = Calendar.findMonth(target);
+ if (mon) {
+ if (mon.month != cal.date.getMonth()) {
+ if (cal.hilitedMonth) {
+ Calendar.removeClass(cal.hilitedMonth, "hilite");
+ }
+ Calendar.addClass(mon, "hilite");
+ cal.hilitedMonth = mon;
+ } else if (cal.hilitedMonth) {
+ Calendar.removeClass(cal.hilitedMonth, "hilite");
+ }
+ } else {
+ if (cal.hilitedMonth) {
+ Calendar.removeClass(cal.hilitedMonth, "hilite");
+ }
+ var year = Calendar.findYear(target);
+ if (year) {
+ if (year.year != cal.date.getFullYear()) {
+ if (cal.hilitedYear) {
+ Calendar.removeClass(cal.hilitedYear, "hilite");
+ }
+ Calendar.addClass(year, "hilite");
+ cal.hilitedYear = year;
+ } else if (cal.hilitedYear) {
+ Calendar.removeClass(cal.hilitedYear, "hilite");
+ }
+ } else if (cal.hilitedYear) {
+ Calendar.removeClass(cal.hilitedYear, "hilite");
+ }
+ }
+ return Calendar.stopEvent(ev);
+};
+
+Calendar.tableMouseDown = function (ev) {
+ if (Calendar.getTargetElement(ev) == Calendar.getElement(ev)) {
+ return Calendar.stopEvent(ev);
+ }
+};
+
+Calendar.calDragIt = function (ev) {
+ var cal = Calendar._C;
+ if (!(cal && cal.dragging)) {
+ return false;
+ }
+ var posX;
+ var posY;
+ if (Calendar.is_ie) {
+ posY = window.event.clientY + document.body.scrollTop;
+ posX = window.event.clientX + document.body.scrollLeft;
+ } else {
+ posX = ev.pageX;
+ posY = ev.pageY;
+ }
+ cal.hideShowCovered();
+ var st = cal.element.style;
+ st.left = (posX - cal.xOffs) + "px";
+ st.top = (posY - cal.yOffs) + "px";
+ return Calendar.stopEvent(ev);
+};
+
+Calendar.calDragEnd = function (ev) {
+ var cal = Calendar._C;
+ if (!cal) {
+ return false;
+ }
+ cal.dragging = false;
+ with (Calendar) {
+ removeEvent(document, "mousemove", calDragIt);
+ removeEvent(document, "mouseup", calDragEnd);
+ tableMouseUp(ev);
+ }
+ cal.hideShowCovered();
+};
+
+Calendar.dayMouseDown = function(ev) {
+ var el = Calendar.getElement(ev);
+ if (el.disabled) {
+ return false;
+ }
+ var cal = el.calendar;
+ cal.activeDiv = el;
+ Calendar._C = cal;
+ if (el.navtype != 300) with (Calendar) {
+ if (el.navtype == 50) {
+ el._current = el.innerHTML;
+ addEvent(document, "mousemove", tableMouseOver);
+ } else
+ addEvent(document, Calendar.is_ie5 ? "mousemove" : "mouseover", tableMouseOver);
+ addClass(el, "hilite active");
+ addEvent(document, "mouseup", tableMouseUp);
+ } else if (cal.isPopup) {
+ cal._dragStart(ev);
+ }
+ if (el.navtype == -1 || el.navtype == 1) {
+ if (cal.timeout) clearTimeout(cal.timeout);
+ cal.timeout = setTimeout("Calendar.showMonthsCombo()", 250);
+ } else if (el.navtype == -2 || el.navtype == 2) {
+ if (cal.timeout) clearTimeout(cal.timeout);
+ cal.timeout = setTimeout((el.navtype > 0) ? "Calendar.showYearsCombo(true)" : "Calendar.showYearsCombo(false)", 250);
+ } else {
+ cal.timeout = null;
+ }
+ return Calendar.stopEvent(ev);
+};
+
+Calendar.dayMouseDblClick = function(ev) {
+ Calendar.cellClick(Calendar.getElement(ev), ev || window.event);
+ if (Calendar.is_ie) {
+ document.selection.empty();
+ }
+};
+
+Calendar.dayMouseOver = function(ev) {
+ var el = Calendar.getElement(ev);
+ if (Calendar.isRelated(el, ev) || Calendar._C || el.disabled) {
+ return false;
+ }
+ if (el.ttip) {
+ if (el.ttip.substr(0, 1) == "_") {
+ el.ttip = el.caldate.print(el.calendar.ttDateFormat) + el.ttip.substr(1);
+ }
+ el.calendar.tooltips.innerHTML = el.ttip;
+ }
+ if (el.navtype != 300) {
+ Calendar.addClass(el, "hilite");
+ if (el.caldate) {
+ Calendar.addClass(el.parentNode, "rowhilite");
+ var cal = el.calendar;
+ if (cal && cal.getDateToolTip) {
+ var d = el.caldate;
+ window.status = d;
+ el.title = cal.getDateToolTip(d, d.getFullYear(), d.getMonth(), d.getDate());
+ }
+ }
+ }
+ return Calendar.stopEvent(ev);
+};
+
+Calendar.dayMouseOut = function(ev) {
+ with (Calendar) {
+ var el = getElement(ev);
+ if (isRelated(el, ev) || _C || el.disabled)
+ return false;
+ removeClass(el, "hilite");
+ if (el.caldate)
+ removeClass(el.parentNode, "rowhilite");
+ if (el.calendar)
+ el.calendar.tooltips.innerHTML = _TT["SEL_DATE"];
+ // return stopEvent(ev);
+ }
+};
+
+/**
+ * A generic "click" handler :) handles all types of buttons defined in this
+ * calendar.
+ */
+Calendar.cellClick = function(el, ev) {
+ var cal = el.calendar;
+ var closing = false;
+ var newdate = false;
+ var date = null;
+ if (typeof el.navtype == "undefined") {
+ if (cal.currentDateEl) {
+ Calendar.removeClass(cal.currentDateEl, "selected");
+ Calendar.addClass(el, "selected");
+ closing = (cal.currentDateEl == el);
+ if (!closing) {
+ cal.currentDateEl = el;
+ }
+ }
+ cal.date.setDateOnly(el.caldate);
+ date = cal.date;
+ var other_month = !(cal.dateClicked = !el.otherMonth);
+ if (!other_month && !cal.currentDateEl && cal.multiple)
+ cal._toggleMultipleDate(new Date(date));
+ else
+ newdate = !el.disabled;
+ // a date was clicked
+ if (other_month)
+ cal._init(cal.firstDayOfWeek, date);
+ } else {
+ if (el.navtype == 200) {
+ Calendar.removeClass(el, "hilite");
+ cal.callCloseHandler();
+ return;
+ }
+ date = new Date(cal.date);
+ if (el.navtype == 0)
+ date.setDateOnly(new Date()); // TODAY
+ // unless "today" was clicked, we assume no date was clicked so
+ // the selected handler will know not to close the calenar when
+ // in single-click mode.
+ // cal.dateClicked = (el.navtype == 0);
+ cal.dateClicked = false;
+ var year = date.getFullYear();
+ var mon = date.getMonth();
+ function setMonth(m) {
+ var day = date.getDate();
+ var max = date.getMonthDays(m);
+ if (day > max) {
+ date.setDate(max);
+ }
+ date.setMonth(m);
+ };
+ switch (el.navtype) {
+ case 400:
+ Calendar.removeClass(el, "hilite");
+ var text = Calendar._TT["ABOUT"];
+ if (typeof text != "undefined") {
+ text += cal.showsTime ? Calendar._TT["ABOUT_TIME"] : "";
+ } else {
+ // FIXME: this should be removed as soon as lang files get updated!
+ text = "Help and about box text is not translated into this language.\n" +
+ "If you know this language and you feel generous please update\n" +
+ "the corresponding file in \"lang\" subdir to match calendar-en.js\n" +
+ "and send it back to <mihai_bazon@yahoo.com> to get it into the distribution ;-)\n\n" +
+ "Thank you!\n" +
+ "http://dynarch.com/mishoo/calendar.epl\n";
+ }
+ alert(text);
+ return;
+ case -2:
+ if (year > cal.minYear) {
+ date.setFullYear(year - 1);
+ }
+ break;
+ case -1:
+ if (mon > 0) {
+ setMonth(mon - 1);
+ } else if (year-- > cal.minYear) {
+ date.setFullYear(year);
+ setMonth(11);
+ }
+ break;
+ case 1:
+ if (mon < 11) {
+ setMonth(mon + 1);
+ } else if (year < cal.maxYear) {
+ date.setFullYear(year + 1);
+ setMonth(0);
+ }
+ break;
+ case 2:
+ if (year < cal.maxYear) {
+ date.setFullYear(year + 1);
+ }
+ break;
+ case 100:
+ cal.setFirstDayOfWeek(el.fdow);
+ return;
+ case 50:
+ var range = el._range;
+ var current = el.innerHTML;
+ for (var i = range.length; --i >= 0;)
+ if (range[i] == current)
+ break;
+ if (ev && ev.shiftKey) {
+ if (--i < 0)
+ i = range.length - 1;
+ } else if ( ++i >= range.length )
+ i = 0;
+ var newval = range[i];
+ el.innerHTML = newval;
+ cal.onUpdateTime();
+ return;
+ case 0:
+ // TODAY will bring us here
+ if ((typeof cal.getDateStatus == "function") &&
+ cal.getDateStatus(date, date.getFullYear(), date.getMonth(), date.getDate())) {
+ return false;
+ }
+ break;
+ }
+ if (!date.equalsTo(cal.date)) {
+ cal.setDate(date);
+ newdate = true;
+ } else if (el.navtype == 0)
+ newdate = closing = true;
+ }
+ if (newdate) {
+ ev && cal.callHandler();
+ }
+ if (closing) {
+ Calendar.removeClass(el, "hilite");
+ ev && cal.callCloseHandler();
+ }
+};
+
+// END: CALENDAR STATIC FUNCTIONS
+
+// BEGIN: CALENDAR OBJECT FUNCTIONS
+
+/**
+ * This function creates the calendar inside the given parent. If _par is
+ * null than it creates a popup calendar inside the BODY element. If _par is
+ * an element, be it BODY, then it creates a non-popup calendar (still
+ * hidden). Some properties need to be set before calling this function.
+ */
+Calendar.prototype.create = function (_par) {
+ var parent = null;
+ if (! _par) {
+ // default parent is the document body, in which case we create
+ // a popup calendar.
+ parent = document.getElementsByTagName("body")[0];
+ this.isPopup = true;
+ } else {
+ parent = _par;
+ this.isPopup = false;
+ }
+ this.date = this.dateStr ? new Date(this.dateStr) : new Date();
+
+ var table = Calendar.createElement("table");
+ this.table = table;
+ table.cellSpacing = 0;
+ table.cellPadding = 0;
+ table.calendar = this;
+ Calendar.addEvent(table, "mousedown", Calendar.tableMouseDown);
+
+ var div = Calendar.createElement("div");
+ this.element = div;
+ div.className = "calendar";
+ if (this.isPopup) {
+ div.style.position = "absolute";
+ div.style.display = "none";
+ }
+ div.appendChild(table);
+
+ var thead = Calendar.createElement("thead", table);
+ var cell = null;
+ var row = null;
+
+ var cal = this;
+ var hh = function (text, cs, navtype) {
+ cell = Calendar.createElement("td", row);
+ cell.colSpan = cs;
+ cell.className = "button";
+ if (navtype != 0 && Math.abs(navtype) <= 2)
+ cell.className += " nav";
+ Calendar._add_evs(cell);
+ cell.calendar = cal;
+ cell.navtype = navtype;
+ cell.innerHTML = "<div unselectable='on'>" + text + "</div>";
+ return cell;
+ };
+
+ row = Calendar.createElement("tr", thead);
+ var title_length = 6;
+ (this.isPopup) && --title_length;
+ (this.weekNumbers) && ++title_length;
+
+ hh("?", 1, 400).ttip = Calendar._TT["INFO"];
+ this.title = hh("", title_length, 300);
+ this.title.className = "title";
+ if (this.isPopup) {
+ this.title.ttip = Calendar._TT["DRAG_TO_MOVE"];
+ this.title.style.cursor = "move";
+ hh("&#x00d7;", 1, 200).ttip = Calendar._TT["CLOSE"];
+ }
+
+ row = Calendar.createElement("tr", thead);
+ row.className = "headrow";
+
+ this._nav_py = hh("&#x00ab;", 1, -2);
+ this._nav_py.ttip = Calendar._TT["PREV_YEAR"];
+
+ this._nav_pm = hh("&#x2039;", 1, -1);
+ this._nav_pm.ttip = Calendar._TT["PREV_MONTH"];
+
+ this._nav_now = hh(Calendar._TT["TODAY"], this.weekNumbers ? 4 : 3, 0);
+ this._nav_now.ttip = Calendar._TT["GO_TODAY"];
+
+ this._nav_nm = hh("&#x203a;", 1, 1);
+ this._nav_nm.ttip = Calendar._TT["NEXT_MONTH"];
+
+ this._nav_ny = hh("&#x00bb;", 1, 2);
+ this._nav_ny.ttip = Calendar._TT["NEXT_YEAR"];
+
+ // day names
+ row = Calendar.createElement("tr", thead);
+ row.className = "daynames";
+ if (this.weekNumbers) {
+ cell = Calendar.createElement("td", row);
+ cell.className = "name wn";
+ cell.innerHTML = Calendar._TT["WK"];
+ }
+ for (var i = 7; i > 0; --i) {
+ cell = Calendar.createElement("td", row);
+ if (!i) {
+ cell.navtype = 100;
+ cell.calendar = this;
+ Calendar._add_evs(cell);
+ }
+ }
+ this.firstdayname = (this.weekNumbers) ? row.firstChild.nextSibling : row.firstChild;
+ this._displayWeekdays();
+
+ var tbody = Calendar.createElement("tbody", table);
+ this.tbody = tbody;
+
+ for (i = 6; i > 0; --i) {
+ row = Calendar.createElement("tr", tbody);
+ if (this.weekNumbers) {
+ cell = Calendar.createElement("td", row);
+ }
+ for (var j = 7; j > 0; --j) {
+ cell = Calendar.createElement("td", row);
+ cell.calendar = this;
+ Calendar._add_evs(cell);
+ }
+ }
+
+ if (this.showsTime) {
+ row = Calendar.createElement("tr", tbody);
+ row.className = "time";
+
+ cell = Calendar.createElement("td", row);
+ cell.className = "time";
+ cell.colSpan = 2;
+ cell.innerHTML = Calendar._TT["TIME"] || "&nbsp;";
+
+ cell = Calendar.createElement("td", row);
+ cell.className = "time";
+ cell.colSpan = this.weekNumbers ? 4 : 3;
+
+ (function(){
+ function makeTimePart(className, init, range_start, range_end) {
+ var part = Calendar.createElement("span", cell);
+ part.className = className;
+ part.innerHTML = init;
+ part.calendar = cal;
+ part.ttip = Calendar._TT["TIME_PART"];
+ part.navtype = 50;
+ part._range = [];
+ if (typeof range_start != "number")
+ part._range = range_start;
+ else {
+ for (var i = range_start; i <= range_end; ++i) {
+ var txt;
+ if (i < 10 && range_end >= 10) txt = '0' + i;
+ else txt = '' + i;
+ part._range[part._range.length] = txt;
+ }
+ }
+ Calendar._add_evs(part);
+ return part;
+ };
+ var hrs = cal.date.getHours();
+ var mins = cal.date.getMinutes();
+ var t12 = !cal.time24;
+ var pm = (hrs > 12);
+ if (t12 && pm) hrs -= 12;
+ var H = makeTimePart("hour", hrs, t12 ? 1 : 0, t12 ? 12 : 23);
+ var span = Calendar.createElement("span", cell);
+ span.innerHTML = ":";
+ span.className = "colon";
+ var M = makeTimePart("minute", mins, 0, 59);
+ var AP = null;
+ cell = Calendar.createElement("td", row);
+ cell.className = "time";
+ cell.colSpan = 2;
+ if (t12)
+ AP = makeTimePart("ampm", pm ? "pm" : "am", ["am", "pm"]);
+ else
+ cell.innerHTML = "&nbsp;";
+
+ cal.onSetTime = function() {
+ var pm, hrs = this.date.getHours(),
+ mins = this.date.getMinutes();
+ if (t12) {
+ pm = (hrs >= 12);
+ if (pm) hrs -= 12;
+ if (hrs == 0) hrs = 12;
+ AP.innerHTML = pm ? "pm" : "am";
+ }
+ H.innerHTML = (hrs < 10) ? ("0" + hrs) : hrs;
+ M.innerHTML = (mins < 10) ? ("0" + mins) : mins;
+ };
+
+ cal.onUpdateTime = function() {
+ var date = this.date;
+ var h = parseInt(H.innerHTML, 10);
+ if (t12) {
+ if (/pm/i.test(AP.innerHTML) && h < 12)
+ h += 12;
+ else if (/am/i.test(AP.innerHTML) && h == 12)
+ h = 0;
+ }
+ var d = date.getDate();
+ var m = date.getMonth();
+ var y = date.getFullYear();
+ date.setHours(h);
+ date.setMinutes(parseInt(M.innerHTML, 10));
+ date.setFullYear(y);
+ date.setMonth(m);
+ date.setDate(d);
+ this.dateClicked = false;
+ this.callHandler();
+ };
+ })();
+ } else {
+ this.onSetTime = this.onUpdateTime = function() {};
+ }
+
+ var tfoot = Calendar.createElement("tfoot", table);
+
+ row = Calendar.createElement("tr", tfoot);
+ row.className = "footrow";
+
+ cell = hh(Calendar._TT["SEL_DATE"], this.weekNumbers ? 8 : 7, 300);
+ cell.className = "ttip";
+ if (this.isPopup) {
+ cell.ttip = Calendar._TT["DRAG_TO_MOVE"];
+ cell.style.cursor = "move";
+ }
+ this.tooltips = cell;
+
+ div = Calendar.createElement("div", this.element);
+ this.monthsCombo = div;
+ div.className = "combo";
+ for (i = 0; i < Calendar._MN.length; ++i) {
+ var mn = Calendar.createElement("div");
+ mn.className = Calendar.is_ie ? "label-IEfix" : "label";
+ mn.month = i;
+ mn.innerHTML = Calendar._SMN[i];
+ div.appendChild(mn);
+ }
+
+ div = Calendar.createElement("div", this.element);
+ this.yearsCombo = div;
+ div.className = "combo";
+ for (i = 12; i > 0; --i) {
+ var yr = Calendar.createElement("div");
+ yr.className = Calendar.is_ie ? "label-IEfix" : "label";
+ div.appendChild(yr);
+ }
+
+ this._init(this.firstDayOfWeek, this.date);
+ parent.appendChild(this.element);
+};
+
+/** keyboard navigation, only for popup calendars */
+Calendar._keyEvent = function(ev) {
+ var cal = window._dynarch_popupCalendar;
+ if (!cal || cal.multiple)
+ return false;
+ (Calendar.is_ie) && (ev = window.event);
+ var act = (Calendar.is_ie || ev.type == "keypress"),
+ K = ev.keyCode;
+ if (ev.ctrlKey) {
+ switch (K) {
+ case 37: // KEY left
+ act && Calendar.cellClick(cal._nav_pm);
+ break;
+ case 38: // KEY up
+ act && Calendar.cellClick(cal._nav_py);
+ break;
+ case 39: // KEY right
+ act && Calendar.cellClick(cal._nav_nm);
+ break;
+ case 40: // KEY down
+ act && Calendar.cellClick(cal._nav_ny);
+ break;
+ default:
+ return false;
+ }
+ } else switch (K) {
+ case 32: // KEY space (now)
+ Calendar.cellClick(cal._nav_now);
+ break;
+ case 27: // KEY esc
+ act && cal.callCloseHandler();
+ break;
+ case 37: // KEY left
+ case 38: // KEY up
+ case 39: // KEY right
+ case 40: // KEY down
+ if (act) {
+ var prev, x, y, ne, el, step;
+ prev = K == 37 || K == 38;
+ step = (K == 37 || K == 39) ? 1 : 7;
+ function setVars() {
+ el = cal.currentDateEl;
+ var p = el.pos;
+ x = p & 15;
+ y = p >> 4;
+ ne = cal.ar_days[y][x];
+ };setVars();
+ function prevMonth() {
+ var date = new Date(cal.date);
+ date.setDate(date.getDate() - step);
+ cal.setDate(date);
+ };
+ function nextMonth() {
+ var date = new Date(cal.date);
+ date.setDate(date.getDate() + step);
+ cal.setDate(date);
+ };
+ while (1) {
+ switch (K) {
+ case 37: // KEY left
+ if (--x >= 0)
+ ne = cal.ar_days[y][x];
+ else {
+ x = 6;
+ K = 38;
+ continue;
+ }
+ break;
+ case 38: // KEY up
+ if (--y >= 0)
+ ne = cal.ar_days[y][x];
+ else {
+ prevMonth();
+ setVars();
+ }
+ break;
+ case 39: // KEY right
+ if (++x < 7)
+ ne = cal.ar_days[y][x];
+ else {
+ x = 0;
+ K = 40;
+ continue;
+ }
+ break;
+ case 40: // KEY down
+ if (++y < cal.ar_days.length)
+ ne = cal.ar_days[y][x];
+ else {
+ nextMonth();
+ setVars();
+ }
+ break;
+ }
+ break;
+ }
+ if (ne) {
+ if (!ne.disabled)
+ Calendar.cellClick(ne);
+ else if (prev)
+ prevMonth();
+ else
+ nextMonth();
+ }
+ }
+ break;
+ case 13: // KEY enter
+ if (act)
+ Calendar.cellClick(cal.currentDateEl, ev);
+ break;
+ default:
+ return false;
+ }
+ return Calendar.stopEvent(ev);
+};
+
+/**
+ * (RE)Initializes the calendar to the given date and firstDayOfWeek
+ */
+Calendar.prototype._init = function (firstDayOfWeek, date) {
+ var today = new Date(),
+ TY = today.getFullYear(),
+ TM = today.getMonth(),
+ TD = today.getDate();
+ this.table.style.visibility = "hidden";
+ var year = date.getFullYear();
+ if (year < this.minYear) {
+ year = this.minYear;
+ date.setFullYear(year);
+ } else if (year > this.maxYear) {
+ year = this.maxYear;
+ date.setFullYear(year);
+ }
+ this.firstDayOfWeek = firstDayOfWeek;
+ this.date = new Date(date);
+ var month = date.getMonth();
+ var mday = date.getDate();
+ var no_days = date.getMonthDays();
+
+ // calendar voodoo for computing the first day that would actually be
+ // displayed in the calendar, even if it's from the previous month.
+ // WARNING: this is magic. ;-)
+ date.setDate(1);
+ var day1 = (date.getDay() - this.firstDayOfWeek) % 7;
+ if (day1 < 0)
+ day1 += 7;
+ date.setDate(-day1);
+ date.setDate(date.getDate() + 1);
+
+ var row = this.tbody.firstChild;
+ var MN = Calendar._SMN[month];
+ var ar_days = this.ar_days = new Array();
+ var weekend = Calendar._TT["WEEKEND"];
+ var dates = this.multiple ? (this.datesCells = {}) : null;
+ for (var i = 0; i < 6; ++i, row = row.nextSibling) {
+ var cell = row.firstChild;
+ if (this.weekNumbers) {
+ cell.className = "day wn";
+ cell.innerHTML = date.getWeekNumber();
+ cell = cell.nextSibling;
+ }
+ row.className = "daysrow";
+ var hasdays = false, iday, dpos = ar_days[i] = [];
+ for (var j = 0; j < 7; ++j, cell = cell.nextSibling, date.setDate(iday + 1)) {
+ iday = date.getDate();
+ var wday = date.getDay();
+ cell.className = "day";
+ cell.pos = i << 4 | j;
+ dpos[j] = cell;
+ var current_month = (date.getMonth() == month);
+ if (!current_month) {
+ if (this.showsOtherMonths) {
+ cell.className += " othermonth";
+ cell.otherMonth = true;
+ } else {
+ cell.className = "emptycell";
+ cell.innerHTML = "&nbsp;";
+ cell.disabled = true;
+ continue;
+ }
+ } else {
+ cell.otherMonth = false;
+ hasdays = true;
+ }
+ cell.disabled = false;
+ cell.innerHTML = this.getDateText ? this.getDateText(date, iday) : iday;
+ if (dates)
+ dates[date.print("%Y%m%d")] = cell;
+ if (this.getDateStatus) {
+ var status = this.getDateStatus(date, year, month, iday);
+ if (status === true) {
+ cell.className += " disabled";
+ cell.disabled = true;
+ } else {
+ if (/disabled/i.test(status))
+ cell.disabled = true;
+ cell.className += " " + status;
+ }
+ }
+ if (!cell.disabled) {
+ cell.caldate = new Date(date);
+ cell.ttip = "_";
+ if (!this.multiple && current_month
+ && iday == mday && this.hiliteToday) {
+ cell.className += " selected";
+ this.currentDateEl = cell;
+ }
+ if (date.getFullYear() == TY &&
+ date.getMonth() == TM &&
+ iday == TD) {
+ cell.className += " today";
+ cell.ttip += Calendar._TT["PART_TODAY"];
+ }
+ if (weekend.indexOf(wday.toString()) != -1)
+ cell.className += cell.otherMonth ? " oweekend" : " weekend";
+ }
+ }
+ if (!(hasdays || this.showsOtherMonths))
+ row.className = "emptyrow";
+ }
+ this.title.innerHTML = Calendar._MN[month] + ", " + year;
+ this.onSetTime();
+ this.table.style.visibility = "visible";
+ this._initMultipleDates();
+ // PROFILE
+ // this.tooltips.innerHTML = "Generated in " + ((new Date()) - today) + " ms";
+};
+
+Calendar.prototype._initMultipleDates = function() {
+ if (this.multiple) {
+ for (var i in this.multiple) {
+ var cell = this.datesCells[i];
+ var d = this.multiple[i];
+ if (!d)
+ continue;
+ if (cell)
+ cell.className += " selected";
+ }
+ }
+};
+
+Calendar.prototype._toggleMultipleDate = function(date) {
+ if (this.multiple) {
+ var ds = date.print("%Y%m%d");
+ var cell = this.datesCells[ds];
+ if (cell) {
+ var d = this.multiple[ds];
+ if (!d) {
+ Calendar.addClass(cell, "selected");
+ this.multiple[ds] = date;
+ } else {
+ Calendar.removeClass(cell, "selected");
+ delete this.multiple[ds];
+ }
+ }
+ }
+};
+
+Calendar.prototype.setDateToolTipHandler = function (unaryFunction) {
+ this.getDateToolTip = unaryFunction;
+};
+
+/**
+ * Calls _init function above for going to a certain date (but only if the
+ * date is different than the currently selected one).
+ */
+Calendar.prototype.setDate = function (date) {
+ if (!date.equalsTo(this.date)) {
+ this._init(this.firstDayOfWeek, date);
+ }
+};
+
+/**
+ * Refreshes the calendar. Useful if the "disabledHandler" function is
+ * dynamic, meaning that the list of disabled date can change at runtime.
+ * Just * call this function if you think that the list of disabled dates
+ * should * change.
+ */
+Calendar.prototype.refresh = function () {
+ this._init(this.firstDayOfWeek, this.date);
+};
+
+/** Modifies the "firstDayOfWeek" parameter (pass 0 for Synday, 1 for Monday, etc.). */
+Calendar.prototype.setFirstDayOfWeek = function (firstDayOfWeek) {
+ this._init(firstDayOfWeek, this.date);
+ this._displayWeekdays();
+};
+
+/**
+ * Allows customization of what dates are enabled. The "unaryFunction"
+ * parameter must be a function object that receives the date (as a JS Date
+ * object) and returns a boolean value. If the returned value is true then
+ * the passed date will be marked as disabled.
+ */
+Calendar.prototype.setDateStatusHandler = Calendar.prototype.setDisabledHandler = function (unaryFunction) {
+ this.getDateStatus = unaryFunction;
+};
+
+/** Customization of allowed year range for the calendar. */
+Calendar.prototype.setRange = function (a, z) {
+ this.minYear = a;
+ this.maxYear = z;
+};
+
+/** Calls the first user handler (selectedHandler). */
+Calendar.prototype.callHandler = function () {
+ if (this.onSelected) {
+ this.onSelected(this, this.date.print(this.dateFormat));
+ }
+};
+
+/** Calls the second user handler (closeHandler). */
+Calendar.prototype.callCloseHandler = function () {
+ if (this.onClose) {
+ this.onClose(this);
+ }
+ this.hideShowCovered();
+};
+
+/** Removes the calendar object from the DOM tree and destroys it. */
+Calendar.prototype.destroy = function () {
+ var el = this.element.parentNode;
+ el.removeChild(this.element);
+ Calendar._C = null;
+ window._dynarch_popupCalendar = null;
+};
+
+/**
+ * Moves the calendar element to a different section in the DOM tree (changes
+ * its parent).
+ */
+Calendar.prototype.reparent = function (new_parent) {
+ var el = this.element;
+ el.parentNode.removeChild(el);
+ new_parent.appendChild(el);
+};
+
+// This gets called when the user presses a mouse button anywhere in the
+// document, if the calendar is shown. If the click was outside the open
+// calendar this function closes it.
+Calendar._checkCalendar = function(ev) {
+ var calendar = window._dynarch_popupCalendar;
+ if (!calendar) {
+ return false;
+ }
+ var el = Calendar.is_ie ? Calendar.getElement(ev) : Calendar.getTargetElement(ev);
+ for (; el != null && el != calendar.element; el = el.parentNode);
+ if (el == null) {
+ // calls closeHandler which should hide the calendar.
+ window._dynarch_popupCalendar.callCloseHandler();
+ return Calendar.stopEvent(ev);
+ }
+};
+
+/** Shows the calendar. */
+Calendar.prototype.show = function () {
+ var rows = this.table.getElementsByTagName("tr");
+ for (var i = rows.length; i > 0;) {
+ var row = rows[--i];
+ Calendar.removeClass(row, "rowhilite");
+ var cells = row.getElementsByTagName("td");
+ for (var j = cells.length; j > 0;) {
+ var cell = cells[--j];
+ Calendar.removeClass(cell, "hilite");
+ Calendar.removeClass(cell, "active");
+ }
+ }
+ this.element.style.display = "block";
+ this.hidden = false;
+ if (this.isPopup) {
+ window._dynarch_popupCalendar = this;
+ Calendar.addEvent(document, "keydown", Calendar._keyEvent);
+ Calendar.addEvent(document, "keypress", Calendar._keyEvent);
+ Calendar.addEvent(document, "mousedown", Calendar._checkCalendar);
+ }
+ this.hideShowCovered();
+};
+
+/**
+ * Hides the calendar. Also removes any "hilite" from the class of any TD
+ * element.
+ */
+Calendar.prototype.hide = function () {
+ if (this.isPopup) {
+ Calendar.removeEvent(document, "keydown", Calendar._keyEvent);
+ Calendar.removeEvent(document, "keypress", Calendar._keyEvent);
+ Calendar.removeEvent(document, "mousedown", Calendar._checkCalendar);
+ }
+ this.element.style.display = "none";
+ this.hidden = true;
+ this.hideShowCovered();
+};
+
+/**
+ * Shows the calendar at a given absolute position (beware that, depending on
+ * the calendar element style -- position property -- this might be relative
+ * to the parent's containing rectangle).
+ */
+Calendar.prototype.showAt = function (x, y) {
+ var s = this.element.style;
+ s.left = x + "px";
+ s.top = y + "px";
+ this.show();
+};
+
+/** Shows the calendar near a given element. */
+Calendar.prototype.showAtElement = function (el, opts) {
+ var self = this;
+ var p = Calendar.getAbsolutePos(el);
+ if (!opts || typeof opts != "string") {
+ this.showAt(p.x, p.y + el.offsetHeight);
+ return true;
+ }
+ function fixPosition(box) {
+ if (box.x < 0)
+ box.x = 0;
+ if (box.y < 0)
+ box.y = 0;
+ var cp = document.createElement("div");
+ var s = cp.style;
+ s.position = "absolute";
+ s.right = s.bottom = s.width = s.height = "0px";
+ document.body.appendChild(cp);
+ var br = Calendar.getAbsolutePos(cp);
+ document.body.removeChild(cp);
+ if (Calendar.is_ie) {
+ br.y += document.body.scrollTop;
+ br.x += document.body.scrollLeft;
+ } else {
+ br.y += window.scrollY;
+ br.x += window.scrollX;
+ }
+ var tmp = box.x + box.width - br.x;
+ if (tmp > 0) box.x -= tmp;
+ tmp = box.y + box.height - br.y;
+ if (tmp > 0) box.y -= tmp;
+ };
+ this.element.style.display = "block";
+ Calendar.continuation_for_the_fucking_khtml_browser = function() {
+ var w = self.element.offsetWidth;
+ var h = self.element.offsetHeight;
+ self.element.style.display = "none";
+ var valign = opts.substr(0, 1);
+ var halign = "l";
+ if (opts.length > 1) {
+ halign = opts.substr(1, 1);
+ }
+ // vertical alignment
+ switch (valign) {
+ case "T": p.y -= h; break;
+ case "B": p.y += el.offsetHeight; break;
+ case "C": p.y += (el.offsetHeight - h) / 2; break;
+ case "t": p.y += el.offsetHeight - h; break;
+ case "b": break; // already there
+ }
+ // horizontal alignment
+ switch (halign) {
+ case "L": p.x -= w; break;
+ case "R": p.x += el.offsetWidth; break;
+ case "C": p.x += (el.offsetWidth - w) / 2; break;
+ case "l": p.x += el.offsetWidth - w; break;
+ case "r": break; // already there
+ }
+ p.width = w;
+ p.height = h + 40;
+ self.monthsCombo.style.display = "none";
+ fixPosition(p);
+ self.showAt(p.x, p.y);
+ };
+ if (Calendar.is_khtml)
+ setTimeout("Calendar.continuation_for_the_fucking_khtml_browser()", 10);
+ else
+ Calendar.continuation_for_the_fucking_khtml_browser();
+};
+
+/** Customizes the date format. */
+Calendar.prototype.setDateFormat = function (str) {
+ this.dateFormat = str;
+};
+
+/** Customizes the tooltip date format. */
+Calendar.prototype.setTtDateFormat = function (str) {
+ this.ttDateFormat = str;
+};
+
+/**
+ * Tries to identify the date represented in a string. If successful it also
+ * calls this.setDate which moves the calendar to the given date.
+ */
+Calendar.prototype.parseDate = function(str, fmt) {
+ if (!fmt)
+ fmt = this.dateFormat;
+ this.setDate(Date.parseDate(str, fmt));
+};
+
+Calendar.prototype.hideShowCovered = function () {
+ if (!Calendar.is_ie && !Calendar.is_opera)
+ return;
+ function getVisib(obj){
+ var value = obj.style.visibility;
+ if (!value) {
+ if (document.defaultView && typeof (document.defaultView.getComputedStyle) == "function") { // Gecko, W3C
+ if (!Calendar.is_khtml)
+ value = document.defaultView.
+ getComputedStyle(obj, "").getPropertyValue("visibility");
+ else
+ value = '';
+ } else if (obj.currentStyle) { // IE
+ value = obj.currentStyle.visibility;
+ } else
+ value = '';
+ }
+ return value;
+ };
+
+ var tags = new Array("applet", "iframe", "select");
+ var el = this.element;
+
+ var p = Calendar.getAbsolutePos(el);
+ var EX1 = p.x;
+ var EX2 = el.offsetWidth + EX1;
+ var EY1 = p.y;
+ var EY2 = el.offsetHeight + EY1;
+
+ for (var k = tags.length; k > 0; ) {
+ var ar = document.getElementsByTagName(tags[--k]);
+ var cc = null;
+
+ for (var i = ar.length; i > 0;) {
+ cc = ar[--i];
+
+ p = Calendar.getAbsolutePos(cc);
+ var CX1 = p.x;
+ var CX2 = cc.offsetWidth + CX1;
+ var CY1 = p.y;
+ var CY2 = cc.offsetHeight + CY1;
+
+ if (this.hidden || (CX1 > EX2) || (CX2 < EX1) || (CY1 > EY2) || (CY2 < EY1)) {
+ if (!cc.__msh_save_visibility) {
+ cc.__msh_save_visibility = getVisib(cc);
+ }
+ cc.style.visibility = cc.__msh_save_visibility;
+ } else {
+ if (!cc.__msh_save_visibility) {
+ cc.__msh_save_visibility = getVisib(cc);
+ }
+ cc.style.visibility = "hidden";
+ }
+ }
+ }
+};
+
+/** Internal function; it displays the bar with the names of the weekday. */
+Calendar.prototype._displayWeekdays = function () {
+ var fdow = this.firstDayOfWeek;
+ var cell = this.firstdayname;
+ var weekend = Calendar._TT["WEEKEND"];
+ for (var i = 0; i < 7; ++i) {
+ cell.className = "day name";
+ var realday = (i + fdow) % 7;
+ if (i) {
+ cell.ttip = Calendar._TT["DAY_FIRST"].replace("%s", Calendar._DN[realday]);
+ cell.navtype = 100;
+ cell.calendar = this;
+ cell.fdow = realday;
+ Calendar._add_evs(cell);
+ }
+ if (weekend.indexOf(realday.toString()) != -1) {
+ Calendar.addClass(cell, "weekend");
+ }
+ cell.innerHTML = Calendar._SDN[(i + fdow) % 7];
+ cell = cell.nextSibling;
+ }
+};
+
+/** Internal function. Hides all combo boxes that might be displayed. */
+Calendar.prototype._hideCombos = function () {
+ this.monthsCombo.style.display = "none";
+ this.yearsCombo.style.display = "none";
+};
+
+/** Internal function. Starts dragging the element. */
+Calendar.prototype._dragStart = function (ev) {
+ if (this.dragging) {
+ return;
+ }
+ this.dragging = true;
+ var posX;
+ var posY;
+ if (Calendar.is_ie) {
+ posY = window.event.clientY + document.body.scrollTop;
+ posX = window.event.clientX + document.body.scrollLeft;
+ } else {
+ posY = ev.clientY + window.scrollY;
+ posX = ev.clientX + window.scrollX;
+ }
+ var st = this.element.style;
+ this.xOffs = posX - parseInt(st.left);
+ this.yOffs = posY - parseInt(st.top);
+ with (Calendar) {
+ addEvent(document, "mousemove", calDragIt);
+ addEvent(document, "mouseup", calDragEnd);
+ }
+};
+
+// BEGIN: DATE OBJECT PATCHES
+
+/** Adds the number of days array to the Date object. */
+Date._MD = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
+
+/** Constants used for time computations */
+Date.SECOND = 1000 /* milliseconds */;
+Date.MINUTE = 60 * Date.SECOND;
+Date.HOUR = 60 * Date.MINUTE;
+Date.DAY = 24 * Date.HOUR;
+Date.WEEK = 7 * Date.DAY;
+
+Date.parseDate = function(str, fmt) {
+ var today = new Date();
+ var y = 0;
+ var m = -1;
+ var d = 0;
+ var a = str.split(/\W+/);
+ var b = fmt.match(/%./g);
+ var i = 0, j = 0;
+ var hr = 0;
+ var min = 0;
+ for (i = 0; i < a.length; ++i) {
+ if (!a[i])
+ continue;
+ switch (b[i]) {
+ case "%d":
+ case "%e":
+ d = parseInt(a[i], 10);
+ break;
+
+ case "%m":
+ m = parseInt(a[i], 10) - 1;
+ break;
+
+ case "%Y":
+ case "%y":
+ y = parseInt(a[i], 10);
+ (y < 100) && (y += (y > 29) ? 1900 : 2000);
+ break;
+
+ case "%b":
+ case "%B":
+ for (j = 0; j < 12; ++j) {
+ if (Calendar._MN[j].substr(0, a[i].length).toLowerCase() == a[i].toLowerCase()) { m = j; break; }
+ }
+ break;
+
+ case "%H":
+ case "%I":
+ case "%k":
+ case "%l":
+ hr = parseInt(a[i], 10);
+ break;
+
+ case "%P":
+ case "%p":
+ if (/pm/i.test(a[i]) && hr < 12)
+ hr += 12;
+ else if (/am/i.test(a[i]) && hr >= 12)
+ hr -= 12;
+ break;
+
+ case "%M":
+ min = parseInt(a[i], 10);
+ break;
+ }
+ }
+ if (isNaN(y)) y = today.getFullYear();
+ if (isNaN(m)) m = today.getMonth();
+ if (isNaN(d)) d = today.getDate();
+ if (isNaN(hr)) hr = today.getHours();
+ if (isNaN(min)) min = today.getMinutes();
+ if (y != 0 && m != -1 && d != 0)
+ return new Date(y, m, d, hr, min, 0);
+ y = 0; m = -1; d = 0;
+ for (i = 0; i < a.length; ++i) {
+ if (a[i].search(/[a-zA-Z]+/) != -1) {
+ var t = -1;
+ for (j = 0; j < 12; ++j) {
+ if (Calendar._MN[j].substr(0, a[i].length).toLowerCase() == a[i].toLowerCase()) { t = j; break; }
+ }
+ if (t != -1) {
+ if (m != -1) {
+ d = m+1;
+ }
+ m = t;
+ }
+ } else if (parseInt(a[i], 10) <= 12 && m == -1) {
+ m = a[i]-1;
+ } else if (parseInt(a[i], 10) > 31 && y == 0) {
+ y = parseInt(a[i], 10);
+ (y < 100) && (y += (y > 29) ? 1900 : 2000);
+ } else if (d == 0) {
+ d = a[i];
+ }
+ }
+ if (y == 0)
+ y = today.getFullYear();
+ if (m != -1 && d != 0)
+ return new Date(y, m, d, hr, min, 0);
+ return today;
+};
+
+/** Returns the number of days in the current month */
+Date.prototype.getMonthDays = function(month) {
+ var year = this.getFullYear();
+ if (typeof month == "undefined") {
+ month = this.getMonth();
+ }
+ if (((0 == (year%4)) && ( (0 != (year%100)) || (0 == (year%400)))) && month == 1) {
+ return 29;
+ } else {
+ return Date._MD[month];
+ }
+};
+
+/** Returns the number of day in the year. */
+Date.prototype.getDayOfYear = function() {
+ var now = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0);
+ var then = new Date(this.getFullYear(), 0, 0, 0, 0, 0);
+ var time = now - then;
+ return Math.floor(time / Date.DAY);
+};
+
+/** Returns the number of the week in year, as defined in ISO 8601. */
+Date.prototype.getWeekNumber = function() {
+ var d = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0);
+ var DoW = d.getDay();
+ d.setDate(d.getDate() - (DoW + 6) % 7 + 3); // Nearest Thu
+ var ms = d.valueOf(); // GMT
+ d.setMonth(0);
+ d.setDate(4); // Thu in Week 1
+ return Math.round((ms - d.valueOf()) / (7 * 864e5)) + 1;
+};
+
+/** Checks date and time equality */
+Date.prototype.equalsTo = function(date) {
+ return ((this.getFullYear() == date.getFullYear()) &&
+ (this.getMonth() == date.getMonth()) &&
+ (this.getDate() == date.getDate()) &&
+ (this.getHours() == date.getHours()) &&
+ (this.getMinutes() == date.getMinutes()));
+};
+
+/** Set only the year, month, date parts (keep existing time) */
+Date.prototype.setDateOnly = function(date) {
+ var tmp = new Date(date);
+ this.setDate(1);
+ this.setFullYear(tmp.getFullYear());
+ this.setMonth(tmp.getMonth());
+ this.setDate(tmp.getDate());
+};
+
+/** Prints the date in a string according to the given format. */
+Date.prototype.print = function (str) {
+ var m = this.getMonth();
+ var d = this.getDate();
+ var y = this.getFullYear();
+ var wn = this.getWeekNumber();
+ var w = this.getDay();
+ var s = {};
+ var hr = this.getHours();
+ var pm = (hr >= 12);
+ var ir = (pm) ? (hr - 12) : hr;
+ var dy = this.getDayOfYear();
+ if (ir == 0)
+ ir = 12;
+ var min = this.getMinutes();
+ var sec = this.getSeconds();
+ s["%a"] = Calendar._SDN[w]; // abbreviated weekday name [FIXME: I18N]
+ s["%A"] = Calendar._DN[w]; // full weekday name
+ s["%b"] = Calendar._SMN[m]; // abbreviated month name [FIXME: I18N]
+ s["%B"] = Calendar._MN[m]; // full month name
+ // FIXME: %c : preferred date and time representation for the current locale
+ s["%C"] = 1 + Math.floor(y / 100); // the century number
+ s["%d"] = (d < 10) ? ("0" + d) : d; // the day of the month (range 01 to 31)
+ s["%e"] = d; // the day of the month (range 1 to 31)
+ // FIXME: %D : american date style: %m/%d/%y
+ // FIXME: %E, %F, %G, %g, %h (man strftime)
+ s["%H"] = (hr < 10) ? ("0" + hr) : hr; // hour, range 00 to 23 (24h format)
+ s["%I"] = (ir < 10) ? ("0" + ir) : ir; // hour, range 01 to 12 (12h format)
+ s["%j"] = (dy < 100) ? ((dy < 10) ? ("00" + dy) : ("0" + dy)) : dy; // day of the year (range 001 to 366)
+ s["%k"] = hr; // hour, range 0 to 23 (24h format)
+ s["%l"] = ir; // hour, range 1 to 12 (12h format)
+ s["%m"] = (m < 9) ? ("0" + (1+m)) : (1+m); // month, range 01 to 12
+ s["%M"] = (min < 10) ? ("0" + min) : min; // minute, range 00 to 59
+ s["%n"] = "\n"; // a newline character
+ s["%p"] = pm ? "PM" : "AM";
+ s["%P"] = pm ? "pm" : "am";
+ // FIXME: %r : the time in am/pm notation %I:%M:%S %p
+ // FIXME: %R : the time in 24-hour notation %H:%M
+ s["%s"] = Math.floor(this.getTime() / 1000);
+ s["%S"] = (sec < 10) ? ("0" + sec) : sec; // seconds, range 00 to 59
+ s["%t"] = "\t"; // a tab character
+ // FIXME: %T : the time in 24-hour notation (%H:%M:%S)
+ s["%U"] = s["%W"] = s["%V"] = (wn < 10) ? ("0" + wn) : wn;
+ s["%u"] = w + 1; // the day of the week (range 1 to 7, 1 = MON)
+ s["%w"] = w; // the day of the week (range 0 to 6, 0 = SUN)
+ // FIXME: %x : preferred date representation for the current locale without the time
+ // FIXME: %X : preferred time representation for the current locale without the date
+ s["%y"] = ('' + y).substr(2, 2); // year without the century (range 00 to 99)
+ s["%Y"] = y; // year with the century
+ s["%%"] = "%"; // a literal '%' character
+
+ var re = /%./g;
+ if (!Calendar.is_ie5 && !Calendar.is_khtml)
+ return str.replace(re, function (par) { return s[par] || par; });
+
+ var a = str.match(re);
+ for (var i = 0; i < a.length; i++) {
+ var tmp = s[a[i]];
+ if (tmp) {
+ re = new RegExp(a[i], 'g');
+ str = str.replace(re, tmp);
+ }
+ }
+
+ return str;
+};
+
+Date.prototype.__msh_oldSetFullYear = Date.prototype.setFullYear;
+Date.prototype.setFullYear = function(y) {
+ var d = new Date(this);
+ d.__msh_oldSetFullYear(y);
+ if (d.getMonth() != this.getMonth())
+ this.setDate(28);
+ this.__msh_oldSetFullYear(y);
+};
+
+// END: DATE OBJECT PATCHES
+
+
+// global object that remembers the calendar
+window._dynarch_popupCalendar = null;
diff --git a/js/jscalendar/calendar.php b/js/jscalendar/calendar.php
new file mode 100644
index 0000000..5b9120d
--- /dev/null
+++ b/js/jscalendar/calendar.php
@@ -0,0 +1,119 @@
+<?php
+
+/**
+ * File: calendar.php | (c) dynarch.com 2004
+ * Distributed as part of "The Coolest DHTML Calendar"
+ * under the same terms.
+ * -----------------------------------------------------------------
+ * This file implements a simple PHP wrapper for the calendar. It
+ * allows you to easily include all the calendar files and setup the
+ * calendar by instantiating and calling a PHP object.
+ */
+
+define('NEWLINE', "\n");
+
+class DHTML_Calendar {
+ var $calendar_lib_path;
+
+ var $calendar_file;
+ var $calendar_lang_file;
+ var $calendar_setup_file;
+ var $calendar_theme_file;
+ var $calendar_options;
+
+ function DHTML_Calendar($calendar_lib_path = '/calendar/',
+ $lang = 'en',
+ $theme = 'calendar-win2k-1',
+ $stripped = true) {
+ if ($stripped) {
+ $this->calendar_file = 'calendar_stripped.js';
+ $this->calendar_setup_file = 'calendar-setup_stripped.js';
+ } else {
+ $this->calendar_file = 'calendar.js';
+ $this->calendar_setup_file = 'calendar-setup.js';
+ }
+ $this->calendar_lang_file = 'lang/calendar-' . $lang . '.js';
+ $this->calendar_theme_file = $theme.'.css';
+ $this->calendar_lib_path = preg_replace('/\/+$/', '/', $calendar_lib_path);
+ $this->calendar_options = array('ifFormat' => '%Y/%m/%d',
+ 'daFormat' => '%Y/%m/%d');
+ }
+
+ function set_option($name, $value) {
+ $this->calendar_options[$name] = $value;
+ }
+
+ function load_files() {
+ echo $this->get_load_files_code();
+ }
+
+ function get_load_files_code() {
+ $code = ( '<link rel="stylesheet" type="text/css" media="all" href="' .
+ $this->calendar_lib_path . $this->calendar_theme_file .
+ '" />' . NEWLINE );
+ $code .= ( '<script type="text/javascript" src="' .
+ $this->calendar_lib_path . $this->calendar_file .
+ '"></script>' . NEWLINE );
+ $code .= ( '<script type="text/javascript" src="' .
+ $this->calendar_lib_path . $this->calendar_lang_file .
+ '"></script>' . NEWLINE );
+ $code .= ( '<script type="text/javascript" src="' .
+ $this->calendar_lib_path . $this->calendar_setup_file .
+ '"></script>' );
+ return $code;
+ }
+
+ function _make_calendar($other_options = array()) {
+ $js_options = $this->_make_js_hash(array_merge($this->calendar_options, $other_options));
+ $code = ( '<script type="text/javascript">Calendar.setup({' .
+ $js_options .
+ '});</script>' );
+ return $code;
+ }
+
+ function make_input_field($cal_options = array(), $field_attributes = array()) {
+ $id = $this->_gen_id();
+ $attrstr = $this->_make_html_attr(array_merge($field_attributes,
+ array('id' => $this->_field_id($id),
+ 'type' => 'text')));
+ echo '<input ' . $attrstr .'/>';
+ echo '<a href="#" id="'. $this->_trigger_id($id) . '">' .
+ '<img align="middle" border="0" src="' . $this->calendar_lib_path . 'img.gif" alt="" /></a>';
+
+ $options = array_merge($cal_options,
+ array('inputField' => $this->_field_id($id),
+ 'button' => $this->_trigger_id($id)));
+ echo $this->_make_calendar($options);
+ }
+
+ /// PRIVATE SECTION
+
+ function _field_id($id) { return 'f-calendar-field-' . $id; }
+ function _trigger_id($id) { return 'f-calendar-trigger-' . $id; }
+ function _gen_id() { static $id = 0; return ++$id; }
+
+ function _make_js_hash($array) {
+ $jstr = '';
+ reset($array);
+ while (list($key, $val) = each($array)) {
+ if (is_bool($val))
+ $val = $val ? 'true' : 'false';
+ else if (!is_numeric($val))
+ $val = '"'.$val.'"';
+ if ($jstr) $jstr .= ',';
+ $jstr .= '"' . $key . '":' . $val;
+ }
+ return $jstr;
+ }
+
+ function _make_html_attr($array) {
+ $attrstr = '';
+ reset($array);
+ while (list($key, $val) = each($array)) {
+ $attrstr .= $key . '="' . $val . '" ';
+ }
+ return $attrstr;
+ }
+};
+
+?> \ No newline at end of file
diff --git a/js/jscalendar/calendar_stripped.js b/js/jscalendar/calendar_stripped.js
new file mode 100644
index 0000000..4fe03f1
--- /dev/null
+++ b/js/jscalendar/calendar_stripped.js
@@ -0,0 +1,14 @@
+/* Copyright Mihai Bazon, 2002-2005 | www.bazon.net/mishoo
+ * -----------------------------------------------------------
+ *
+ * The DHTML Calendar, version 1.0 "It is happening again"
+ *
+ * Details and latest version at:
+ * www.dynarch.com/projects/calendar
+ *
+ * This script is developed by Dynarch.com. Visit us at www.dynarch.com.
+ *
+ * This script is distributed under the GNU Lesser General Public License.
+ * Read the entire license text here: http://www.gnu.org/licenses/lgpl.html
+ */
+ Calendar=function(firstDayOfWeek,dateStr,onSelected,onClose){this.activeDiv=null;this.currentDateEl=null;this.getDateStatus=null;this.getDateToolTip=null;this.getDateText=null;this.timeout=null;this.onSelected=onSelected||null;this.onClose=onClose||null;this.dragging=false;this.hidden=false;this.minYear=1970;this.maxYear=2050;this.dateFormat=Calendar._TT["DEF_DATE_FORMAT"];this.ttDateFormat=Calendar._TT["TT_DATE_FORMAT"];this.isPopup=true;this.weekNumbers=true;this.firstDayOfWeek=typeof firstDayOfWeek=="number"?firstDayOfWeek:Calendar._FD;this.showsOtherMonths=false;this.dateStr=dateStr;this.ar_days=null;this.showsTime=false;this.time24=true;this.yearStep=2;this.hiliteToday=true;this.multiple=null;this.table=null;this.element=null;this.tbody=null;this.firstdayname=null;this.monthsCombo=null;this.yearsCombo=null;this.hilitedMonth=null;this.activeMonth=null;this.hilitedYear=null;this.activeYear=null;this.dateClicked=false;if(typeof Calendar._SDN=="undefined"){if(typeof Calendar._SDN_len=="undefined")Calendar._SDN_len=3;var ar=new Array();for(var i=8;i>0;){ar[--i]=Calendar._DN[i].substr(0,Calendar._SDN_len);}Calendar._SDN=ar;if(typeof Calendar._SMN_len=="undefined")Calendar._SMN_len=3;ar=new Array();for(var i=12;i>0;){ar[--i]=Calendar._MN[i].substr(0,Calendar._SMN_len);}Calendar._SMN=ar;}};Calendar._C=null;Calendar.is_ie=(/msie/i.test(navigator.userAgent)&&!/opera/i.test(navigator.userAgent));Calendar.is_ie5=(Calendar.is_ie&&/msie 5\.0/i.test(navigator.userAgent));Calendar.is_opera=/opera/i.test(navigator.userAgent);Calendar.is_khtml=/Konqueror|Safari|KHTML/i.test(navigator.userAgent);Calendar.getAbsolutePos=function(el){var SL=0,ST=0;var is_div=/^div$/i.test(el.tagName);if(is_div&&el.scrollLeft)SL=el.scrollLeft;if(is_div&&el.scrollTop)ST=el.scrollTop;var r={x:el.offsetLeft-SL,y:el.offsetTop-ST};if(el.offsetParent){var tmp=this.getAbsolutePos(el.offsetParent);r.x+=tmp.x;r.y+=tmp.y;}return r;};Calendar.isRelated=function(el,evt){var related=evt.relatedTarget;if(!related){var type=evt.type;if(type=="mouseover"){related=evt.fromElement;}else if(type=="mouseout"){related=evt.toElement;}}while(related){if(related==el){return true;}related=related.parentNode;}return false;};Calendar.removeClass=function(el,className){if(!(el&&el.className)){return;}var cls=el.className.split(" ");var ar=new Array();for(var i=cls.length;i>0;){if(cls[--i]!=className){ar[ar.length]=cls[i];}}el.className=ar.join(" ");};Calendar.addClass=function(el,className){Calendar.removeClass(el,className);el.className+=" "+className;};Calendar.getElement=function(ev){var f=Calendar.is_ie?window.event.srcElement:ev.currentTarget;while(f.nodeType!=1||/^div$/i.test(f.tagName))f=f.parentNode;return f;};Calendar.getTargetElement=function(ev){var f=Calendar.is_ie?window.event.srcElement:ev.target;while(f.nodeType!=1)f=f.parentNode;return f;};Calendar.stopEvent=function(ev){ev||(ev=window.event);if(Calendar.is_ie){ev.cancelBubble=true;ev.returnValue=false;}else{ev.preventDefault();ev.stopPropagation();}return false;};Calendar.addEvent=function(el,evname,func){if(el.attachEvent){el.attachEvent("on"+evname,func);}else if(el.addEventListener){el.addEventListener(evname,func,true);}else{el["on"+evname]=func;}};Calendar.removeEvent=function(el,evname,func){if(el.detachEvent){el.detachEvent("on"+evname,func);}else if(el.removeEventListener){el.removeEventListener(evname,func,true);}else{el["on"+evname]=null;}};Calendar.createElement=function(type,parent){var el=null;if(document.createElementNS){el=document.createElementNS("http://www.w3.org/1999/xhtml",type);}else{el=document.createElement(type);}if(typeof parent!="undefined"){parent.appendChild(el);}return el;};Calendar._add_evs=function(el){with(Calendar){addEvent(el,"mouseover",dayMouseOver);addEvent(el,"mousedown",dayMouseDown);addEvent(el,"mouseout",dayMouseOut);if(is_ie){addEvent(el,"dblclick",dayMouseDblClick);el.setAttribute("unselectable",true);}}};Calendar.findMonth=function(el){if(typeof el.month!="undefined"){return el;}else if(typeof el.parentNode.month!="undefined"){return el.parentNode;}return null;};Calendar.findYear=function(el){if(typeof el.year!="undefined"){return el;}else if(typeof el.parentNode.year!="undefined"){return el.parentNode;}return null;};Calendar.showMonthsCombo=function(){var cal=Calendar._C;if(!cal){return false;}var cal=cal;var cd=cal.activeDiv;var mc=cal.monthsCombo;if(cal.hilitedMonth){Calendar.removeClass(cal.hilitedMonth,"hilite");}if(cal.activeMonth){Calendar.removeClass(cal.activeMonth,"active");}var mon=cal.monthsCombo.getElementsByTagName("div")[cal.date.getMonth()];Calendar.addClass(mon,"active");cal.activeMonth=mon;var s=mc.style;s.display="block";if(cd.navtype<0)s.left=cd.offsetLeft+"px";else{var mcw=mc.offsetWidth;if(typeof mcw=="undefined")mcw=50;s.left=(cd.offsetLeft+cd.offsetWidth-mcw)+"px";}s.top=(cd.offsetTop+cd.offsetHeight)+"px";};Calendar.showYearsCombo=function(fwd){var cal=Calendar._C;if(!cal){return false;}var cal=cal;var cd=cal.activeDiv;var yc=cal.yearsCombo;if(cal.hilitedYear){Calendar.removeClass(cal.hilitedYear,"hilite");}if(cal.activeYear){Calendar.removeClass(cal.activeYear,"active");}cal.activeYear=null;var Y=cal.date.getFullYear()+(fwd?1:-1);var yr=yc.firstChild;var show=false;for(var i=12;i>0;--i){if(Y>=cal.minYear&&Y<=cal.maxYear){yr.innerHTML=Y;yr.year=Y;yr.style.display="block";show=true;}else{yr.style.display="none";}yr=yr.nextSibling;Y+=fwd?cal.yearStep:-cal.yearStep;}if(show){var s=yc.style;s.display="block";if(cd.navtype<0)s.left=cd.offsetLeft+"px";else{var ycw=yc.offsetWidth;if(typeof ycw=="undefined")ycw=50;s.left=(cd.offsetLeft+cd.offsetWidth-ycw)+"px";}s.top=(cd.offsetTop+cd.offsetHeight)+"px";}};Calendar.tableMouseUp=function(ev){var cal=Calendar._C;if(!cal){return false;}if(cal.timeout){clearTimeout(cal.timeout);}var el=cal.activeDiv;if(!el){return false;}var target=Calendar.getTargetElement(ev);ev||(ev=window.event);Calendar.removeClass(el,"active");if(target==el||target.parentNode==el){Calendar.cellClick(el,ev);}var mon=Calendar.findMonth(target);var date=null;if(mon){date=new Date(cal.date);if(mon.month!=date.getMonth()){date.setMonth(mon.month);cal.setDate(date);cal.dateClicked=false;cal.callHandler();}}else{var year=Calendar.findYear(target);if(year){date=new Date(cal.date);if(year.year!=date.getFullYear()){date.setFullYear(year.year);cal.setDate(date);cal.dateClicked=false;cal.callHandler();}}}with(Calendar){removeEvent(document,"mouseup",tableMouseUp);removeEvent(document,"mouseover",tableMouseOver);removeEvent(document,"mousemove",tableMouseOver);cal._hideCombos();_C=null;return stopEvent(ev);}};Calendar.tableMouseOver=function(ev){var cal=Calendar._C;if(!cal){return;}var el=cal.activeDiv;var target=Calendar.getTargetElement(ev);if(target==el||target.parentNode==el){Calendar.addClass(el,"hilite active");Calendar.addClass(el.parentNode,"rowhilite");}else{if(typeof el.navtype=="undefined"||(el.navtype!=50&&(el.navtype==0||Math.abs(el.navtype)>2)))Calendar.removeClass(el,"active");Calendar.removeClass(el,"hilite");Calendar.removeClass(el.parentNode,"rowhilite");}ev||(ev=window.event);if(el.navtype==50&&target!=el){var pos=Calendar.getAbsolutePos(el);var w=el.offsetWidth;var x=ev.clientX;var dx;var decrease=true;if(x>pos.x+w){dx=x-pos.x-w;decrease=false;}else dx=pos.x-x;if(dx<0)dx=0;var range=el._range;var current=el._current;var count=Math.floor(dx/10)%range.length;for(var i=range.length;--i>=0;)if(range[i]==current)break;while(count-->0)if(decrease){if(--i<0)i=range.length-1;}else if(++i>=range.length)i=0;var newval=range[i];el.innerHTML=newval;cal.onUpdateTime();}var mon=Calendar.findMonth(target);if(mon){if(mon.month!=cal.date.getMonth()){if(cal.hilitedMonth){Calendar.removeClass(cal.hilitedMonth,"hilite");}Calendar.addClass(mon,"hilite");cal.hilitedMonth=mon;}else if(cal.hilitedMonth){Calendar.removeClass(cal.hilitedMonth,"hilite");}}else{if(cal.hilitedMonth){Calendar.removeClass(cal.hilitedMonth,"hilite");}var year=Calendar.findYear(target);if(year){if(year.year!=cal.date.getFullYear()){if(cal.hilitedYear){Calendar.removeClass(cal.hilitedYear,"hilite");}Calendar.addClass(year,"hilite");cal.hilitedYear=year;}else if(cal.hilitedYear){Calendar.removeClass(cal.hilitedYear,"hilite");}}else if(cal.hilitedYear){Calendar.removeClass(cal.hilitedYear,"hilite");}}return Calendar.stopEvent(ev);};Calendar.tableMouseDown=function(ev){if(Calendar.getTargetElement(ev)==Calendar.getElement(ev)){return Calendar.stopEvent(ev);}};Calendar.calDragIt=function(ev){var cal=Calendar._C;if(!(cal&&cal.dragging)){return false;}var posX;var posY;if(Calendar.is_ie){posY=window.event.clientY+document.body.scrollTop;posX=window.event.clientX+document.body.scrollLeft;}else{posX=ev.pageX;posY=ev.pageY;}cal.hideShowCovered();var st=cal.element.style;st.left=(posX-cal.xOffs)+"px";st.top=(posY-cal.yOffs)+"px";return Calendar.stopEvent(ev);};Calendar.calDragEnd=function(ev){var cal=Calendar._C;if(!cal){return false;}cal.dragging=false;with(Calendar){removeEvent(document,"mousemove",calDragIt);removeEvent(document,"mouseup",calDragEnd);tableMouseUp(ev);}cal.hideShowCovered();};Calendar.dayMouseDown=function(ev){var el=Calendar.getElement(ev);if(el.disabled){return false;}var cal=el.calendar;cal.activeDiv=el;Calendar._C=cal;if(el.navtype!=300)with(Calendar){if(el.navtype==50){el._current=el.innerHTML;addEvent(document,"mousemove",tableMouseOver);}else addEvent(document,Calendar.is_ie5?"mousemove":"mouseover",tableMouseOver);addClass(el,"hilite active");addEvent(document,"mouseup",tableMouseUp);}else if(cal.isPopup){cal._dragStart(ev);}if(el.navtype==-1||el.navtype==1){if(cal.timeout)clearTimeout(cal.timeout);cal.timeout=setTimeout("Calendar.showMonthsCombo()",250);}else if(el.navtype==-2||el.navtype==2){if(cal.timeout)clearTimeout(cal.timeout);cal.timeout=setTimeout((el.navtype>0)?"Calendar.showYearsCombo(true)":"Calendar.showYearsCombo(false)",250);}else{cal.timeout=null;}return Calendar.stopEvent(ev);};Calendar.dayMouseDblClick=function(ev){Calendar.cellClick(Calendar.getElement(ev),ev||window.event);if(Calendar.is_ie){document.selection.empty();}};Calendar.dayMouseOver=function(ev){var el=Calendar.getElement(ev);if(Calendar.isRelated(el,ev)||Calendar._C||el.disabled){return false;}if(el.ttip){if(el.ttip.substr(0,1)=="_"){el.ttip=el.caldate.print(el.calendar.ttDateFormat)+el.ttip.substr(1);}el.calendar.tooltips.innerHTML=el.ttip;}if(el.navtype!=300){Calendar.addClass(el,"hilite");if(el.caldate){Calendar.addClass(el.parentNode,"rowhilite");}}return Calendar.stopEvent(ev);};Calendar.dayMouseOut=function(ev){with(Calendar){var el=getElement(ev);if(isRelated(el,ev)||_C||el.disabled)return false;removeClass(el,"hilite");if(el.caldate)removeClass(el.parentNode,"rowhilite");if(el.calendar)el.calendar.tooltips.innerHTML=_TT["SEL_DATE"];return stopEvent(ev);}};Calendar.cellClick=function(el,ev){var cal=el.calendar;var closing=false;var newdate=false;var date=null;if(typeof el.navtype=="undefined"){if(cal.currentDateEl){Calendar.removeClass(cal.currentDateEl,"selected");Calendar.addClass(el,"selected");closing=(cal.currentDateEl==el);if(!closing){cal.currentDateEl=el;}}cal.date.setDateOnly(el.caldate);date=cal.date;var other_month=!(cal.dateClicked=!el.otherMonth);if(!other_month&&!cal.currentDateEl)cal._toggleMultipleDate(new Date(date));else newdate=!el.disabled;if(other_month)cal._init(cal.firstDayOfWeek,date);}else{if(el.navtype==200){Calendar.removeClass(el,"hilite");cal.callCloseHandler();return;}date=new Date(cal.date);if(el.navtype==0)date.setDateOnly(new Date());cal.dateClicked=false;var year=date.getFullYear();var mon=date.getMonth();function setMonth(m){var day=date.getDate();var max=date.getMonthDays(m);if(day>max){date.setDate(max);}date.setMonth(m);};switch(el.navtype){case 400:Calendar.removeClass(el,"hilite");var text=Calendar._TT["ABOUT"];if(typeof text!="undefined"){text+=cal.showsTime?Calendar._TT["ABOUT_TIME"]:"";}else{text="Help and about box text is not translated into this language.\n"+"If you know this language and you feel generous please update\n"+"the corresponding file in \"lang\" subdir to match calendar-en.js\n"+"and send it back to <mihai_bazon@yahoo.com> to get it into the distribution ;-)\n\n"+"Thank you!\n"+"http://dynarch.com/mishoo/calendar.epl\n";}alert(text);return;case-2:if(year>cal.minYear){date.setFullYear(year-1);}break;case-1:if(mon>0){setMonth(mon-1);}else if(year-->cal.minYear){date.setFullYear(year);setMonth(11);}break;case 1:if(mon<11){setMonth(mon+1);}else if(year<cal.maxYear){date.setFullYear(year+1);setMonth(0);}break;case 2:if(year<cal.maxYear){date.setFullYear(year+1);}break;case 100:cal.setFirstDayOfWeek(el.fdow);return;case 50:var range=el._range;var current=el.innerHTML;for(var i=range.length;--i>=0;)if(range[i]==current)break;if(ev&&ev.shiftKey){if(--i<0)i=range.length-1;}else if(++i>=range.length)i=0;var newval=range[i];el.innerHTML=newval;cal.onUpdateTime();return;case 0:if((typeof cal.getDateStatus=="function")&&cal.getDateStatus(date,date.getFullYear(),date.getMonth(),date.getDate())){return false;}break;}if(!date.equalsTo(cal.date)){cal.setDate(date);newdate=true;}else if(el.navtype==0)newdate=closing=true;}if(newdate){ev&&cal.callHandler();}if(closing){Calendar.removeClass(el,"hilite");ev&&cal.callCloseHandler();}};Calendar.prototype.create=function(_par){var parent=null;if(!_par){parent=document.getElementsByTagName("body")[0];this.isPopup=true;}else{parent=_par;this.isPopup=false;}this.date=this.dateStr?new Date(this.dateStr):new Date();var table=Calendar.createElement("table");this.table=table;table.cellSpacing=0;table.cellPadding=0;table.calendar=this;Calendar.addEvent(table,"mousedown",Calendar.tableMouseDown);var div=Calendar.createElement("div");this.element=div;div.className="calendar";if(this.isPopup){div.style.position="absolute";div.style.display="none";}div.appendChild(table);var thead=Calendar.createElement("thead",table);var cell=null;var row=null;var cal=this;var hh=function(text,cs,navtype){cell=Calendar.createElement("td",row);cell.colSpan=cs;cell.className="button";if(navtype!=0&&Math.abs(navtype)<=2)cell.className+=" nav";Calendar._add_evs(cell);cell.calendar=cal;cell.navtype=navtype;cell.innerHTML="<div unselectable='on'>"+text+"</div>";return cell;};row=Calendar.createElement("tr",thead);var title_length=6;(this.isPopup)&&--title_length;(this.weekNumbers)&&++title_length;hh("?",1,400).ttip=Calendar._TT["INFO"];this.title=hh("",title_length,300);this.title.className="title";if(this.isPopup){this.title.ttip=Calendar._TT["DRAG_TO_MOVE"];this.title.style.cursor="move";hh("&#x00d7;",1,200).ttip=Calendar._TT["CLOSE"];}row=Calendar.createElement("tr",thead);row.className="headrow";this._nav_py=hh("&#x00ab;",1,-2);this._nav_py.ttip=Calendar._TT["PREV_YEAR"];this._nav_pm=hh("&#x2039;",1,-1);this._nav_pm.ttip=Calendar._TT["PREV_MONTH"];this._nav_now=hh(Calendar._TT["TODAY"],this.weekNumbers?4:3,0);this._nav_now.ttip=Calendar._TT["GO_TODAY"];this._nav_nm=hh("&#x203a;",1,1);this._nav_nm.ttip=Calendar._TT["NEXT_MONTH"];this._nav_ny=hh("&#x00bb;",1,2);this._nav_ny.ttip=Calendar._TT["NEXT_YEAR"];row=Calendar.createElement("tr",thead);row.className="daynames";if(this.weekNumbers){cell=Calendar.createElement("td",row);cell.className="name wn";cell.innerHTML=Calendar._TT["WK"];}for(var i=7;i>0;--i){cell=Calendar.createElement("td",row);if(!i){cell.navtype=100;cell.calendar=this;Calendar._add_evs(cell);}}this.firstdayname=(this.weekNumbers)?row.firstChild.nextSibling:row.firstChild;this._displayWeekdays();var tbody=Calendar.createElement("tbody",table);this.tbody=tbody;for(i=6;i>0;--i){row=Calendar.createElement("tr",tbody);if(this.weekNumbers){cell=Calendar.createElement("td",row);}for(var j=7;j>0;--j){cell=Calendar.createElement("td",row);cell.calendar=this;Calendar._add_evs(cell);}}if(this.showsTime){row=Calendar.createElement("tr",tbody);row.className="time";cell=Calendar.createElement("td",row);cell.className="time";cell.colSpan=2;cell.innerHTML=Calendar._TT["TIME"]||"&nbsp;";cell=Calendar.createElement("td",row);cell.className="time";cell.colSpan=this.weekNumbers?4:3;(function(){function makeTimePart(className,init,range_start,range_end){var part=Calendar.createElement("span",cell);part.className=className;part.innerHTML=init;part.calendar=cal;part.ttip=Calendar._TT["TIME_PART"];part.navtype=50;part._range=[];if(typeof range_start!="number")part._range=range_start;else{for(var i=range_start;i<=range_end;++i){var txt;if(i<10&&range_end>=10)txt='0'+i;else txt=''+i;part._range[part._range.length]=txt;}}Calendar._add_evs(part);return part;};var hrs=cal.date.getHours();var mins=cal.date.getMinutes();var t12=!cal.time24;var pm=(hrs>12);if(t12&&pm)hrs-=12;var H=makeTimePart("hour",hrs,t12?1:0,t12?12:23);var span=Calendar.createElement("span",cell);span.innerHTML=":";span.className="colon";var M=makeTimePart("minute",mins,0,59);var AP=null;cell=Calendar.createElement("td",row);cell.className="time";cell.colSpan=2;if(t12)AP=makeTimePart("ampm",pm?"pm":"am",["am","pm"]);else cell.innerHTML="&nbsp;";cal.onSetTime=function(){var pm,hrs=this.date.getHours(),mins=this.date.getMinutes();if(t12){pm=(hrs>=12);if(pm)hrs-=12;if(hrs==0)hrs=12;AP.innerHTML=pm?"pm":"am";}H.innerHTML=(hrs<10)?("0"+hrs):hrs;M.innerHTML=(mins<10)?("0"+mins):mins;};cal.onUpdateTime=function(){var date=this.date;var h=parseInt(H.innerHTML,10);if(t12){if(/pm/i.test(AP.innerHTML)&&h<12)h+=12;else if(/am/i.test(AP.innerHTML)&&h==12)h=0;}var d=date.getDate();var m=date.getMonth();var y=date.getFullYear();date.setHours(h);date.setMinutes(parseInt(M.innerHTML,10));date.setFullYear(y);date.setMonth(m);date.setDate(d);this.dateClicked=false;this.callHandler();};})();}else{this.onSetTime=this.onUpdateTime=function(){};}var tfoot=Calendar.createElement("tfoot",table);row=Calendar.createElement("tr",tfoot);row.className="footrow";cell=hh(Calendar._TT["SEL_DATE"],this.weekNumbers?8:7,300);cell.className="ttip";if(this.isPopup){cell.ttip=Calendar._TT["DRAG_TO_MOVE"];cell.style.cursor="move";}this.tooltips=cell;div=Calendar.createElement("div",this.element);this.monthsCombo=div;div.className="combo";for(i=0;i<Calendar._MN.length;++i){var mn=Calendar.createElement("div");mn.className=Calendar.is_ie?"label-IEfix":"label";mn.month=i;mn.innerHTML=Calendar._SMN[i];div.appendChild(mn);}div=Calendar.createElement("div",this.element);this.yearsCombo=div;div.className="combo";for(i=12;i>0;--i){var yr=Calendar.createElement("div");yr.className=Calendar.is_ie?"label-IEfix":"label";div.appendChild(yr);}this._init(this.firstDayOfWeek,this.date);parent.appendChild(this.element);};Calendar._keyEvent=function(ev){var cal=window._dynarch_popupCalendar;if(!cal||cal.multiple)return false;(Calendar.is_ie)&&(ev=window.event);var act=(Calendar.is_ie||ev.type=="keypress"),K=ev.keyCode;if(ev.ctrlKey){switch(K){case 37:act&&Calendar.cellClick(cal._nav_pm);break;case 38:act&&Calendar.cellClick(cal._nav_py);break;case 39:act&&Calendar.cellClick(cal._nav_nm);break;case 40:act&&Calendar.cellClick(cal._nav_ny);break;default:return false;}}else switch(K){case 32:Calendar.cellClick(cal._nav_now);break;case 27:act&&cal.callCloseHandler();break;case 37:case 38:case 39:case 40:if(act){var prev,x,y,ne,el,step;prev=K==37||K==38;step=(K==37||K==39)?1:7;function setVars(){el=cal.currentDateEl;var p=el.pos;x=p&15;y=p>>4;ne=cal.ar_days[y][x];};setVars();function prevMonth(){var date=new Date(cal.date);date.setDate(date.getDate()-step);cal.setDate(date);};function nextMonth(){var date=new Date(cal.date);date.setDate(date.getDate()+step);cal.setDate(date);};while(1){switch(K){case 37:if(--x>=0)ne=cal.ar_days[y][x];else{x=6;K=38;continue;}break;case 38:if(--y>=0)ne=cal.ar_days[y][x];else{prevMonth();setVars();}break;case 39:if(++x<7)ne=cal.ar_days[y][x];else{x=0;K=40;continue;}break;case 40:if(++y<cal.ar_days.length)ne=cal.ar_days[y][x];else{nextMonth();setVars();}break;}break;}if(ne){if(!ne.disabled)Calendar.cellClick(ne);else if(prev)prevMonth();else nextMonth();}}break;case 13:if(act)Calendar.cellClick(cal.currentDateEl,ev);break;default:return false;}return Calendar.stopEvent(ev);};Calendar.prototype._init=function(firstDayOfWeek,date){var today=new Date(),TY=today.getFullYear(),TM=today.getMonth(),TD=today.getDate();this.table.style.visibility="hidden";var year=date.getFullYear();if(year<this.minYear){year=this.minYear;date.setFullYear(year);}else if(year>this.maxYear){year=this.maxYear;date.setFullYear(year);}this.firstDayOfWeek=firstDayOfWeek;this.date=new Date(date);var month=date.getMonth();var mday=date.getDate();var no_days=date.getMonthDays();date.setDate(1);var day1=(date.getDay()-this.firstDayOfWeek)%7;if(day1<0)day1+=7;date.setDate(-day1);date.setDate(date.getDate()+1);var row=this.tbody.firstChild;var MN=Calendar._SMN[month];var ar_days=this.ar_days=new Array();var weekend=Calendar._TT["WEEKEND"];var dates=this.multiple?(this.datesCells={}):null;for(var i=0;i<6;++i,row=row.nextSibling){var cell=row.firstChild;if(this.weekNumbers){cell.className="day wn";cell.innerHTML=date.getWeekNumber();cell=cell.nextSibling;}row.className="daysrow";var hasdays=false,iday,dpos=ar_days[i]=[];for(var j=0;j<7;++j,cell=cell.nextSibling,date.setDate(iday+1)){iday=date.getDate();var wday=date.getDay();cell.className="day";cell.pos=i<<4|j;dpos[j]=cell;var current_month=(date.getMonth()==month);if(!current_month){if(this.showsOtherMonths){cell.className+=" othermonth";cell.otherMonth=true;}else{cell.className="emptycell";cell.innerHTML="&nbsp;";cell.disabled=true;continue;}}else{cell.otherMonth=false;hasdays=true;}cell.disabled=false;cell.innerHTML=this.getDateText?this.getDateText(date,iday):iday;if(dates)dates[date.print("%Y%m%d")]=cell;if(this.getDateStatus){var status=this.getDateStatus(date,year,month,iday);if(this.getDateToolTip){var toolTip=this.getDateToolTip(date,year,month,iday);if(toolTip)cell.title=toolTip;}if(status===true){cell.className+=" disabled";cell.disabled=true;}else{if(/disabled/i.test(status))cell.disabled=true;cell.className+=" "+status;}}if(!cell.disabled){cell.caldate=new Date(date);cell.ttip="_";if(!this.multiple&&current_month&&iday==mday&&this.hiliteToday){cell.className+=" selected";this.currentDateEl=cell;}if(date.getFullYear()==TY&&date.getMonth()==TM&&iday==TD){cell.className+=" today";cell.ttip+=Calendar._TT["PART_TODAY"];}if(weekend.indexOf(wday.toString())!=-1)cell.className+=cell.otherMonth?" oweekend":" weekend";}}if(!(hasdays||this.showsOtherMonths))row.className="emptyrow";}this.title.innerHTML=Calendar._MN[month]+", "+year;this.onSetTime();this.table.style.visibility="visible";this._initMultipleDates();};Calendar.prototype._initMultipleDates=function(){if(this.multiple){for(var i in this.multiple){var cell=this.datesCells[i];var d=this.multiple[i];if(!d)continue;if(cell)cell.className+=" selected";}}};Calendar.prototype._toggleMultipleDate=function(date){if(this.multiple){var ds=date.print("%Y%m%d");var cell=this.datesCells[ds];if(cell){var d=this.multiple[ds];if(!d){Calendar.addClass(cell,"selected");this.multiple[ds]=date;}else{Calendar.removeClass(cell,"selected");delete this.multiple[ds];}}}};Calendar.prototype.setDateToolTipHandler=function(unaryFunction){this.getDateToolTip=unaryFunction;};Calendar.prototype.setDate=function(date){if(!date.equalsTo(this.date)){this._init(this.firstDayOfWeek,date);}};Calendar.prototype.refresh=function(){this._init(this.firstDayOfWeek,this.date);};Calendar.prototype.setFirstDayOfWeek=function(firstDayOfWeek){this._init(firstDayOfWeek,this.date);this._displayWeekdays();};Calendar.prototype.setDateStatusHandler=Calendar.prototype.setDisabledHandler=function(unaryFunction){this.getDateStatus=unaryFunction;};Calendar.prototype.setRange=function(a,z){this.minYear=a;this.maxYear=z;};Calendar.prototype.callHandler=function(){if(this.onSelected){this.onSelected(this,this.date.print(this.dateFormat));}};Calendar.prototype.callCloseHandler=function(){if(this.onClose){this.onClose(this);}this.hideShowCovered();};Calendar.prototype.destroy=function(){var el=this.element.parentNode;el.removeChild(this.element);Calendar._C=null;window._dynarch_popupCalendar=null;};Calendar.prototype.reparent=function(new_parent){var el=this.element;el.parentNode.removeChild(el);new_parent.appendChild(el);};Calendar._checkCalendar=function(ev){var calendar=window._dynarch_popupCalendar;if(!calendar){return false;}var el=Calendar.is_ie?Calendar.getElement(ev):Calendar.getTargetElement(ev);for(;el!=null&&el!=calendar.element;el=el.parentNode);if(el==null){window._dynarch_popupCalendar.callCloseHandler();return Calendar.stopEvent(ev);}};Calendar.prototype.show=function(){var rows=this.table.getElementsByTagName("tr");for(var i=rows.length;i>0;){var row=rows[--i];Calendar.removeClass(row,"rowhilite");var cells=row.getElementsByTagName("td");for(var j=cells.length;j>0;){var cell=cells[--j];Calendar.removeClass(cell,"hilite");Calendar.removeClass(cell,"active");}}this.element.style.display="block";this.hidden=false;if(this.isPopup){window._dynarch_popupCalendar=this;Calendar.addEvent(document,"keydown",Calendar._keyEvent);Calendar.addEvent(document,"keypress",Calendar._keyEvent);Calendar.addEvent(document,"mousedown",Calendar._checkCalendar);}this.hideShowCovered();};Calendar.prototype.hide=function(){if(this.isPopup){Calendar.removeEvent(document,"keydown",Calendar._keyEvent);Calendar.removeEvent(document,"keypress",Calendar._keyEvent);Calendar.removeEvent(document,"mousedown",Calendar._checkCalendar);}this.element.style.display="none";this.hidden=true;this.hideShowCovered();};Calendar.prototype.showAt=function(x,y){var s=this.element.style;s.left=x+"px";s.top=y+"px";this.show();};Calendar.prototype.showAtElement=function(el,opts){var self=this;var p=Calendar.getAbsolutePos(el);if(!opts||typeof opts!="string"){this.showAt(p.x,p.y+el.offsetHeight);return true;}function fixPosition(box){if(box.x<0)box.x=0;if(box.y<0)box.y=0;var cp=document.createElement("div");var s=cp.style;s.position="absolute";s.right=s.bottom=s.width=s.height="0px";document.body.appendChild(cp);var br=Calendar.getAbsolutePos(cp);document.body.removeChild(cp);if(Calendar.is_ie){br.y+=document.body.scrollTop;br.x+=document.body.scrollLeft;}else{br.y+=window.scrollY;br.x+=window.scrollX;}var tmp=box.x+box.width-br.x;if(tmp>0)box.x-=tmp;tmp=box.y+box.height-br.y;if(tmp>0)box.y-=tmp;};this.element.style.display="block";Calendar.continuation_for_the_fucking_khtml_browser=function(){var w=self.element.offsetWidth;var h=self.element.offsetHeight;self.element.style.display="none";var valign=opts.substr(0,1);var halign="l";if(opts.length>1){halign=opts.substr(1,1);}switch(valign){case "T":p.y-=h;break;case "B":p.y+=el.offsetHeight;break;case "C":p.y+=(el.offsetHeight-h)/2;break;case "t":p.y+=el.offsetHeight-h;break;case "b":break;}switch(halign){case "L":p.x-=w;break;case "R":p.x+=el.offsetWidth;break;case "C":p.x+=(el.offsetWidth-w)/2;break;case "l":p.x+=el.offsetWidth-w;break;case "r":break;}p.width=w;p.height=h+40;self.monthsCombo.style.display="none";fixPosition(p);self.showAt(p.x,p.y);};if(Calendar.is_khtml)setTimeout("Calendar.continuation_for_the_fucking_khtml_browser()",10);else Calendar.continuation_for_the_fucking_khtml_browser();};Calendar.prototype.setDateFormat=function(str){this.dateFormat=str;};Calendar.prototype.setTtDateFormat=function(str){this.ttDateFormat=str;};Calendar.prototype.parseDate=function(str,fmt){if(!fmt)fmt=this.dateFormat;this.setDate(Date.parseDate(str,fmt));};Calendar.prototype.hideShowCovered=function(){if(!Calendar.is_ie&&!Calendar.is_opera)return;function getVisib(obj){var value=obj.style.visibility;if(!value){if(document.defaultView&&typeof(document.defaultView.getComputedStyle)=="function"){if(!Calendar.is_khtml)value=document.defaultView. getComputedStyle(obj,"").getPropertyValue("visibility");else value='';}else if(obj.currentStyle){value=obj.currentStyle.visibility;}else value='';}return value;};var tags=new Array("applet","iframe","select");var el=this.element;var p=Calendar.getAbsolutePos(el);var EX1=p.x;var EX2=el.offsetWidth+EX1;var EY1=p.y;var EY2=el.offsetHeight+EY1;for(var k=tags.length;k>0;){var ar=document.getElementsByTagName(tags[--k]);var cc=null;for(var i=ar.length;i>0;){cc=ar[--i];p=Calendar.getAbsolutePos(cc);var CX1=p.x;var CX2=cc.offsetWidth+CX1;var CY1=p.y;var CY2=cc.offsetHeight+CY1;if(this.hidden||(CX1>EX2)||(CX2<EX1)||(CY1>EY2)||(CY2<EY1)){if(!cc.__msh_save_visibility){cc.__msh_save_visibility=getVisib(cc);}cc.style.visibility=cc.__msh_save_visibility;}else{if(!cc.__msh_save_visibility){cc.__msh_save_visibility=getVisib(cc);}cc.style.visibility="hidden";}}}};Calendar.prototype._displayWeekdays=function(){var fdow=this.firstDayOfWeek;var cell=this.firstdayname;var weekend=Calendar._TT["WEEKEND"];for(var i=0;i<7;++i){cell.className="day name";var realday=(i+fdow)%7;if(i){cell.ttip=Calendar._TT["DAY_FIRST"].replace("%s",Calendar._DN[realday]);cell.navtype=100;cell.calendar=this;cell.fdow=realday;Calendar._add_evs(cell);}if(weekend.indexOf(realday.toString())!=-1){Calendar.addClass(cell,"weekend");}cell.innerHTML=Calendar._SDN[(i+fdow)%7];cell=cell.nextSibling;}};Calendar.prototype._hideCombos=function(){this.monthsCombo.style.display="none";this.yearsCombo.style.display="none";};Calendar.prototype._dragStart=function(ev){if(this.dragging){return;}this.dragging=true;var posX;var posY;if(Calendar.is_ie){posY=window.event.clientY+document.body.scrollTop;posX=window.event.clientX+document.body.scrollLeft;}else{posY=ev.clientY+window.scrollY;posX=ev.clientX+window.scrollX;}var st=this.element.style;this.xOffs=posX-parseInt(st.left);this.yOffs=posY-parseInt(st.top);with(Calendar){addEvent(document,"mousemove",calDragIt);addEvent(document,"mouseup",calDragEnd);}};Date._MD=new Array(31,28,31,30,31,30,31,31,30,31,30,31);Date.SECOND=1000;Date.MINUTE=60*Date.SECOND;Date.HOUR=60*Date.MINUTE;Date.DAY=24*Date.HOUR;Date.WEEK=7*Date.DAY;Date.parseDate=function(str,fmt){var today=new Date();var y=0;var m=-1;var d=0;var a=str.split(/\W+/);var b=fmt.match(/%./g);var i=0,j=0;var hr=0;var min=0;for(i=0;i<a.length;++i){if(!a[i])continue;switch(b[i]){case "%d":case "%e":d=parseInt(a[i],10);break;case "%m":m=parseInt(a[i],10)-1;break;case "%Y":case "%y":y=parseInt(a[i],10);(y<100)&&(y+=(y>29)?1900:2000);break;case "%b":case "%B":for(j=0;j<12;++j){if(Calendar._MN[j].substr(0,a[i].length).toLowerCase()==a[i].toLowerCase()){m=j;break;}}break;case "%H":case "%I":case "%k":case "%l":hr=parseInt(a[i],10);break;case "%P":case "%p":if(/pm/i.test(a[i])&&hr<12)hr+=12;else if(/am/i.test(a[i])&&hr>=12)hr-=12;break;case "%M":min=parseInt(a[i],10);break;}}if(isNaN(y))y=today.getFullYear();if(isNaN(m))m=today.getMonth();if(isNaN(d))d=today.getDate();if(isNaN(hr))hr=today.getHours();if(isNaN(min))min=today.getMinutes();if(y!=0&&m!=-1&&d!=0)return new Date(y,m,d,hr,min,0);y=0;m=-1;d=0;for(i=0;i<a.length;++i){if(a[i].search(/[a-zA-Z]+/)!=-1){var t=-1;for(j=0;j<12;++j){if(Calendar._MN[j].substr(0,a[i].length).toLowerCase()==a[i].toLowerCase()){t=j;break;}}if(t!=-1){if(m!=-1){d=m+1;}m=t;}}else if(parseInt(a[i],10)<=12&&m==-1){m=a[i]-1;}else if(parseInt(a[i],10)>31&&y==0){y=parseInt(a[i],10);(y<100)&&(y+=(y>29)?1900:2000);}else if(d==0){d=a[i];}}if(y==0)y=today.getFullYear();if(m!=-1&&d!=0)return new Date(y,m,d,hr,min,0);return today;};Date.prototype.getMonthDays=function(month){var year=this.getFullYear();if(typeof month=="undefined"){month=this.getMonth();}if(((0==(year%4))&&((0!=(year%100))||(0==(year%400))))&&month==1){return 29;}else{return Date._MD[month];}};Date.prototype.getDayOfYear=function(){var now=new Date(this.getFullYear(),this.getMonth(),this.getDate(),0,0,0);var then=new Date(this.getFullYear(),0,0,0,0,0);var time=now-then;return Math.floor(time/Date.DAY);};Date.prototype.getWeekNumber=function(){var d=new Date(this.getFullYear(),this.getMonth(),this.getDate(),0,0,0);var DoW=d.getDay();d.setDate(d.getDate()-(DoW+6)%7+3);var ms=d.valueOf();d.setMonth(0);d.setDate(4);return Math.round((ms-d.valueOf())/(7*864e5))+1;};Date.prototype.equalsTo=function(date){return((this.getFullYear()==date.getFullYear())&&(this.getMonth()==date.getMonth())&&(this.getDate()==date.getDate())&&(this.getHours()==date.getHours())&&(this.getMinutes()==date.getMinutes()));};Date.prototype.setDateOnly=function(date){var tmp=new Date(date);this.setDate(1);this.setFullYear(tmp.getFullYear());this.setMonth(tmp.getMonth());this.setDate(tmp.getDate());};Date.prototype.print=function(str){var m=this.getMonth();var d=this.getDate();var y=this.getFullYear();var wn=this.getWeekNumber();var w=this.getDay();var s={};var hr=this.getHours();var pm=(hr>=12);var ir=(pm)?(hr-12):hr;var dy=this.getDayOfYear();if(ir==0)ir=12;var min=this.getMinutes();var sec=this.getSeconds();s["%a"]=Calendar._SDN[w];s["%A"]=Calendar._DN[w];s["%b"]=Calendar._SMN[m];s["%B"]=Calendar._MN[m];s["%C"]=1+Math.floor(y/100);s["%d"]=(d<10)?("0"+d):d;s["%e"]=d;s["%H"]=(hr<10)?("0"+hr):hr;s["%I"]=(ir<10)?("0"+ir):ir;s["%j"]=(dy<100)?((dy<10)?("00"+dy):("0"+dy)):dy;s["%k"]=hr;s["%l"]=ir;s["%m"]=(m<9)?("0"+(1+m)):(1+m);s["%M"]=(min<10)?("0"+min):min;s["%n"]="\n";s["%p"]=pm?"PM":"AM";s["%P"]=pm?"pm":"am";s["%s"]=Math.floor(this.getTime()/1000);s["%S"]=(sec<10)?("0"+sec):sec;s["%t"]="\t";s["%U"]=s["%W"]=s["%V"]=(wn<10)?("0"+wn):wn;s["%u"]=w+1;s["%w"]=w;s["%y"]=(''+y).substr(2,2);s["%Y"]=y;s["%%"]="%";var re=/%./g;if(!Calendar.is_ie5&&!Calendar.is_khtml)return str.replace(re,function(par){return s[par]||par;});var a=str.match(re);for(var i=0;i<a.length;i++){var tmp=s[a[i]];if(tmp){re=new RegExp(a[i],'g');str=str.replace(re,tmp);}}return str;};Date.prototype.__msh_oldSetFullYear=Date.prototype.setFullYear;Date.prototype.setFullYear=function(y){var d=new Date(this);d.__msh_oldSetFullYear(y);if(d.getMonth()!=this.getMonth())this.setDate(28);this.__msh_oldSetFullYear(y);};window._dynarch_popupCalendar=null; \ No newline at end of file
diff --git a/js/jscalendar/img.gif b/js/jscalendar/img.gif
new file mode 100644
index 0000000..cd2c4a5
--- /dev/null
+++ b/js/jscalendar/img.gif
Binary files differ
diff --git a/js/jscalendar/lang/calendar-af.js b/js/jscalendar/lang/calendar-af.js
new file mode 100644
index 0000000..aeda581
--- /dev/null
+++ b/js/jscalendar/lang/calendar-af.js
@@ -0,0 +1,39 @@
+// ** I18N Afrikaans
+Calendar._DN = new Array
+("Sondag",
+ "Maandag",
+ "Dinsdag",
+ "Woensdag",
+ "Donderdag",
+ "Vrydag",
+ "Saterdag",
+ "Sondag");
+Calendar._MN = new Array
+("Januarie",
+ "Februarie",
+ "Maart",
+ "April",
+ "Mei",
+ "Junie",
+ "Julie",
+ "Augustus",
+ "September",
+ "Oktober",
+ "November",
+ "Desember");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["TOGGLE"] = "Verander eerste dag van die week";
+Calendar._TT["PREV_YEAR"] = "Vorige jaar (hou vir keuselys)";
+Calendar._TT["PREV_MONTH"] = "Vorige maand (hou vir keuselys)";
+Calendar._TT["GO_TODAY"] = "Gaan na vandag";
+Calendar._TT["NEXT_MONTH"] = "Volgende maand (hou vir keuselys)";
+Calendar._TT["NEXT_YEAR"] = "Volgende jaar (hou vir keuselys)";
+Calendar._TT["SEL_DATE"] = "Kies datum";
+Calendar._TT["DRAG_TO_MOVE"] = "Sleep om te skuif";
+Calendar._TT["PART_TODAY"] = " (vandag)";
+Calendar._TT["MON_FIRST"] = "Vertoon Maandag eerste";
+Calendar._TT["SUN_FIRST"] = "Display Sunday first";
+Calendar._TT["CLOSE"] = "Close";
+Calendar._TT["TODAY"] = "Today";
diff --git a/js/jscalendar/lang/calendar-al.js b/js/jscalendar/lang/calendar-al.js
new file mode 100644
index 0000000..4f701cf
--- /dev/null
+++ b/js/jscalendar/lang/calendar-al.js
@@ -0,0 +1,101 @@
+// Calendar ALBANIAN language
+//author Rigels Gordani rige@hotmail.com
+
+// ditet
+Calendar._DN = new Array
+("E Diele",
+"E Hene",
+"E Marte",
+"E Merkure",
+"E Enjte",
+"E Premte",
+"E Shtune",
+"E Diele");
+
+//ditet shkurt
+Calendar._SDN = new Array
+("Die",
+"Hen",
+"Mar",
+"Mer",
+"Enj",
+"Pre",
+"Sht",
+"Die");
+
+// muajt
+Calendar._MN = new Array
+("Janar",
+"Shkurt",
+"Mars",
+"Prill",
+"Maj",
+"Qeshor",
+"Korrik",
+"Gusht",
+"Shtator",
+"Tetor",
+"Nentor",
+"Dhjetor");
+
+// muajte shkurt
+Calendar._SMN = new Array
+("Jan",
+"Shk",
+"Mar",
+"Pri",
+"Maj",
+"Qes",
+"Kor",
+"Gus",
+"Sht",
+"Tet",
+"Nen",
+"Dhj");
+
+// ndihmesa
+Calendar._TT = {};
+Calendar._TT["INFO"] = "Per kalendarin";
+
+Calendar._TT["ABOUT"] =
+"Zgjedhes i ores/dates ne DHTML \n" +
+"\n\n" +"Zgjedhja e Dates:\n" +
+"- Perdor butonat \xab, \xbb per te zgjedhur vitin\n" +
+"- Perdor butonat" + String.fromCharCode(0x2039) + ", " +
+String.fromCharCode(0x203a) +
+" per te zgjedhur muajin\n" +
+"- Mbani shtypur butonin e mousit per nje zgjedje me te shpejte.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Zgjedhja e kohes:\n" +
+"- Kliko tek ndonje nga pjeset e ores per ta rritur ate\n" +
+"- ose kliko me Shift per ta zvogeluar ate\n" +
+"- ose cliko dhe terhiq per zgjedhje me te shpejte.";
+
+Calendar._TT["PREV_YEAR"] = "Viti i shkuar (prit per menune)";
+Calendar._TT["PREV_MONTH"] = "Muaji i shkuar (prit per menune)";
+Calendar._TT["GO_TODAY"] = "Sot";
+Calendar._TT["NEXT_MONTH"] = "Muaji i ardhshem (prit per menune)";
+Calendar._TT["NEXT_YEAR"] = "Viti i ardhshem (prit per menune)";
+Calendar._TT["SEL_DATE"] = "Zgjidh daten";
+Calendar._TT["DRAG_TO_MOVE"] = "Terhiqe per te levizur";
+Calendar._TT["PART_TODAY"] = " (sot)";
+
+// "%s" eshte dita e pare e javes
+// %s do te zevendesohet me emrin e dite
+Calendar._TT["DAY_FIRST"] = "Trego te %s te paren";
+
+
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "Mbyll";
+Calendar._TT["TODAY"] = "Sot";
+Calendar._TT["TIME_PART"] = "Kliko me (Shift-)ose terhiqe per te ndryshuar
+vleren";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d";
+Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e";
+
+Calendar._TT["WK"] = "Java";
+Calendar._TT["TIME"] = "Koha:";
+
diff --git a/js/jscalendar/lang/calendar-bg.js b/js/jscalendar/lang/calendar-bg.js
new file mode 100644
index 0000000..664eb70
--- /dev/null
+++ b/js/jscalendar/lang/calendar-bg.js
@@ -0,0 +1,131 @@
+// ** I18N
+
+// Calendar BG language
+// Author: Mihai Bazon, <mihai_bazon@yahoo.com>
+// Translator: Valentin Sheiretsky, <valio@valio.eu.org>
+// Translator: Doncho N. Gunchev, <gunchev@gmail.com> 2006-11-20
+// Encoding: UTF-8
+// Distributed under the same terms as the calendar itself.
+
+// For translators: please use UTF-8 if possible. We strongly believe that
+// Unicode is the answer to a real internationalized world. Also please
+// include your contact information in the header, as can be seen above.
+
+// full day names
+Calendar._DN = new Array
+("ĐеделÑ",
+ "ĐŸĐ¾Đ½ĐµĐ´ĐµĐ»Đ½Đ¸Đº",
+ "Đ’Ñ‚Đ¾Ñ€Đ½Đ¸Đº",
+ "Đ¡Ñ€ÑĐ´Đ°",
+ "Đ§ĐµÑ‚Đ²ÑртÑĐº",
+ "ĐŸĐµÑ‚ÑĐº",
+ "Đ¡ÑĐ±Đ¾Ñ‚Đ°",
+ "ĐеделÑ");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary. We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+// Calendar._SDN_len = N; // short day name length
+// Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("Đед",
+ "ĐŸĐ¾Đ½",
+ "Đ’Ñ‚Đ¾",
+ "Đ¡Ñ€Ñ",
+ "Đ§ĐµÑ‚",
+ "ĐŸĐµÑ‚",
+ "Đ¡Ñб",
+ "Đед");
+
+// First day of the week. "0" means display Sunday first, "1" means display
+// Monday first, etc.
+Calendar._FD = 1;
+
+// full month names
+Calendar._MN = new Array
+("Đ¯Đ½ÑƒĐ°Ñ€Đ¸",
+ "Đ¤ĐµĐ²Ñ€ÑƒĐ°Ñ€Đ¸",
+ "ĐœĐ°Ñ€Ñ‚",
+ "ĐĐ¿Ñ€Đ¸Đ»",
+ "ĐœĐ°Đ¹",
+ "Đ®Đ½Đ¸",
+ "Юли",
+ "ĐĐ²Đ³ÑƒÑÑ‚",
+ "Đ¡ĐµĐ¿Ñ‚ĐµĐ¼Đ²Ñ€Đ¸",
+ "ĐĐºÑ‚Đ¾Đ¼Đ²Ñ€Đ¸",
+ "ĐĐ¾ĐµĐ¼Đ²Ñ€Đ¸",
+ "Đ”ĐµĐºĐµĐ¼Đ²Ñ€Đ¸");
+
+// short month names
+Calendar._SMN = new Array
+("Đ¯Đ½Ñƒ",
+ "Đ¤ĐµĐ²",
+ "ĐœĐ°Ñ€",
+ "ĐĐ¿Ñ€",
+ "ĐœĐ°Đ¹",
+ "Đ®Đ½Đ¸",
+ "Юли",
+ "ĐĐ²Đ³",
+ "Đ¡ĐµĐ¿",
+ "ĐĐºÑ‚",
+ "ĐĐ¾Đµ",
+ "Đ”ĐµĐº");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "Đ˜Đ½Ñ„Đ¾Ñ€Đ¼Đ°Ñ†Đ¸Ñ Đ·Đ° ĐºĐ°Đ»ĐµĐ½Đ´Đ°Ñ€Đ°";
+
+
+
+Calendar._TT["ABOUT"] =
+"DHTML Đ”Đ°Ñ‚Đ°/Đ§Đ°Ñ Đ¡ĐµĐ»ĐµĐºÑ‚Đ¾Ñ€\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"Đ—Đ° Đ¿Đ¾ÑĐ»ĐµĐ´Đ½Đ° Đ²ĐµÑ€ÑĐ¸Ñ Đ¿Đ¾ÑĐµÑ‚ĐµÑ‚Đµ: http://www.dynarch.com/projects/calendar/\n" +
+"Đ Đ°Đ·Đ¿Ñ€Đ¾ÑÑ‚Ñ€Đ°Đ½ÑĐ²Đ° Ñе Đ¿Đ¾Đ´ GNU LGPL. Đ’Đ¸Đ¶Ñ‚Đµ http://gnu.org/licenses/lgpl.html Đ·Đ° Đ¿Đ¾Đ²ĐµÑ‡Đµ Đ¸Đ½Ñ„Đ¾Ñ€Đ¼Đ°Ñ†Đ¸Ñ." +
+"\n\n" +
+"Đ˜Đ·Đ±Đ¾Ñ€ Đ½Đ° Đ´Đ°Ñ‚Đ°:\n" +
+"- ĐŸĐ¾Đ»Đ·Đ²Đ°Đ¹Ñ‚Đµ Đ±ÑƒÑ‚Đ¾Đ½Đ¸ \xab, \xbb Đ·Đ° Đ´Đ° Đ¸Đ·Đ±ĐµÑ€ĐµÑ‚Đµ Đ³Đ¾Đ´Đ¸Đ½Đ°\n" +
+"- ĐŸĐ¾Đ»Đ·Đ²Đ°Đ¹Ñ‚Đµ Đ±ÑƒÑ‚Đ¾Đ½Đ¸ " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " Đ·Đ° Đ´Đ° Đ¸Đ·Đ±ĐµÑ€ĐµÑ‚Đµ Đ¼ĐµÑĐµÑ†\n" +
+"- Đ—Đ°Đ´Ñ€ÑĐ¶Ñ‚Đµ Đ±ÑƒÑ‚Đ¾Đ½Đ° Đ½Đ° Đ¼Đ¸ÑˆĐºĐ°Ñ‚Đ° Đ½Đ° Đ½ÑĐºĐ¾Đ¹ Đ¾Ñ‚ Đ³Đ¾Ñ€Đ½Đ¸Ñ‚Đµ Đ±ÑƒÑ‚Đ¾Đ½Đ¸ Đ·Đ° Đ¿Đ¾-бÑÑ€Đ· Đ¸Đ·Đ±Đ¾Ñ€.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Đ˜Đ·Đ±Đ¾Ñ€ Đ½Đ° Đ²Ñ€ĐµĐ¼Đµ:\n" +
+"- ĐĐ°Ñ‚Đ¸ÑĐ½ĐµÑ‚Đµ Ñ Đ¼Đ¸ÑˆĐºĐ°Ñ‚Đ° Đ½Đ° Đ½ÑĐºĐ¾Đ¹ Đ¾Ñ‚ ĐµĐ»ĐµĐ¼ĐµĐ½Ñ‚Đ¸Ñ‚Đµ Đ½Đ° Ñ‡Đ°ÑĐ° Đ·Đ° Đ´Đ° Đ³Đ¾ ÑƒĐ²ĐµĐ»Đ¸Ñ‡Đ¸Ñ‚Đµ\n" +
+"- или Đ½Đ°Ñ‚Đ¸ÑĐ½ĐµÑ‚Đµ Ñ Đ¼Đ¸ÑˆĐºĐ°Ñ‚Đ° Đ´ÑÑ€Đ¶ĐµĐ¹ĐºĐ¸ Shift Đ·Đ° Đ´Đ° Đ³Đ¾ Đ½Đ°Đ¼Đ°Đ»Đ¸Ñ‚Đµ\n" +
+"- или Đ½Đ°Ñ‚Đ¸ÑĐ½ĐµÑ‚Đµ и Đ²Đ»Đ°Ñ‡ĐµÑ‚Đµ (Đ»ÑĐ²Đ¾-Đ´ÑÑĐ½Đ¾) Đ·Đ° Đ¿Đ¾-бÑÑ€Đ· Đ¸Đ·Đ±Đ¾Ñ€.";
+
+Calendar._TT["PREV_YEAR"] = "ĐŸÑ€ĐµĐ´Đ½Đ° Đ³Đ¾Đ´Đ¸Đ½Đ° (Đ·Đ°Đ´Ñ€ÑĐ¶Ñ‚Đµ Đ·Đ° Đ¼ĐµĐ½Ñ)";
+Calendar._TT["PREV_MONTH"] = "ĐŸÑ€ĐµĐ´ĐµĐ½ Đ¼ĐµÑĐµÑ† (Đ·Đ°Đ´Ñ€ÑĐ¶Ñ‚Đµ Đ·Đ° Đ¼ĐµĐ½Ñ)";
+Calendar._TT["GO_TODAY"] = "Đ˜Đ·Đ±ĐµÑ€ĐµÑ‚Đµ Đ´Đ½ĐµÑ";
+Calendar._TT["NEXT_MONTH"] = "Đ¡Đ»ĐµĐ´Đ²Đ°Ñ‰ Đ¼ĐµÑĐµÑ† (Đ·Đ°Đ´Ñ€ÑĐ¶Ñ‚Đµ Đ·Đ° Đ¼ĐµĐ½Ñ)";
+Calendar._TT["NEXT_YEAR"] = "Đ¡Đ»ĐµĐ´Đ²Đ°Ñ‰Đ° Đ³Đ¾Đ´Đ¸Đ½Đ° (Đ·Đ°Đ´Ñ€ÑĐ¶Ñ‚Đµ Đ·Đ° Đ¼ĐµĐ½Ñ)";
+Calendar._TT["SEL_DATE"] = "Đ˜Đ·Đ±ĐµÑ€ĐµÑ‚Đµ Đ´Đ°Ñ‚Đ°";
+Calendar._TT["DRAG_TO_MOVE"] = "ĐŸÑ€ĐµĐ¼ĐµÑÑ‚Đ²Đ°Đ½Đµ";
+Calendar._TT["PART_TODAY"] = " (Đ´Đ½ĐµÑ)";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "%s ĐºĐ°Ñ‚Đ¾ Đ¿ÑÑ€Đ²Đ¸ Đ´ĐµĐ½";
+
+// This may be locale-dependent. It specifies the week-end days, as an array
+// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "Đ—Đ°Ñ‚Đ²Đ¾Ñ€ĐµÑ‚Đµ";
+Calendar._TT["TODAY"] = "Đ”Đ½ĐµÑ";
+Calendar._TT["TIME_PART"] = "ĐĐ°Ñ‚Đ¸ÑĐ½ĐµÑ‚Đµ (ÑÑÑ Shift) или Đ²Đ»Đ°Ñ‡ĐµÑ‚Đµ";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%d.%m.%Y";
+Calendar._TT["TT_DATE_FORMAT"] = "%A - %e %B %Y";
+
+Calendar._TT["WK"] = "Đ¡ĐµĐ´Đ¼";
+Calendar._TT["TIME"] = "ЧаÑ:";
diff --git a/js/jscalendar/lang/calendar-big5-utf8.js b/js/jscalendar/lang/calendar-big5-utf8.js
new file mode 100644
index 0000000..14e0d5d
--- /dev/null
+++ b/js/jscalendar/lang/calendar-big5-utf8.js
@@ -0,0 +1,123 @@
+// ** I18N
+
+// Calendar big5-utf8 language
+// Author: Gary Fu, <gary@garyfu.idv.tw>
+// Encoding: utf8
+// Distributed under the same terms as the calendar itself.
+
+// For translators: please use UTF-8 if possible. We strongly believe that
+// Unicode is the answer to a real internationalized world. Also please
+// include your contact information in the header, as can be seen above.
+
+// full day names
+Calendar._DN = new Array
+("星期日",
+ "星期一",
+ "星期二",
+ "星期三",
+ "星期四",
+ "星期五",
+ "星期六",
+ "星期日");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary. We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+// Calendar._SDN_len = N; // short day name length
+// Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("æ—¥",
+ "一",
+ "二",
+ "三",
+ "å››",
+ "五",
+ "å…­",
+ "æ—¥");
+
+// full month names
+Calendar._MN = new Array
+("一月",
+ "二月",
+ "三月",
+ "四月",
+ "五月",
+ "六月",
+ "七月",
+ "八月",
+ "ä¹æœˆ",
+ "å月",
+ "å一月",
+ "å二月");
+
+// short month names
+Calendar._SMN = new Array
+("一月",
+ "二月",
+ "三月",
+ "四月",
+ "五月",
+ "六月",
+ "七月",
+ "八月",
+ "ä¹æœˆ",
+ "å月",
+ "å一月",
+ "å二月");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "關於";
+
+Calendar._TT["ABOUT"] =
+"DHTML Date/Time Selector\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"For latest version visit: http://www.dynarch.com/projects/calendar/\n" +
+"Distributed under GNU LGPL. See http://gnu.org/licenses/lgpl.html for details." +
+"\n\n" +
+"日期é¸æ“‡æ–¹æ³•:\n" +
+"- 使用 \xab, \xbb 按鈕å¯é¸æ“‡å¹´ä»½\n" +
+"- 使用 " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " 按鈕å¯é¸æ“‡æœˆä»½\n" +
+"- 按ä½ä¸é¢ç„按鈕å¯ä»¥å å¿«é¸å–";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"時間é¸æ“‡æ–¹æ³•:\n" +
+"- é»æ“任何ç„時間部份å¯å¢å å…¶å€¼\n" +
+"- åŒæ™‚按Shiftéµå†é»æ“å¯æ¸›å°‘其值\n" +
+"- é»æ“並拖曳å¯å å¿«æ”¹è®ç„值";
+
+Calendar._TT["PREV_YEAR"] = "ä¸ä¸€å¹´ (按ä½é¸å–®)";
+Calendar._TT["PREV_MONTH"] = "下一年 (按ä½é¸å–®)";
+Calendar._TT["GO_TODAY"] = "到ä»æ—¥";
+Calendar._TT["NEXT_MONTH"] = "ä¸ä¸€æœˆ (按ä½é¸å–®)";
+Calendar._TT["NEXT_YEAR"] = "下一月 (按ä½é¸å–®)";
+Calendar._TT["SEL_DATE"] = "é¸æ“‡æ—¥æœŸ";
+Calendar._TT["DRAG_TO_MOVE"] = "拖曳";
+Calendar._TT["PART_TODAY"] = " (ä»æ—¥)";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "å°‡ %s 顯示在å‰";
+
+// This may be locale-dependent. It specifies the week-end days, as an array
+// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "關閉";
+Calendar._TT["TODAY"] = "ä»æ—¥";
+Calendar._TT["TIME_PART"] = "é»æ“or拖曳å¯æ”¹è®æ™‚é–“(åŒæ™‚按Shift為減)";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d";
+Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e";
+
+Calendar._TT["WK"] = "週";
+Calendar._TT["TIME"] = "Time:";
diff --git a/js/jscalendar/lang/calendar-big5.js b/js/jscalendar/lang/calendar-big5.js
new file mode 100644
index 0000000..a589358
--- /dev/null
+++ b/js/jscalendar/lang/calendar-big5.js
@@ -0,0 +1,123 @@
+// ** I18N
+
+// Calendar big5 language
+// Author: Gary Fu, <gary@garyfu.idv.tw>
+// Encoding: big5
+// Distributed under the same terms as the calendar itself.
+
+// For translators: please use UTF-8 if possible. We strongly believe that
+// Unicode is the answer to a real internationalized world. Also please
+// include your contact information in the header, as can be seen above.
+
+// full day names
+Calendar._DN = new Array
+("¬P´Á¤é",
+ "¬P´Á¤@",
+ "¬P´Á¤G",
+ "¬P´Á¤T",
+ "¬P´Á¥|",
+ "¬P´Á¤­",
+ "¬P´Á¤»",
+ "¬P´Á¤é");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary. We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+// Calendar._SDN_len = N; // short day name length
+// Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("¤é",
+ "¤@",
+ "¤G",
+ "¤T",
+ "¥|",
+ "¤­",
+ "¤»",
+ "¤é");
+
+// full month names
+Calendar._MN = new Array
+("¤@¤ë",
+ "¤G¤ë",
+ "¤T¤ë",
+ "¥|¤ë",
+ "¤­¤ë",
+ "¤»¤ë",
+ "¤C¤ë",
+ "¤K¤ë",
+ "¤E¤ë",
+ "¤Q¤ë",
+ "¤Q¤@¤ë",
+ "¤Q¤G¤ë");
+
+// short month names
+Calendar._SMN = new Array
+("¤@¤ë",
+ "¤G¤ë",
+ "¤T¤ë",
+ "¥|¤ë",
+ "¤­¤ë",
+ "¤»¤ë",
+ "¤C¤ë",
+ "¤K¤ë",
+ "¤E¤ë",
+ "¤Q¤ë",
+ "¤Q¤@¤ë",
+ "¤Q¤G¤ë");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "Ăö©ó";
+
+Calendar._TT["ABOUT"] =
+"DHTML Date/Time Selector\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"For latest version visit: http://www.dynarch.com/projects/calendar/\n" +
+"Distributed under GNU LGPL. See http://gnu.org/licenses/lgpl.html for details." +
+"\n\n" +
+"¤é´Á¿ï¾Ü¤èªk:\n" +
+"- ¨Ï¥Î \xab, \xbb «ö¶s¥i¿ï¾Ü¦~¥÷\n" +
+"- ¨Ï¥Î " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " «ö¶s¥i¿ï¾Ü¤ë¥÷\n" +
+"- «ö¦í¤W­±ªº«ö¶s¥i¥H¥[§Ö¿ï¨ú";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"®É¶¡¿ï¾Ü¤èªk:\n" +
+"- ÂIÀ»¥ô¦óªº®É¶¡³¡¥÷¥i¼W¥[¨ä­È\n" +
+"- ¦P®É«öShiftÁä¦AÂIÀ»¥i´î¤Ö¨ä­È\n" +
+"- ÂIÀ»¨Ă©́¦²¥i¥[§Ö§ïÅܪº­È";
+
+Calendar._TT["PREV_YEAR"] = "¤W¤@¦~ («ö¦í¿ï³æ)";
+Calendar._TT["PREV_MONTH"] = "¤U¤@¦~ («ö¦í¿ï³æ)";
+Calendar._TT["GO_TODAY"] = "΅¤µ¤é";
+Calendar._TT["NEXT_MONTH"] = "¤W¤@¤ë («ö¦í¿ï³æ)";
+Calendar._TT["NEXT_YEAR"] = "¤U¤@¤ë («ö¦í¿ï³æ)";
+Calendar._TT["SEL_DATE"] = "¿ï¾Ü¤é´Á";
+Calendar._TT["DRAG_TO_MOVE"] = "©́¦²";
+Calendar._TT["PART_TODAY"] = " (¤µ¤é)";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "±N %s Åă¥Ü¦b«e";
+
+// This may be locale-dependent. It specifies the week-end days, as an array
+// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "Ăö³¬";
+Calendar._TT["TODAY"] = "¤µ¤é";
+Calendar._TT["TIME_PART"] = "ÂIÀ»or©́¦²¥i§ïÅܮɶ¡(¦P®É«öShift¬°´î)";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d";
+Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e";
+
+Calendar._TT["WK"] = "¶g";
+Calendar._TT["TIME"] = "Time:";
diff --git a/js/jscalendar/lang/calendar-br.js b/js/jscalendar/lang/calendar-br.js
new file mode 100644
index 0000000..bfb0747
--- /dev/null
+++ b/js/jscalendar/lang/calendar-br.js
@@ -0,0 +1,108 @@
+// ** I18N
+
+// Calendar pt-BR language
+// Author: Fernando Dourado, <fernando.dourado@ig.com.br>
+// Encoding: any
+// Distributed under the same terms as the calendar itself.
+
+// For translators: please use UTF-8 if possible. We strongly believe that
+// Unicode is the answer to a real internationalized world. Also please
+// include your contact information in the header, as can be seen above.
+
+// full day names
+Calendar._DN = new Array
+("Domingo",
+ "Segunda",
+ "Terça",
+ "Quarta",
+ "Quinta",
+ "Sexta",
+ "SabĂ¡do",
+ "Domingo");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary. We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+// Calendar._SDN_len = N; // short day name length
+// Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+// [No changes using default values]
+
+// full month names
+Calendar._MN = new Array
+("Janeiro",
+ "Fevereiro",
+ "Março",
+ "Abril",
+ "Maio",
+ "Junho",
+ "Julho",
+ "Agosto",
+ "Setembro",
+ "Outubro",
+ "Novembro",
+ "Dezembro");
+
+// short month names
+// [No changes using default values]
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "Sobre o calendĂ¡rio";
+
+Calendar._TT["ABOUT"] =
+"DHTML Date/Time Selector\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"For latest version visit: http://www.dynarch.com/projects/calendar/\n" +
+"Distributed under GNU LGPL. See http://gnu.org/licenses/lgpl.html for details." +
+"\n\n" +
+"Translate to portuguese Brazil (pt-BR) by Fernando Dourado (fernando.dourado@ig.com.br)\n" +
+"TraduĂ§Ă£o para o portuguĂªs Brasil (pt-BR) por Fernando Dourado (fernando.dourado@ig.com.br)" +
+"\n\n" +
+"Selecionar data:\n" +
+"- Use as teclas \xab, \xbb para selecionar o ano\n" +
+"- Use as teclas " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " para selecionar o mĂªs\n" +
+"- Clique e segure com o mouse em qualquer botĂ£o para selecionar rapidamente.";
+
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Selecionar hora:\n" +
+"- Clique em qualquer uma das partes da hora para aumentar\n" +
+"- ou Shift-clique para diminuir\n" +
+"- ou clique e arraste para selecionar rapidamente.";
+
+Calendar._TT["PREV_YEAR"] = "Ano anterior (clique e segure para menu)";
+Calendar._TT["PREV_MONTH"] = "MĂªs anterior (clique e segure para menu)";
+Calendar._TT["GO_TODAY"] = "Ir para a data atual";
+Calendar._TT["NEXT_MONTH"] = "PrĂ³ximo mĂªs (clique e segure para menu)";
+Calendar._TT["NEXT_YEAR"] = "PrĂ³ximo ano (clique e segure para menu)";
+Calendar._TT["SEL_DATE"] = "Selecione uma data";
+Calendar._TT["DRAG_TO_MOVE"] = "Clique e segure para mover";
+Calendar._TT["PART_TODAY"] = " (hoje)";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "Exibir %s primeiro";
+
+// This may be locale-dependent. It specifies the week-end days, as an array
+// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "Fechar";
+Calendar._TT["TODAY"] = "Hoje";
+Calendar._TT["TIME_PART"] = "(Shift-)Clique ou arraste para mudar o valor";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%d/%m/%Y";
+Calendar._TT["TT_DATE_FORMAT"] = "%d de %B de %Y";
+
+Calendar._TT["WK"] = "sem";
+Calendar._TT["TIME"] = "Hora:";
+
diff --git a/js/jscalendar/lang/calendar-ca.js b/js/jscalendar/lang/calendar-ca.js
new file mode 100644
index 0000000..a2121bc
--- /dev/null
+++ b/js/jscalendar/lang/calendar-ca.js
@@ -0,0 +1,123 @@
+// ** I18N
+
+// Calendar CA language
+// Author: Mihai Bazon, <mihai_bazon@yahoo.com>
+// Encoding: any
+// Distributed under the same terms as the calendar itself.
+
+// For translators: please use UTF-8 if possible. We strongly believe that
+// Unicode is the answer to a real internationalized world. Also please
+// include your contact information in the header, as can be seen above.
+
+// full day names
+Calendar._DN = new Array
+("Diumenge",
+ "Dilluns",
+ "Dimarts",
+ "Dimecres",
+ "Dijous",
+ "Divendres",
+ "Dissabte",
+ "Diumenge");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary. We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+// Calendar._SDN_len = N; // short day name length
+// Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("Diu",
+ "Dil",
+ "Dmt",
+ "Dmc",
+ "Dij",
+ "Div",
+ "Dis",
+ "Diu");
+
+// full month names
+Calendar._MN = new Array
+("Gener",
+ "Febrer",
+ "Març",
+ "Abril",
+ "Maig",
+ "Juny",
+ "Juliol",
+ "Agost",
+ "Setembre",
+ "Octubre",
+ "Novembre",
+ "Desembre");
+
+// short month names
+Calendar._SMN = new Array
+("Gen",
+ "Feb",
+ "Mar",
+ "Abr",
+ "Mai",
+ "Jun",
+ "Jul",
+ "Ago",
+ "Set",
+ "Oct",
+ "Nov",
+ "Des");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "Sobre el calendari";
+
+Calendar._TT["ABOUT"] =
+"DHTML Selector de Data/Hora\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"For latest version visit: http://www.dynarch.com/projects/calendar/\n" +
+"Distributed under GNU LGPL. See http://gnu.org/licenses/lgpl.html for details." +
+"\n\n" +
+"Sel.lecció de Dates:\n" +
+"- Fes servir els botons \xab, \xbb per sel.leccionar l'any\n" +
+"- Fes servir els botons " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " per se.lecciconar el mes\n" +
+"- Manté el ratolí apretat en qualsevol dels anteriors per sel.lecció ràpida.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Time selection:\n" +
+"- claca en qualsevol de les parts de la hora per augmentar-les\n" +
+"- o Shift-click per decrementar-la\n" +
+"- or click and arrastra per sel.lecció ràpida.";
+
+Calendar._TT["PREV_YEAR"] = "Any anterior (Mantenir per menu)";
+Calendar._TT["PREV_MONTH"] = "Mes anterior (Mantenir per menu)";
+Calendar._TT["GO_TODAY"] = "Anar a avui";
+Calendar._TT["NEXT_MONTH"] = "Mes següent (Mantenir per menu)";
+Calendar._TT["NEXT_YEAR"] = "Any següent (Mantenir per menu)";
+Calendar._TT["SEL_DATE"] = "Sel.leccionar data";
+Calendar._TT["DRAG_TO_MOVE"] = "Arrastrar per moure";
+Calendar._TT["PART_TODAY"] = " (avui)";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "Mostra %s primer";
+
+// This may be locale-dependent. It specifies the week-end days, as an array
+// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "Tanca";
+Calendar._TT["TODAY"] = "Avui";
+Calendar._TT["TIME_PART"] = "(Shift-)Click a arrastra per canviar el valor";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d";
+Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e";
+
+Calendar._TT["WK"] = "st";
+Calendar._TT["TIME"] = "Hora:";
diff --git a/js/jscalendar/lang/calendar-cs.js b/js/jscalendar/lang/calendar-cs.js
new file mode 100644
index 0000000..09e49ba
--- /dev/null
+++ b/js/jscalendar/lang/calendar-cs.js
@@ -0,0 +1,69 @@
+/*
+ calendar-cs.js
+ language: Czech
+ encoding: utf-8
+ author: Lubos Jerabek (xnet@seznam.cz)
+ Jan Uhlir (espinosa@centrum.cz)
+*/
+
+// ** I18N
+Calendar._DN = new Array('NedÄ›le','PondÄ›lĂ­','ĂterĂ½','StÅ™eda','ÄŒtvrtek','PĂ¡tek','Sobota','NedÄ›le');
+Calendar._SDN = new Array('Ne','Po','Ăt','St','ÄŒt','PĂ¡','So','Ne');
+Calendar._MN = new Array('Leden','Ănor','BÅ™ezen','Duben','KvÄ›ten','ÄŒerven','ÄŒervenec','Srpen','ZĂ¡Å™Ă­','Å˜Ă­jen','Listopad','Prosinec');
+Calendar._SMN = new Array('Led','Ăno','BÅ™e','Dub','KvÄ›','ÄŒrv','ÄŒvc','Srp','ZĂ¡Å™','Å˜Ă­j','Lis','Pro');
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "O komponentÄ› kalendĂ¡Å™";
+Calendar._TT["TOGGLE"] = "ZmÄ›na prvnĂ­ho dne v tĂ½dnu";
+Calendar._TT["PREV_YEAR"] = "PÅ™edchozĂ­ rok (pÅ™idrž pro menu)";
+Calendar._TT["PREV_MONTH"] = "PÅ™edchozĂ­ mÄ›sĂ­c (pÅ™idrž pro menu)";
+Calendar._TT["GO_TODAY"] = "DneÅ¡nĂ­ datum";
+Calendar._TT["NEXT_MONTH"] = "DalÅ¡Ă­ mÄ›sĂ­c (pÅ™idrž pro menu)";
+Calendar._TT["NEXT_YEAR"] = "DalÅ¡Ă­ rok (pÅ™idrž pro menu)";
+Calendar._TT["SEL_DATE"] = "Vyber datum";
+Calendar._TT["DRAG_TO_MOVE"] = "ChyÅ¥ a tĂ¡hni, pro pÅ™esun";
+Calendar._TT["PART_TODAY"] = " (dnes)";
+Calendar._TT["MON_FIRST"] = "Ukaž jako prvnĂ­ PondÄ›lĂ­";
+//Calendar._TT["SUN_FIRST"] = "Ukaž jako prvnĂ­ NedÄ›li";
+
+Calendar._TT["ABOUT"] =
+"DHTML Date/Time Selector\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"For latest version visit: http://www.dynarch.com/projects/calendar/\n" +
+"Distributed under GNU LGPL. See http://gnu.org/licenses/lgpl.html for details." +
+"\n\n" +
+"VĂ½bÄ›r datumu:\n" +
+"- Use the \xab, \xbb buttons to select year\n" +
+"- Použijte tlaÄĂ­tka " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " k vĂ½bÄ›ru mÄ›sĂ­ce\n" +
+"- Podržte tlaÄĂ­tko myÅ¡i na jakĂ©mkoliv z tÄ›ch tlaÄĂ­tek pro rychlejÅ¡Ă­ vĂ½bÄ›r.";
+
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"VĂ½bÄ›r Äasu:\n" +
+"- KliknÄ›te na jakoukoliv z ÄĂ¡stĂ­ vĂ½bÄ›ru Äasu pro zvĂ½Å¡enĂ­.\n" +
+"- nebo Shift-click pro snĂ­Å¾enĂ­\n" +
+"- nebo kliknÄ›te a tĂ¡hnÄ›te pro rychlejÅ¡Ă­ vĂ½bÄ›r.";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "Zobraz %s prvnĂ­";
+
+// This may be locale-dependent. It specifies the week-end days, as an array
+// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "ZavÅ™Ă­t";
+Calendar._TT["TODAY"] = "Dnes";
+Calendar._TT["TIME_PART"] = "(Shift-)Klikni nebo tĂ¡hni pro zmÄ›nu hodnoty";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "d.m.yy";
+Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e";
+
+Calendar._TT["WK"] = "wk";
+Calendar._TT["TIME"] = "ÄŒas:";
+
+// First day of the week. 0 means display Sunday first, 1 means display
+// Monday first, etc.
+Calendar._FD = 1;
diff --git a/js/jscalendar/lang/calendar-da.js b/js/jscalendar/lang/calendar-da.js
new file mode 100644
index 0000000..2d87263
--- /dev/null
+++ b/js/jscalendar/lang/calendar-da.js
@@ -0,0 +1,125 @@
+// ** I18N
+
+// Calendar DA language
+// Author: Michael Thingmand Henriksen, <michael (a) thingmand dot dk>
+// Encoding: any
+// Distributed under the same terms as the calendar itself.
+
+// For translators: please use UTF-8 if possible. We strongly believe that
+// Unicode is the answer to a real internationalized world. Also please
+// include your contact information in the header, as can be seen above.
+
+// full day names
+Calendar._DN = new Array
+("Søndag",
+"Mandag",
+"Tirsdag",
+"Onsdag",
+"Torsdag",
+"Fredag",
+"Lørdag",
+"Søndag");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary. We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+// Calendar._SDN_len = N; // short day name length
+// Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("Søn",
+"Man",
+"Tir",
+"Ons",
+"Tor",
+"Fre",
+"Lør",
+"Søn");
+
+// full month names
+Calendar._MN = new Array
+("Januar",
+"Februar",
+"Marts",
+"April",
+"Maj",
+"Juni",
+"Juli",
+"August",
+"September",
+"Oktober",
+"November",
+"December");
+
+Calendar._FD = 1;
+
+// short month names
+Calendar._SMN = new Array
+("Jan",
+"Feb",
+"Mar",
+"Apr",
+"Maj",
+"Jun",
+"Jul",
+"Aug",
+"Sep",
+"Okt",
+"Nov",
+"Dec");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "Om Kalenderen";
+
+Calendar._TT["ABOUT"] =
+"DHTML Date/Time Selector\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"For den seneste version besøg: http://www.dynarch.com/projects/calendar/\n"; +
+"Distribueret under GNU LGPL. Se http://gnu.org/licenses/lgpl.html for detajler." +
+"\n\n" +
+"Valg af dato:\n" +
+"- Brug \xab, \xbb knapperne for at vælge Ă¥r\n" +
+"- Brug " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " knapperne for at vælge mĂ¥ned\n" +
+"- Hold knappen pĂ¥ musen nede pĂ¥ knapperne ovenfor for hurtigere valg.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Valg af tid:\n" +
+"- Klik pĂ¥ en vilkĂ¥rlig del for større værdi\n" +
+"- eller Shift-klik for for mindre værdi\n" +
+"- eller klik og træk for hurtigere valg.";
+
+Calendar._TT["PREV_YEAR"] = "Ét Ă¥r tilbage (hold for menu)";
+Calendar._TT["PREV_MONTH"] = "Én mĂ¥ned tilbage (hold for menu)";
+Calendar._TT["GO_TODAY"] = "GĂ¥ til i dag";
+Calendar._TT["NEXT_MONTH"] = "Én mĂ¥ned frem (hold for menu)";
+Calendar._TT["NEXT_YEAR"] = "Ét Ă¥r frem (hold for menu)";
+Calendar._TT["SEL_DATE"] = "Vælg dag";
+Calendar._TT["DRAG_TO_MOVE"] = "Træk vinduet";
+Calendar._TT["PART_TODAY"] = " (i dag)";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "Vis %s først";
+
+// This may be locale-dependent. It specifies the week-end days, as an array
+// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "Luk";
+Calendar._TT["TODAY"] = "I dag";
+Calendar._TT["TIME_PART"] = "(Shift-)klik eller træk for at ændre værdi";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%d-%m-%Y";
+Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e";
+
+Calendar._TT["WK"] = "Uge";
+Calendar._TT["TIME"] = "Tid:";
diff --git a/js/jscalendar/lang/calendar-de.js b/js/jscalendar/lang/calendar-de.js
new file mode 100644
index 0000000..c5dfd55
--- /dev/null
+++ b/js/jscalendar/lang/calendar-de.js
@@ -0,0 +1,127 @@
+// ** I18N
+
+// Calendar DE language
+// Author: Jack (tR), <jack@jtr.de>
+// Encoding: any
+// Distributed under the same terms as the calendar itself.
+
+// For translators: please use UTF-8 if possible. We strongly believe that
+// Unicode is the answer to a real internationalized world. Also please
+// include your contact information in the header, as can be seen above.
+
+// full day names
+Calendar._DN = new Array
+("Sonntag",
+ "Montag",
+ "Dienstag",
+ "Mittwoch",
+ "Donnerstag",
+ "Freitag",
+ "Samstag",
+ "Sonntag");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary. We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+// Calendar._SDN_len = N; // short day name length
+// Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("So",
+ "Mo",
+ "Di",
+ "Mi",
+ "Do",
+ "Fr",
+ "Sa",
+ "So");
+
+// First day of the week. 0 means Sunday, 1 means Monday
+Calendar._FD = 1;
+
+// full month names
+Calendar._MN = new Array
+("Januar",
+ "Februar",
+ "M\u00e4rz",
+ "April",
+ "Mai",
+ "Juni",
+ "Juli",
+ "August",
+ "September",
+ "Oktober",
+ "November",
+ "Dezember");
+
+// short month names
+Calendar._SMN = new Array
+("Jan",
+ "Feb",
+ "M\u00e4r",
+ "Apr",
+ "May",
+ "Jun",
+ "Jul",
+ "Aug",
+ "Sep",
+ "Okt",
+ "Nov",
+ "Dez");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "\u00DCber dieses Kalendarmodul";
+
+Calendar._TT["ABOUT"] =
+"DHTML Date/Time Selector\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this ;-)
+"For latest version visit: http://www.dynarch.com/projects/calendar/\n" +
+"Distributed under GNU LGPL. See http://gnu.org/licenses/lgpl.html for details." +
+"\n\n" +
+"Datum ausw\u00e4hlen:\n" +
+"- Benutzen Sie die \xab, \xbb Buttons um das Jahr zu w\u00e4hlen\n" +
+"- Benutzen Sie die " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " Buttons um den Monat zu w\u00e4hlen\n" +
+"- F\u00fcr eine Schnellauswahl halten Sie die Maustaste \u00fcber diesen Buttons fest.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Zeit ausw\u00e4hlen:\n" +
+"- Klicken Sie auf die Teile der Uhrzeit, um diese zu erh\u00F6hen\n" +
+"- oder klicken Sie mit festgehaltener Shift-Taste um diese zu verringern\n" +
+"- oder klicken und festhalten f\u00fcr Schnellauswahl.";
+
+Calendar._TT["TOGGLE"] = "Ersten Tag der Woche w\u00e4hlen";
+Calendar._TT["PREV_YEAR"] = "Voriges Jahr (Festhalten f\u00fcr Schnellauswahl)";
+Calendar._TT["PREV_MONTH"] = "Voriger Monat (Festhalten f\u00fcr Schnellauswahl)";
+Calendar._TT["GO_TODAY"] = "Heute ausw\u00e4hlen";
+Calendar._TT["NEXT_MONTH"] = "N\u00e4chst. Monat (Festhalten f\u00fcr Schnellauswahl)";
+Calendar._TT["NEXT_YEAR"] = "N\u00e4chst. Jahr (Festhalten f\u00fcr Schnellauswahl)";
+Calendar._TT["SEL_DATE"] = "Datum ausw\u00e4hlen";
+Calendar._TT["DRAG_TO_MOVE"] = "Zum Bewegen festhalten";
+Calendar._TT["PART_TODAY"] = " (Heute)";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "Woche beginnt mit %s ";
+
+// This may be locale-dependent. It specifies the week-end days, as an array
+// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "Schlie\u00dfen";
+Calendar._TT["TODAY"] = "Heute";
+Calendar._TT["TIME_PART"] = "(Shift-)Klick oder Festhalten und Ziehen um den Wert zu \u00e4ndern";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%d.%m.%Y";
+Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e";
+
+Calendar._TT["WK"] = "wk";
+Calendar._TT["TIME"] = "Zeit:";
diff --git a/js/jscalendar/lang/calendar-du.js b/js/jscalendar/lang/calendar-du.js
new file mode 100644
index 0000000..2200448
--- /dev/null
+++ b/js/jscalendar/lang/calendar-du.js
@@ -0,0 +1,45 @@
+// ** I18N
+Calendar._DN = new Array
+("Zondag",
+ "Maandag",
+ "Dinsdag",
+ "Woensdag",
+ "Donderdag",
+ "Vrijdag",
+ "Zaterdag",
+ "Zondag");
+Calendar._MN = new Array
+("Januari",
+ "Februari",
+ "Maart",
+ "April",
+ "Mei",
+ "Juni",
+ "Juli",
+ "Augustus",
+ "September",
+ "Oktober",
+ "November",
+ "December");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["TOGGLE"] = "Toggle startdag van de week";
+Calendar._TT["PREV_YEAR"] = "Vorig jaar (indrukken voor menu)";
+Calendar._TT["PREV_MONTH"] = "Vorige month (indrukken voor menu)";
+Calendar._TT["GO_TODAY"] = "Naar Vandaag";
+Calendar._TT["NEXT_MONTH"] = "Volgende Maand (indrukken voor menu)";
+Calendar._TT["NEXT_YEAR"] = "Volgend jaar (indrukken voor menu)";
+Calendar._TT["SEL_DATE"] = "Selecteer datum";
+Calendar._TT["DRAG_TO_MOVE"] = "Sleep om te verplaatsen";
+Calendar._TT["PART_TODAY"] = " (vandaag)";
+Calendar._TT["MON_FIRST"] = "Toon Maandag eerst";
+Calendar._TT["SUN_FIRST"] = "Toon Zondag eerst";
+Calendar._TT["CLOSE"] = "Sluiten";
+Calendar._TT["TODAY"] = "Vandaag";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "y-mm-dd";
+Calendar._TT["TT_DATE_FORMAT"] = "D, M d";
+
+Calendar._TT["WK"] = "wk";
diff --git a/js/jscalendar/lang/calendar-el.js b/js/jscalendar/lang/calendar-el.js
new file mode 100644
index 0000000..6b5e814
--- /dev/null
+++ b/js/jscalendar/lang/calendar-el.js
@@ -0,0 +1,100 @@
+Calendar._DN = new Array
+("ÎÏ…Ïιακή",
+ "ΔευτέÏα",
+ "ΤÏίτη",
+ "ΤετάÏτη",
+ "Πέμπτη",
+ "ΠαÏασκευή",
+ "Σάββατο",
+ "ÎÏ…Ïιακή");
+
+Calendar._SDN = new Array
+("ÎÏ…",
+ "Δε",
+ "TÏ",
+ "Τε",
+ "Πε",
+ "Πα",
+ "Σα",
+ "ÎÏ…");
+
+Calendar._FD = 1;
+
+Calendar._MN = new Array
+("ΙανουάÏιος",
+ "ΦεβÏουάÏιος",
+ "ΜάÏτιος",
+ "ΑπÏίλιος",
+ "ΜάÏος",
+ "ΙοÏνιος",
+ "ΙοÏλιος",
+ "ΑÏγουστος",
+ "ΣεπτέμβÏιος",
+ "ΟκτÏβÏιος",
+ "ÎοέμβÏιος",
+ "ΔεκέμβÏιος");
+
+Calendar._SMN = new Array
+("Ιαν",
+ "Φεβ",
+ "ΜαÏ",
+ "ΑπÏ",
+ "Μαι",
+ "Ιουν",
+ "Ιουλ",
+ "Αυγ",
+ "Σεπ",
+ "Οκτ",
+ "Îοε",
+ "Δεκ");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "Σχετικά με το ημεÏολόγιο";
+
+Calendar._TT["ABOUT"] =
+"Επιλογέας ημεÏομηνίας/ÏÏας σε DHTML\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"Για τελευταία έκδοση: http://www.dynarch.com/projects/calendar/\n" +
+"Διανέμεται υπό την GNU LGPL. Βλ. http://gnu.org/licenses/lgpl.html για λεπτομέÏειες." +
+"\n\n" +
+"Επιλογή ημεÏομηνίας:\n" +
+"- ΧÏησιμοποιήστε τα κουμπιά \xab, \xbb για επιλογή έτους\n" +
+"- ΧÏησιμοποιήστε τα κουμπιά " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " για επιλογή μήνα\n" +
+"- ÎÏατήστε το πλήκτÏο του Ï€Î¿Î½Ï„Î¹ÎºÎ¿Ï Ï€Î±Ï„Î·Î¼Î­Î½Î¿ στα παÏαπάνω κουμπιά για ταχÏτεÏη επιλογή.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Επιλογή ÏÏας:\n" +
+"- Îάντε κλικ σε ένα από τα μέÏη της ÏÏας για αÏξηση\n" +
+"- ή Shift-κλικ για μείωση\n" +
+"- ή κλικ και σÏÏσιμο για ταχÏτεÏη επιλογή.";
+Calendar._TT["TOGGLE"] = "ΜπάÏα Ï€ÏÏτης ημέÏας της εβδομάδας";
+Calendar._TT["PREV_YEAR"] = "ΠÏοηγ. έτος (παÏατεταμένα για μενοÏ)";
+Calendar._TT["PREV_MONTH"] = "ΠÏοηγ. μήνας (παÏατεταμένα για μενοÏ)";
+Calendar._TT["GO_TODAY"] = "ΣήμεÏα";
+Calendar._TT["NEXT_MONTH"] = "Επόμενος μήνας (παÏατεταμένα για μενοÏ)";
+Calendar._TT["NEXT_YEAR"] = "Επόμενο έτος (παÏατεταμένα για μενοÏ)";
+Calendar._TT["SEL_DATE"] = "Επιλέξτε ημεÏομηνία";
+Calendar._TT["DRAG_TO_MOVE"] = "ΣÏÏτε για να μετακινήσετε";
+Calendar._TT["PART_TODAY"] = " (σήμεÏα)";
+Calendar._TT["MON_FIRST"] = "Εμφάνιση ΔευτέÏας Ï€ÏÏτα";
+Calendar._TT["SUN_FIRST"] = "Εμφάνιση ÎÏ…Ïιακής Ï€ÏÏτα";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "Εμφάνιση %s Ï€ÏÏτα";
+
+// This may be locale-dependent. It specifies the week-end days, as an array
+// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "Îλείσιμο";
+Calendar._TT["TODAY"] = "ΣήμεÏα";
+Calendar._TT["TIME_PART"] = "(Shift-)κλικ ή μετακίνηση για αλλαγή";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "dd-mm-y";
+Calendar._TT["TT_DATE_FORMAT"] = "D, d M";
+
+Calendar._TT["WK"] = "εβδ";
+
diff --git a/js/jscalendar/lang/calendar-en.js b/js/jscalendar/lang/calendar-en.js
new file mode 100644
index 0000000..0dbde79
--- /dev/null
+++ b/js/jscalendar/lang/calendar-en.js
@@ -0,0 +1,127 @@
+// ** I18N
+
+// Calendar EN language
+// Author: Mihai Bazon, <mihai_bazon@yahoo.com>
+// Encoding: any
+// Distributed under the same terms as the calendar itself.
+
+// For translators: please use UTF-8 if possible. We strongly believe that
+// Unicode is the answer to a real internationalized world. Also please
+// include your contact information in the header, as can be seen above.
+
+// full day names
+Calendar._DN = new Array
+("Sunday",
+ "Monday",
+ "Tuesday",
+ "Wednesday",
+ "Thursday",
+ "Friday",
+ "Saturday",
+ "Sunday");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary. We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+// Calendar._SDN_len = N; // short day name length
+// Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("Sun",
+ "Mon",
+ "Tue",
+ "Wed",
+ "Thu",
+ "Fri",
+ "Sat",
+ "Sun");
+
+// First day of the week. "0" means display Sunday first, "1" means display
+// Monday first, etc.
+Calendar._FD = 0;
+
+// full month names
+Calendar._MN = new Array
+("January",
+ "February",
+ "March",
+ "April",
+ "May",
+ "June",
+ "July",
+ "August",
+ "September",
+ "October",
+ "November",
+ "December");
+
+// short month names
+Calendar._SMN = new Array
+("Jan",
+ "Feb",
+ "Mar",
+ "Apr",
+ "May",
+ "Jun",
+ "Jul",
+ "Aug",
+ "Sep",
+ "Oct",
+ "Nov",
+ "Dec");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "About the calendar";
+
+Calendar._TT["ABOUT"] =
+"DHTML Date/Time Selector\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"For latest version visit: http://www.dynarch.com/projects/calendar/\n" +
+"Distributed under GNU LGPL. See http://gnu.org/licenses/lgpl.html for details." +
+"\n\n" +
+"Date selection:\n" +
+"- Use the \xab, \xbb buttons to select year\n" +
+"- Use the " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " buttons to select month\n" +
+"- Hold mouse button on any of the above buttons for faster selection.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Time selection:\n" +
+"- Click on any of the time parts to increase it\n" +
+"- or Shift-click to decrease it\n" +
+"- or click and drag for faster selection.";
+
+Calendar._TT["PREV_YEAR"] = "Prev. year (hold for menu)";
+Calendar._TT["PREV_MONTH"] = "Prev. month (hold for menu)";
+Calendar._TT["GO_TODAY"] = "Go Today";
+Calendar._TT["NEXT_MONTH"] = "Next month (hold for menu)";
+Calendar._TT["NEXT_YEAR"] = "Next year (hold for menu)";
+Calendar._TT["SEL_DATE"] = "Select date";
+Calendar._TT["DRAG_TO_MOVE"] = "Drag to move";
+Calendar._TT["PART_TODAY"] = " (today)";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "Display %s first";
+
+// This may be locale-dependent. It specifies the week-end days, as an array
+// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "Close";
+Calendar._TT["TODAY"] = "Today";
+Calendar._TT["TIME_PART"] = "(Shift-)Click or drag to change value";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d";
+Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e";
+
+Calendar._TT["WK"] = "wk";
+Calendar._TT["TIME"] = "Time:";
diff --git a/js/jscalendar/lang/calendar-es.js b/js/jscalendar/lang/calendar-es.js
new file mode 100644
index 0000000..947610c
--- /dev/null
+++ b/js/jscalendar/lang/calendar-es.js
@@ -0,0 +1,129 @@
+// ** I18N
+
+// Calendar ES (spanish) language
+// Author: Mihai Bazon, <mihai_bazon@yahoo.com>
+// Updater: Servilio Afre Puentes <servilios@yahoo.com>
+// Updated: 2019-03-05
+// Encoding: utf-8
+// Distributed under the same terms as the calendar itself.
+
+// For translators: please use UTF-8 if possible. We strongly believe that
+// Unicode is the answer to a real internationalized world. Also please
+// include your contact information in the header, as can be seen above.
+
+// full day names
+Calendar._DN = new Array
+("Domingo",
+ "Lunes",
+ "Martes",
+ "Miércoles",
+ "Jueves",
+ "Viernes",
+ "SĂ¡bado",
+ "Domingo");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary. We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+// Calendar._SDN_len = N; // short day name length
+// Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("Dom",
+ "Lun",
+ "Mar",
+ "Mié",
+ "Jue",
+ "Vie",
+ "SĂ¡b",
+ "Dom");
+
+// First day of the week. "0" means display Sunday first, "1" means display
+// Monday first, etc.
+Calendar._FD = 1;
+
+// full month names
+Calendar._MN = new Array
+("Enero",
+ "Febrero",
+ "Marzo",
+ "Abril",
+ "Mayo",
+ "Junio",
+ "Julio",
+ "Agosto",
+ "Septiembre",
+ "Octubre",
+ "Noviembre",
+ "Diciembre");
+
+// short month names
+Calendar._SMN = new Array
+("Ene",
+ "Feb",
+ "Mar",
+ "Abr",
+ "May",
+ "Jun",
+ "Jul",
+ "Ago",
+ "Sep",
+ "Oct",
+ "Nov",
+ "Dic");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "Acerca del calendario";
+
+Calendar._TT["ABOUT"] =
+"Selector DHTML de Fecha/Hora\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"Para conseguir la Ăºltima versiĂ³n visite: http://www.dynarch.com/projects/calendar/\n" +
+"Distribuido bajo licencia GNU LGPL. Visite http://gnu.org/licenses/lgpl.html para mĂ¡s detalles." +
+"\n\n" +
+"SelecciĂ³n de fecha:\n" +
+"- Use los botones \xab, \xbb para seleccionar el año\n" +
+"- Use los botones " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " para seleccionar el mes\n" +
+"- Mantenga pulsado el ratĂ³n en cualquiera de estos botones para una selecciĂ³n rĂ¡pida.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"SelecciĂ³n de hora:\n" +
+"- Pulse en cualquiera de las partes de la hora para incrementarla\n" +
+"- o pulse las mayĂºsculas mientras hace clic para decrementarla\n" +
+"- o haga clic y arrastre el ratĂ³n para una selecciĂ³n mĂ¡s rĂ¡pida.";
+
+Calendar._TT["PREV_YEAR"] = "Año anterior (mantener para menĂº)";
+Calendar._TT["PREV_MONTH"] = "Mes anterior (mantener para menĂº)";
+Calendar._TT["GO_TODAY"] = "Ir a hoy";
+Calendar._TT["NEXT_MONTH"] = "Mes siguiente (mantener para menĂº)";
+Calendar._TT["NEXT_YEAR"] = "Año siguiente (mantener para menĂº)";
+Calendar._TT["SEL_DATE"] = "Seleccionar fecha";
+Calendar._TT["DRAG_TO_MOVE"] = "Arrastrar para mover";
+Calendar._TT["PART_TODAY"] = " (hoy)";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "Hacer %s primer dĂ­a de la semana";
+
+// This may be locale-dependent. It specifies the week-end days, as an array
+// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "Cerrar";
+Calendar._TT["TODAY"] = "Hoy";
+Calendar._TT["TIME_PART"] = "(MayĂºscula-)Clic o arrastre para cambiar valor";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%d/%m/%Y";
+Calendar._TT["TT_DATE_FORMAT"] = "%A, %e de %B de %Y";
+
+Calendar._TT["WK"] = "sem";
+Calendar._TT["TIME"] = "Hora:";
diff --git a/js/jscalendar/lang/calendar-fi.js b/js/jscalendar/lang/calendar-fi.js
new file mode 100644
index 0000000..d1163b2
--- /dev/null
+++ b/js/jscalendar/lang/calendar-fi.js
@@ -0,0 +1,102 @@
+// ** I18N
+
+// Calendar FI language (Finnish, Suomi)
+// Author: Jarno Käyhkö, <gambler@phnet.fi>
+// Encoding: UTF-8
+// Distributed under the same terms as the calendar itself.
+
+// full day names
+Calendar._DN = new Array
+("Sunnuntai",
+ "Maanantai",
+ "Tiistai",
+ "Keskiviikko",
+ "Torstai",
+ "Perjantai",
+ "Lauantai",
+ "Sunnuntai");
+
+// short day names
+Calendar._SDN = new Array
+("Su",
+ "Ma",
+ "Ti",
+ "Ke",
+ "To",
+ "Pe",
+ "La",
+ "Su");
+
+Calendar._FD = 1;
+
+// full month names
+Calendar._MN = new Array
+("Tammikuu",
+ "Helmikuu",
+ "Maaliskuu",
+ "Huhtikuu",
+ "Toukokuu",
+ "Kesäkuu",
+ "Heinäkuu",
+ "Elokuu",
+ "Syyskuu",
+ "Lokakuu",
+ "Marraskuu",
+ "Joulukuu");
+
+// short month names
+Calendar._SMN = new Array
+("Tam",
+ "Hel",
+ "Maa",
+ "Huh",
+ "Tou",
+ "Kes",
+ "Hei",
+ "Elo",
+ "Syy",
+ "Lok",
+ "Mar",
+ "Jou");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "Tietoja kalenterista";
+
+Calendar._TT["ABOUT"] =
+"DHTML Date/Time Selector\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"Uusin versio osoitteessa: http://www.dynarch.com/projects/calendar/\n" +
+"Julkaistu GNU LGPL lisenssin alaisuudessa. Lisätietoja osoitteessa http://gnu.org/licenses/lgpl.html" +
+"\n\n" +
+"Päivämäärä valinta:\n" +
+"- Käytä \xab, \xbb painikkeita valitaksesi vuosi\n" +
+"- Käytä " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " painikkeita valitaksesi kuukausi\n" +
+"- Pitämällä hiiren painiketta minkä tahansa yllä olevan painikkeen kohdalla, saat näkyviin valikon nopeampaan siirtymiseen.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Ajan valinta:\n" +
+"- Klikkaa kellonajan numeroita lisätäksesi aikaa\n" +
+"- tai pitämällä Shift-näppäintä pohjassa saat aikaa taaksepäin\n" +
+"- tai klikkaa ja pidä hiiren painike pohjassa sekä liikuta hiirtä muuttaaksesi aikaa nopeasti eteen- ja taaksepäin.";
+
+Calendar._TT["PREV_YEAR"] = "Edell. vuosi (paina hetki, näet valikon)";
+Calendar._TT["PREV_MONTH"] = "Edell. kuukausi (paina hetki, näet valikon)";
+Calendar._TT["GO_TODAY"] = "Siirry tähän päivään";
+Calendar._TT["NEXT_MONTH"] = "Seur. kuukausi (paina hetki, näet valikon)";
+Calendar._TT["NEXT_YEAR"] = "Seur. vuosi (paina hetki, näet valikon)";
+Calendar._TT["SEL_DATE"] = "Valitse päivämäärä";
+Calendar._TT["DRAG_TO_MOVE"] = "Siirrä kalenterin paikkaa";
+Calendar._TT["PART_TODAY"] = " (tänään)";
+Calendar._TT["MON_FIRST"] = "Näytä maanantai ensimmäisenä";
+Calendar._TT["SUN_FIRST"] = "Näytä sunnuntai ensimmäisenä";
+Calendar._TT["CLOSE"] = "Sulje";
+Calendar._TT["TODAY"] = "Tänään";
+Calendar._TT["TIME_PART"] = "(Shift-) Klikkaa tai liikuta muuttaaksesi aikaa";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%d.%m.%Y";
+Calendar._TT["TT_DATE_FORMAT"] = "%d.%m.%Y";
+
+Calendar._TT["WK"] = "Vko";
+Calendar._TT["WEEKEND"] = "0,6";
+Calendar._TT["DAY_FIRST"] = "Näytä %s ensimmäisenä";
diff --git a/js/jscalendar/lang/calendar-fr.js b/js/jscalendar/lang/calendar-fr.js
new file mode 100644
index 0000000..9bc7e08
--- /dev/null
+++ b/js/jscalendar/lang/calendar-fr.js
@@ -0,0 +1,127 @@
+// ** I18N
+
+// Calendar FR language
+// Author: Mihai Bazon, <mihai_bazon@yahoo.com>
+// Encoding: UTF-8
+// Distributed under the same terms as the calendar itself.
+
+// For translators: please use UTF-8 if possible. We strongly believe that
+// Unicode is the answer to a real internationalized world. Also please
+// include your contact information in the header, as can be seen above.
+
+// Translator: David Duret, <pilgrim@mala-template.net> from previous french version
+
+// full day names
+Calendar._DN = new Array
+("Dimanche",
+ "Lundi",
+ "Mardi",
+ "Mercredi",
+ "Jeudi",
+ "Vendredi",
+ "Samedi",
+ "Dimanche");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary. We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+// Calendar._SDN_len = N; // short day name length
+// Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("Dim",
+ "Lun",
+ "Mar",
+ "Mar",
+ "Jeu",
+ "Ven",
+ "Sam",
+ "Dim");
+
+// full month names
+Calendar._MN = new Array
+("Janvier",
+ "FĂ©vrier",
+ "Mars",
+ "Avril",
+ "Mai",
+ "Juin",
+ "Juillet",
+ "Août",
+ "Septembre",
+ "Octobre",
+ "Novembre",
+ "DĂ©cembre");
+
+Calendar._FD = 1;
+
+// short month names
+Calendar._SMN = new Array
+("Jan",
+ "Fev",
+ "Mar",
+ "Avr",
+ "Mai",
+ "Juin",
+ "Juil",
+ "Aout",
+ "Sep",
+ "Oct",
+ "Nov",
+ "Dec");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "A propos du calendrier";
+
+Calendar._TT["ABOUT"] =
+"DHTML Date/Heure Selecteur\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"Pour la derniere version visitez : http://www.dynarch.com/projects/calendar/\n" +
+"Distribué par GNU LGPL. Voir http://gnu.org/licenses/lgpl.html pour les details." +
+"\n\n" +
+"Selection de la date :\n" +
+"- Utiliser les bouttons \xab, \xbb pour selectionner l\'annee\n" +
+"- Utiliser les bouttons " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " pour selectionner les mois\n" +
+"- Garder la souris sur n'importe quels boutons pour une selection plus rapide";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Selection de l\'heure :\n" +
+"- Cliquer sur heures ou minutes pour incrementer\n" +
+"- ou Maj-clic pour decrementer\n" +
+"- ou clic et glisser-deplacer pour une selection plus rapide";
+
+Calendar._TT["PREV_YEAR"] = "Année préc. (maintenir pour menu)";
+Calendar._TT["PREV_MONTH"] = "Mois préc. (maintenir pour menu)";
+Calendar._TT["GO_TODAY"] = "Atteindre la date du jour";
+Calendar._TT["NEXT_MONTH"] = "Mois suiv. (maintenir pour menu)";
+Calendar._TT["NEXT_YEAR"] = "Année suiv. (maintenir pour menu)";
+Calendar._TT["SEL_DATE"] = "SĂ©lectionner une date";
+Calendar._TT["DRAG_TO_MOVE"] = "DĂ©placer";
+Calendar._TT["PART_TODAY"] = " (Aujourd'hui)";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "Afficher %s en premier";
+
+// This may be locale-dependent. It specifies the week-end days, as an array
+// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "Fermer";
+Calendar._TT["TODAY"] = "Aujourd'hui";
+Calendar._TT["TIME_PART"] = "(Maj-)Clic ou glisser pour modifier la valeur";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%d/%m/%Y";
+Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e";
+
+Calendar._TT["WK"] = "Sem.";
+Calendar._TT["TIME"] = "Heure :";
diff --git a/js/jscalendar/lang/calendar-he.js b/js/jscalendar/lang/calendar-he.js
new file mode 100644
index 0000000..f4c4311
--- /dev/null
+++ b/js/jscalendar/lang/calendar-he.js
@@ -0,0 +1,122 @@
+// ** I18N
+
+// Calendar HE language
+// Author: Idan Sofer, <idan@idanso.dyndns.org>
+// Encoding: UTF-8
+// Distributed under the same terms as the calendar itself.
+
+// For translators: please use UTF-8 if possible. We strongly believe that
+// Unicode is the answer to a real internationalized world. Also please
+// include your contact information in the header, as can be seen above.
+
+// full day names
+Calendar._DN = new Array
+("ר×שון",
+ "שני",
+ "שלישי",
+ "רביעי",
+ "×—×ישי",
+ "שישי",
+ "שבת",
+ "ר×שון");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary. We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+// Calendar._SDN_len = N; // short day name length
+// Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("×",
+ "ב",
+ "×’",
+ "ד",
+ "×”",
+ "ו",
+ "ש",
+ "×");
+
+// full month names
+Calendar._MN = new Array
+("ינו×ר",
+ "פברו×ר",
+ "×רץ",
+ "×פריל",
+ "×××™",
+ "יוני",
+ "יולי",
+ "×וגוסט",
+ "ספט×בר",
+ "×וקטובר",
+ "נוב×בר",
+ "דצ×בר");
+
+// short month names
+Calendar._SMN = new Array
+("×™× ×",
+ "פבר",
+ "×רץ",
+ "×פר",
+ "×××™",
+ "יונ",
+ "יול",
+ "×וג",
+ "ספט",
+ "×וק",
+ "נוב",
+ "דצ×");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "×ודות השנתון";
+
+Calendar._TT["ABOUT"] =
+"בחרן ת×רי×/שעה DHTML\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"×”×’×™×¨×¡× ×”×חרונה ×–××™× ×” ב: http://www.dynarch.com/projects/calendar/\n" +
+"×ופץ תחת זיכיון ×” GNU LGPL. עיין ב http://gnu.org/licenses/lgpl.html ×œ×¤×¨×˜×™× × ×•×¡×¤×™×." +
+"\n\n" + "בחירת ת×רי×:\n" +
+"- השת×ש ×‘×›×¤×ª×•×¨×™× \xab, \xbb לבחירת שנה\n" +
+"- השת×ש ×‘×›×¤×ª×•×¨×™× " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " לבחירת חודש\n" +
+"- החזק העכבר לחוץ ×על ×”×›×¤×ª×•×¨×™× ×”××•×–×›×¨×™× ×œ×¢×™×œ לבחירה ×הירה יותר.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"בחירת ×–×ן:\n" +
+"- לחץ על כל ×חד ×חלקי ×”×–×ן כדי להוסיף\n" +
+"- ×ו shift בשילוב ×¢× ×œ×—×™×¦×” כדי להחסיר\n" +
+"- ×ו לחץ וגרור לפעולה ×הירה יותר.";
+
+Calendar._TT["PREV_YEAR"] = "שנה קוד×ת - החזק לקבלת תפריט";
+Calendar._TT["PREV_MONTH"] = "חודש ×§×•×“× - החזק לקבלת תפריט";
+Calendar._TT["GO_TODAY"] = "עבור להיו×";
+Calendar._TT["NEXT_MONTH"] = "חודש ×”×‘× - החזק לתפריט";
+Calendar._TT["NEXT_YEAR"] = "שנה הב××” - החזק לתפריט";
+Calendar._TT["SEL_DATE"] = "בחר ת×רי×";
+Calendar._TT["DRAG_TO_MOVE"] = "גרור להזזה";
+Calendar._TT["PART_TODAY"] = " )היו×(";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "הצג %s קוד×";
+
+// This may be locale-dependent. It specifies the week-end days, as an array
+// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "6";
+
+Calendar._TT["CLOSE"] = "סגור";
+Calendar._TT["TODAY"] = "היו×";
+Calendar._TT["TIME_PART"] = "(שיפט-)לחץ וגרור כדי לשנות ער×";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d";
+Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e";
+
+Calendar._TT["WK"] = "wk";
+Calendar._TT["TIME"] = "שעה::";
diff --git a/js/jscalendar/lang/calendar-hr.js b/js/jscalendar/lang/calendar-hr.js
new file mode 100644
index 0000000..bcc026b
--- /dev/null
+++ b/js/jscalendar/lang/calendar-hr.js
@@ -0,0 +1,53 @@
+/* Croatian language file for the DHTML Calendar version 0.9.2
+* Author Krunoslav Zubrinic <krunoslav.zubrinic@vip.hr>, June 2003.
+* Feel free to use this script under the terms of the GNU Lesser General
+* Public License, as long as you do not remove or alter this notice.
+*/
+Calendar._DN = new Array
+("Nedjelja",
+ "Ponedjeljak",
+ "Utorak",
+ "Srijeda",
+ "ÄŒetvrtak",
+ "Petak",
+ "Subota",
+ "Nedjelja");
+Calendar._MN = new Array
+("SijeÄanj",
+ "VeljaÄa",
+ "Ožujak",
+ "Travanj",
+ "Svibanj",
+ "Lipanj",
+ "Srpanj",
+ "Kolovoz",
+ "Rujan",
+ "Listopad",
+ "Studeni",
+ "Prosinac");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["TOGGLE"] = "Promjeni dan s kojim poÄinje tjedan";
+Calendar._TT["PREV_YEAR"] = "Prethodna godina (dugi pritisak za meni)";
+Calendar._TT["PREV_MONTH"] = "Prethodni mjesec (dugi pritisak za meni)";
+Calendar._TT["GO_TODAY"] = "Idi na tekući dan";
+Calendar._TT["NEXT_MONTH"] = "Slijedeći mjesec (dugi pritisak za meni)";
+Calendar._TT["NEXT_YEAR"] = "Slijedeća godina (dugi pritisak za meni)";
+Calendar._TT["SEL_DATE"] = "Izaberite datum";
+Calendar._TT["DRAG_TO_MOVE"] = "Pritisni i povuci za promjenu pozicije";
+Calendar._TT["PART_TODAY"] = " (today)";
+Calendar._TT["MON_FIRST"] = "Prikaži ponedjeljak kao prvi dan";
+Calendar._TT["SUN_FIRST"] = "Prikaži nedjelju kao prvi dan";
+Calendar._TT["CLOSE"] = "Zatvori";
+Calendar._TT["TODAY"] = "Danas";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "dd-mm-y";
+Calendar._TT["TT_DATE_FORMAT"] = "DD, dd.mm.y";
+
+Calendar._TT["WK"] = "Tje";
+
+// First day of the week. 0 means display Sunday first, 1 means display
+// Monday first, etc.
+Calendar._FD = 1;
diff --git a/js/jscalendar/lang/calendar-hu.js b/js/jscalendar/lang/calendar-hu.js
new file mode 100644
index 0000000..7176260
--- /dev/null
+++ b/js/jscalendar/lang/calendar-hu.js
@@ -0,0 +1,126 @@
+// ** I18N
+
+// Calendar HU language
+// Author: ???
+// Modifier: KARASZI Istvan, <jscalendar@spam.raszi.hu>
+// Encoding: any
+// Distributed under the same terms as the calendar itself.
+
+// For translators: please use UTF-8 if possible. We strongly believe that
+// Unicode is the answer to a real internationalized world. Also please
+// include your contact information in the header, as can be seen above.
+
+// full day names
+Calendar._DN = new Array
+("VasĂ¡rnap",
+ "Hétfõ",
+ "Kedd",
+ "Szerda",
+ "CsĂ¼törtök",
+ "PĂ©ntek",
+ "Szombat",
+ "VasĂ¡rnap");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary. We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+// Calendar._SDN_len = N; // short day name length
+// Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("v",
+ "h",
+ "k",
+ "sze",
+ "cs",
+ "p",
+ "szo",
+ "v");
+
+Calendar._FD = 1;
+
+// full month names
+Calendar._MN = new Array
+("januĂ¡r",
+ "februĂ¡r",
+ "mĂ¡rcius",
+ "Ă¡prilis",
+ "mĂ¡jus",
+ "jĂºnius",
+ "jĂºlius",
+ "augusztus",
+ "szeptember",
+ "oktĂ³ber",
+ "november",
+ "december");
+
+// short month names
+Calendar._SMN = new Array
+("jan",
+ "feb",
+ "mĂ¡r",
+ "Ă¡pr",
+ "mĂ¡j",
+ "jĂºn",
+ "jĂºl",
+ "aug",
+ "sze",
+ "okt",
+ "nov",
+ "dec");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "A kalendĂ¡riumrĂ³l";
+
+Calendar._TT["ABOUT"] =
+"DHTML dĂ¡tum/idõ kivĂ¡lasztĂ³\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"a legfrissebb verziĂ³ megtalĂ¡lhatĂ³: http://www.dynarch.com/projects/calendar/\n" +
+"GNU LGPL alatt terjesztve. LĂ¡sd a http://gnu.org/licenses/lgpl.html oldalt a rĂ©szletekhez." +
+"\n\n" +
+"DĂ¡tum vĂ¡lasztĂ¡s:\n" +
+"- hasznĂ¡lja a \xab, \xbb gombokat az Ă©v kivĂ¡lasztĂ¡sĂ¡hoz\n" +
+"- hasznĂ¡lja a " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " gombokat a hĂ³nap kivĂ¡lasztĂ¡sĂ¡hoz\n" +
+"- tartsa lenyomva az egĂ©rgombot a gyors vĂ¡lasztĂ¡shoz.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Idõ vĂ¡lasztĂ¡s:\n" +
+"- kattintva növelheti az idõt\n" +
+"- shift-tel kattintva csökkentheti\n" +
+"- lenyomva tartva Ă©s hĂºzva gyorsabban kivĂ¡laszthatja.";
+
+Calendar._TT["PREV_YEAR"] = "Elõzõ Ă©v (tartsa nyomva a menĂ¼höz)";
+Calendar._TT["PREV_MONTH"] = "Elõzõ hĂ³nap (tartsa nyomva a menĂ¼höz)";
+Calendar._TT["GO_TODAY"] = "Mai napra ugrĂ¡s";
+Calendar._TT["NEXT_MONTH"] = "Köv. hĂ³nap (tartsa nyomva a menĂ¼höz)";
+Calendar._TT["NEXT_YEAR"] = "Köv. Ă©v (tartsa nyomva a menĂ¼höz)";
+Calendar._TT["SEL_DATE"] = "VĂ¡lasszon dĂ¡tumot";
+Calendar._TT["DRAG_TO_MOVE"] = "HĂºzza a mozgatĂ¡shoz";
+Calendar._TT["PART_TODAY"] = " (ma)";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "%s legyen a hét elsõ napja";
+
+// This may be locale-dependent. It specifies the week-end days, as an array
+// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "BezĂ¡r";
+Calendar._TT["TODAY"] = "Ma";
+Calendar._TT["TIME_PART"] = "(Shift-)Klikk vagy hĂºzĂ¡s az Ă©rtĂ©k vĂ¡ltoztatĂ¡sĂ¡hoz";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d";
+Calendar._TT["TT_DATE_FORMAT"] = "%b %e, %a";
+
+Calendar._TT["WK"] = "hét";
+Calendar._TT["TIME"] = "idõ:";
diff --git a/js/jscalendar/lang/calendar-it.js b/js/jscalendar/lang/calendar-it.js
new file mode 100644
index 0000000..1064d4d
--- /dev/null
+++ b/js/jscalendar/lang/calendar-it.js
@@ -0,0 +1,126 @@
+// ** I18N
+
+// Calendar IT language
+// Author: Mihai Bazon, <mihai_bazon@yahoo.com>
+// Translator: Fabio Di Bernardini, <altraqua@email.it>
+// Encoding: UTF-8
+// Distributed under the same terms as the calendar itself.
+
+// For translators: please use UTF-8 if possible. We strongly believe that
+// Unicode is the answer to a real internationalized world. Also please
+// include your contact information in the header, as can be seen above.
+
+// full day names
+Calendar._DN = new Array
+("Domenica",
+ "Lunedì",
+ "Martedì",
+ "Mercoledì",
+ "Giovedì",
+ "Venerdì",
+ "Sabato",
+ "Domenica");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary. We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+// Calendar._SDN_len = N; // short day name length
+// Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("Dom",
+ "Lun",
+ "Mar",
+ "Mer",
+ "Gio",
+ "Ven",
+ "Sab",
+ "Dom");
+
+Calendar._FD = 1;
+
+// full month names
+Calendar._MN = new Array
+("Gennaio",
+ "Febbraio",
+ "Marzo",
+ "Aprile",
+ "Maggio",
+ "Giugno",
+ "Luglio",
+ "Augosto",
+ "Settembre",
+ "Ottobre",
+ "Novembre",
+ "Dicembre");
+
+// short month names
+Calendar._SMN = new Array
+("Gen",
+ "Feb",
+ "Mar",
+ "Apr",
+ "Mag",
+ "Giu",
+ "Lug",
+ "Ago",
+ "Set",
+ "Ott",
+ "Nov",
+ "Dic");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "Informazioni sul calendario";
+
+Calendar._TT["ABOUT"] =
+"DHTML Date/Time Selector\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"Per gli aggiornamenti: http://www.dynarch.com/projects/calendar/\n" +
+"Distribuito sotto licenza GNU LGPL. Vedi http://gnu.org/licenses/lgpl.html per i dettagli." +
+"\n\n" +
+"Selezione data:\n" +
+"- Usa \xab, \xbb per selezionare l'anno\n" +
+"- Usa " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " per i mesi\n" +
+"- Tieni premuto a lungo il mouse per accedere alle funzioni di selezione veloce.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Selezione orario:\n" +
+"- Clicca sul numero per incrementarlo\n" +
+"- o Shift+click per decrementarlo\n" +
+"- o click e sinistra o destra per variarlo.";
+
+Calendar._TT["PREV_YEAR"] = "Anno prec.(clicca a lungo per il menĂ¹)";
+Calendar._TT["PREV_MONTH"] = "Mese prec. (clicca a lungo per il menĂ¹)";
+Calendar._TT["GO_TODAY"] = "Oggi";
+Calendar._TT["NEXT_MONTH"] = "Pross. mese (clicca a lungo per il menĂ¹)";
+Calendar._TT["NEXT_YEAR"] = "Pross. anno (clicca a lungo per il menĂ¹)";
+Calendar._TT["SEL_DATE"] = "Seleziona data";
+Calendar._TT["DRAG_TO_MOVE"] = "Trascina per spostarlo";
+Calendar._TT["PART_TODAY"] = " (oggi)";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "Mostra prima %s";
+
+// This may be locale-dependent. It specifies the week-end days, as an array
+// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "Chiudi";
+Calendar._TT["TODAY"] = "Oggi";
+Calendar._TT["TIME_PART"] = "(Shift-)Click o trascina per cambiare il valore";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%d-%m-%Y";
+Calendar._TT["TT_DATE_FORMAT"] = "%a:%b:%e";
+
+Calendar._TT["WK"] = "set";
+Calendar._TT["TIME"] = "Ora:";
diff --git a/js/jscalendar/lang/calendar-ja.js b/js/jscalendar/lang/calendar-ja.js
new file mode 100644
index 0000000..892c912
--- /dev/null
+++ b/js/jscalendar/lang/calendar-ja.js
@@ -0,0 +1,127 @@
+// ** I18N
+
+// Calendar JA language (Japanese)
+// Author: KAWASHIMA Takahiro
+// Encoding: UTF-8
+// Distributed under the same terms as the calendar itself.
+
+// For translators: please use UTF-8 if possible. We strongly believe that
+// Unicode is the answer to a real internationalized world. Also please
+// include your contact information in the header, as can be seen above.
+
+// full day names
+Calendar._DN = new Array
+("日曜日",
+ "月曜日",
+ "ç«æ›œæ—¥",
+ "水曜日",
+ "木曜日",
+ "金曜日",
+ "土曜日",
+ "日曜日");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary. We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+// Calendar._SDN_len = N; // short day name length
+// Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("æ—¥",
+ "月",
+ "ç«",
+ "æ°´",
+ "木",
+ "金",
+ "土",
+ "æ—¥");
+
+// First day of the week. "0" means display Sunday first, "1" means display
+// Monday first, etc.
+Calendar._FD = 0;
+
+// full month names
+Calendar._MN = new Array
+("1月",
+ "2月",
+ "3月",
+ "4月",
+ "5月",
+ "6月",
+ "7月",
+ "8月",
+ "9月",
+ "10月",
+ "11月",
+ "12月");
+
+// short month names
+Calendar._SMN = new Array
+("1月",
+ "2月",
+ "3月",
+ "4月",
+ "5月",
+ "6月",
+ "7月",
+ "8月",
+ "9月",
+ "10月",
+ "11月",
+ "12月");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "ă“ă®ă‚«ăƒ¬ăƒ³ăƒ€ăƒ¼ă«ă¤ă„ă¦";
+
+Calendar._TT["ABOUT"] =
+"DHTML Date/Time Selector\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"For latest version visit: http://www.dynarch.com/projects/calendar/\n" +
+"Distributed under GNU LGPL. See http://gnu.org/licenses/lgpl.html for details." +
+"\n\n" +
+"日付é¸æ:\n" +
+"- å¹´ă®é¸æă¯ \xab, \xbb ăƒœă‚¿ăƒ³\n" +
+"- 月ă®é¸æă¯ " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " ăƒœă‚¿ăƒ³\n" +
+"- 速ăé¸æă™ă‚‹ă«ă¯ä¸è¨˜ăƒœă‚¿ăƒ³ă‚’é•·æ¼ă—";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"時刻é¸æ:\n" +
+"- æ™‚åˆ»ă‚’é€²ă‚ă‚‹ă«ă¯æ™‚åˆ»ă‚’ă‚¯ăƒªăƒƒă‚¯\n" +
+"- 戻ă™ă«ă¯Shiftă‚¯ăƒªăƒƒă‚¯\n" +
+"- 速ăé¸æă™ă‚‹ă«ă¯ă‚¯ăƒªăƒƒă‚¯ă—ă¦ăƒ‰ăƒ©ăƒƒă‚°";
+
+Calendar._TT["PREV_YEAR"] = "å‰ă®å¹´ (é•·æ¼ă—ă§ăƒ¡ăƒ‹ăƒ¥ăƒ¼è¡¨ç¤º)";
+Calendar._TT["PREV_MONTH"] = "å‰ă®æœˆ (é•·æ¼ă—ă§ăƒ¡ăƒ‹ăƒ¥ăƒ¼è¡¨ç¤º)";
+Calendar._TT["GO_TODAY"] = "ä»æ—¥ă«ç§»å‹•";
+Calendar._TT["NEXT_MONTH"] = "次ă®æœˆ (é•·æ¼ă—ă§ăƒ¡ăƒ‹ăƒ¥ăƒ¼è¡¨ç¤º)";
+Calendar._TT["NEXT_YEAR"] = "次ă®å¹´ (é•·æ¼ă—ă§ăƒ¡ăƒ‹ăƒ¥ăƒ¼è¡¨ç¤º)";
+Calendar._TT["SEL_DATE"] = "日付é¸æ";
+Calendar._TT["DRAG_TO_MOVE"] = "ăƒ‰ăƒ©ăƒƒă‚°ă§ç§»å‹•";
+Calendar._TT["PART_TODAY"] = " (ä»æ—¥)";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "%să‚’æœ€åˆă«è¡¨ç¤º";
+
+// This may be locale-dependent. It specifies the week-end days, as an array
+// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "é–‰ă˜ă‚‹";
+Calendar._TT["TODAY"] = "ä»æ—¥";
+Calendar._TT["TIME_PART"] = "変更ă¯(Shift-)ă‚¯ăƒªăƒƒă‚¯ă¾ăŸă¯ăƒ‰ăƒ©ăƒƒă‚°";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%Y/%m/%d";
+Calendar._TT["TT_DATE_FORMAT"] = "%Yå¹´%b%eæ—¥(%a)";
+
+Calendar._TT["WK"] = "週";
+Calendar._TT["TIME"] = "時刻:";
diff --git a/js/jscalendar/lang/calendar-jp.js b/js/jscalendar/lang/calendar-jp.js
new file mode 100644
index 0000000..3bca7eb
--- /dev/null
+++ b/js/jscalendar/lang/calendar-jp.js
@@ -0,0 +1,45 @@
+// ** I18N
+Calendar._DN = new Array
+("“ú",
+ "Œ",
+ "‰Î",
+ "…",
+ "–Ø",
+ "‹à",
+ "“y",
+ "“ú");
+Calendar._MN = new Array
+("1Œ",
+ "2Œ",
+ "3Œ",
+ "4Œ",
+ "5Œ",
+ "6Œ",
+ "7Œ",
+ "8Œ",
+ "9Œ",
+ "10Œ",
+ "11Œ",
+ "12Œ");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["TOGGLE"] = "T‚̀ʼn‚̀—j“ú‚đØ‚è‘Ö‚¦";
+Calendar._TT["PREV_YEAR"] = "‘O”N";
+Calendar._TT["PREV_MONTH"] = "‘OŒ";
+Calendar._TT["GO_TODAY"] = "¡“ú";
+Calendar._TT["NEXT_MONTH"] = "—‚Œ";
+Calendar._TT["NEXT_YEAR"] = "—‚”N";
+Calendar._TT["SEL_DATE"] = "“ú•t‘I‘đ";
+Calendar._TT["DRAG_TO_MOVE"] = "ƒEƒBƒ“ƒhƒE‚̀ˆÚ“®";
+Calendar._TT["PART_TODAY"] = " (¡“ú)";
+Calendar._TT["MON_FIRST"] = "Œ—j“ú‚đ擪‚É";
+Calendar._TT["SUN_FIRST"] = "“ú—j“ú‚đ擪‚É";
+Calendar._TT["CLOSE"] = "•Â‚¶‚é";
+Calendar._TT["TODAY"] = "¡“ú";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "y-mm-dd";
+Calendar._TT["TT_DATE_FORMAT"] = "%mŒ %d“ú (%a)";
+
+Calendar._TT["WK"] = "T";
diff --git a/js/jscalendar/lang/calendar-ko.js b/js/jscalendar/lang/calendar-ko.js
new file mode 100644
index 0000000..100b978
--- /dev/null
+++ b/js/jscalendar/lang/calendar-ko.js
@@ -0,0 +1,119 @@
+// ** I18N
+
+// Calendar KO language
+// Author: Mihai Bazon, <mihai_bazon@yahoo.com>
+// Translation: Yourim Yi <yyi@yourim.net>
+// Encoding: UTF-8
+// lang : ko
+// Distributed under the same terms as the calendar itself.
+
+// For translators: please use UTF-8 if possible. We strongly believe that
+// Unicode is the answer to a real internationalized world. Also please
+// include your contact information in the header, as can be seen above.
+
+// full day names
+Calendar._DN = new Array
+("́¼́”́¼",
+ "́›”́”́¼",
+ "í™”́”́¼",
+ "́ˆ˜́”́¼",
+ "목́”́¼",
+ "금́”́¼",
+ "토́”́¼",
+ "́¼́”́¼");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary. We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+// Calendar._SDN_len = N; // short day name length
+// Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("́¼",
+ "́›”",
+ "í™”",
+ "́ˆ˜",
+ "목",
+ "금",
+ "토",
+ "́¼");
+
+// full month names
+Calendar._MN = new Array
+("1́›”",
+ "2́›”",
+ "3́›”",
+ "4́›”",
+ "5́›”",
+ "6́›”",
+ "7́›”",
+ "8́›”",
+ "9́›”",
+ "10́›”",
+ "11́›”",
+ "12́›”");
+
+// short month names
+Calendar._SMN = new Array
+("1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7",
+ "8",
+ "9",
+ "10",
+ "11",
+ "12");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "calendar ́— 대해́„œ";
+
+Calendar._TT["ABOUT"] =
+"DHTML Date/Time Selector\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"\n"+
+"́µœ́‹  버́ „́„ ë°›́œ¼́‹œë ¤ë©´ http://www.dynarch.com/projects/calendar/ ́— 방문하́„¸́”\n" +
+"\n"+
+"GNU LGPL ë¼́´́„¼́¤ë¡œ ë°°í¬ë©ë‹ˆë‹¤. \n"+
+"ë¼́´́„¼́¤́— 대한 ́́„¸í•œ ë‚´́©́€ http://gnu.org/licenses/lgpl.html ́„ ́½́œ¼́„¸́”." +
+"\n\n" +
+"ë‚ ́§œ ́„ íƒ:\n" +
+"- ́—°ë„를 ́„ íƒí•˜ë ¤ë©´ \xab, \xbb 버í¼́„ ́‚¬́©í•©ë‹ˆë‹¤\n" +
+"- 달́„ ́„ íƒí•˜ë ¤ë©´ " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " 버í¼́„ 누르́„¸́”\n" +
+"- 계́† 누르고 ́ˆ́œ¼ë©´ ́œ„ 값들́„ 빠르게 ́„ íƒí•˜́‹¤ ́ˆ˜ ́ˆ́µë‹ˆë‹¤.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"́‹œê°„ ́„ íƒ:\n" +
+"- 마́°́¤ë¡œ 누르면 ́‹œê°„́´ ́¦ê°€í•©ë‹ˆë‹¤\n" +
+"- Shift 키́™€ 함께 누르면 ê°́†Œí•©ë‹ˆë‹¤\n" +
+"- 누른 ́ƒíƒœ́—́„œ 마́°́¤ë¥¼ ́›€́§́´ë©´ ́¢€ ë” ë¹ ë¥´ê²Œ ê°’́´ 변합니다.\n";
+
+Calendar._TT["PREV_YEAR"] = "́§€ë‚œ í•´ (길게 누르면 목ë¡)";
+Calendar._TT["PREV_MONTH"] = "́§€ë‚œ 달 (길게 누르면 목ë¡)";
+Calendar._TT["GO_TODAY"] = "́˜¤ë˜ ë‚ ́§œë¡œ";
+Calendar._TT["NEXT_MONTH"] = "다́Œ 달 (길게 누르면 목ë¡)";
+Calendar._TT["NEXT_YEAR"] = "다́Œ í•´ (길게 누르면 목ë¡)";
+Calendar._TT["SEL_DATE"] = "ë‚ ́§œë¥¼ ́„ íƒí•˜́„¸́”";
+Calendar._TT["DRAG_TO_MOVE"] = "마́°́¤ ë“œë˜ê·¸ë¡œ ́´ë™ 하́„¸́”";
+Calendar._TT["PART_TODAY"] = " (́˜¤ë˜)";
+Calendar._TT["MON_FIRST"] = "́›”́”́¼́„ í•œ ́£¼́˜ ́‹œ́‘ ́”́¼ë¡œ";
+Calendar._TT["SUN_FIRST"] = "́¼́”́¼́„ í•œ ́£¼́˜ ́‹œ́‘ ́”́¼ë¡œ";
+Calendar._TT["CLOSE"] = "닫기";
+Calendar._TT["TODAY"] = "́˜¤ë˜";
+Calendar._TT["TIME_PART"] = "(Shift-)í´ë¦­ ë˜ë” ë“œë˜ê·¸ 하́„¸́”";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d";
+Calendar._TT["TT_DATE_FORMAT"] = "%b/%e [%a]";
+
+Calendar._TT["WK"] = "́£¼";
diff --git a/js/jscalendar/lang/calendar-lt.js b/js/jscalendar/lang/calendar-lt.js
new file mode 100644
index 0000000..d39653b
--- /dev/null
+++ b/js/jscalendar/lang/calendar-lt.js
@@ -0,0 +1,114 @@
+// ** I18N
+
+// Calendar LT language
+// Author: Martynas Majeris, <martynas@solmetra.lt>
+// Encoding: UTF-8
+// Distributed under the same terms as the calendar itself.
+
+// For translators: please use UTF-8 if possible. We strongly believe that
+// Unicode is the answer to a real internationalized world. Also please
+// include your contact information in the header, as can be seen above.
+
+// full day names
+Calendar._DN = new Array
+("Sekmadienis",
+ "Pirmadienis",
+ "Antradienis",
+ "TreÄiadienis",
+ "Ketvirtadienis",
+ "Pentadienis",
+ "Šeštadienis",
+ "Sekmadienis");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary. We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+// Calendar._SDN_len = N; // short day name length
+// Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("Sek",
+ "Pir",
+ "Ant",
+ "Tre",
+ "Ket",
+ "Pen",
+ "Šeš",
+ "Sek");
+
+// full month names
+Calendar._MN = new Array
+("Sausis",
+ "Vasaris",
+ "Kovas",
+ "Balandis",
+ "Gegužė",
+ "Birželis",
+ "Liepa",
+ "Rugpjūtis",
+ "RugsÄ—jis",
+ "Spalis",
+ "Lapkritis",
+ "Gruodis");
+
+// short month names
+Calendar._SMN = new Array
+("Sau",
+ "Vas",
+ "Kov",
+ "Bal",
+ "Geg",
+ "Bir",
+ "Lie",
+ "Rgp",
+ "Rgs",
+ "Spa",
+ "Lap",
+ "Gru");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "Apie kalendorių";
+
+Calendar._TT["ABOUT"] =
+"DHTML Date/Time Selector\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"NaujausiÄ… versijÄ… rasite: http://www.dynarch.com/projects/calendar/\n" +
+"Platinamas pagal GNU LGPL licencijÄ…. Aplankykite http://gnu.org/licenses/lgpl.html" +
+"\n\n" +
+"Datos pasirinkimas:\n" +
+"- Metų pasirinkimas: \xab, \xbb\n" +
+"- MÄ—nesio pasirinkimas: " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + "\n" +
+"- Nuspauskite ir laikykite pelės klavišą greitesniam pasirinkimui.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Laiko pasirinkimas:\n" +
+"- Spustelkite ant valandų arba minuÄių - skaiÄius padidÄ—s vienetu.\n" +
+"- Jei spausite kartu su Shift, skaiÄius sumažės.\n" +
+"- Greitam pasirinkimui spustelkite ir pajudinkite pelÄ™.";
+
+Calendar._TT["PREV_YEAR"] = "Ankstesni metai (laikykite, jei norite meniu)";
+Calendar._TT["PREV_MONTH"] = "Ankstesnis mÄ—nuo (laikykite, jei norite meniu)";
+Calendar._TT["GO_TODAY"] = "Pasirinkti Å¡iandienÄ…";
+Calendar._TT["NEXT_MONTH"] = "Kitas mÄ—nuo (laikykite, jei norite meniu)";
+Calendar._TT["NEXT_YEAR"] = "Kiti metai (laikykite, jei norite meniu)";
+Calendar._TT["SEL_DATE"] = "Pasirinkite datÄ…";
+Calendar._TT["DRAG_TO_MOVE"] = "Tempkite";
+Calendar._TT["PART_TODAY"] = " (Å¡iandien)";
+Calendar._TT["MON_FIRST"] = "Pirma savaitÄ—s diena - pirmadienis";
+Calendar._TT["SUN_FIRST"] = "Pirma savaitÄ—s diena - sekmadienis";
+Calendar._TT["CLOSE"] = "Uždaryti";
+Calendar._TT["TODAY"] = "Å iandien";
+Calendar._TT["TIME_PART"] = "Spustelkite arba tempkite jei norite pakeisti";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d";
+Calendar._TT["TT_DATE_FORMAT"] = "%A, %Y-%m-%d";
+
+Calendar._TT["WK"] = "sav";
diff --git a/js/jscalendar/lang/calendar-lv.js b/js/jscalendar/lang/calendar-lv.js
new file mode 100644
index 0000000..407699d
--- /dev/null
+++ b/js/jscalendar/lang/calendar-lv.js
@@ -0,0 +1,123 @@
+// ** I18N
+
+// Calendar LV language
+// Author: Juris Valdovskis, <juris@dc.lv>
+// Encoding: cp1257
+// Distributed under the same terms as the calendar itself.
+
+// For translators: please use UTF-8 if possible. We strongly believe that
+// Unicode is the answer to a real internationalized world. Also please
+// include your contact information in the header, as can be seen above.
+
+// full day names
+Calendar._DN = new Array
+("Svçtdiena",
+ "Pirmdiena",
+ "Otrdiena",
+ "Tređdiena",
+ "Ceturdiena",
+ "Piektdiena",
+ "Sestdiena",
+ "Svçtdiena");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary. We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+// Calendar._SDN_len = N; // short day name length
+// Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("Sv",
+ "Pr",
+ "Ot",
+ "Tr",
+ "Ce",
+ "Pk",
+ "Se",
+ "Sv");
+
+// full month names
+Calendar._MN = new Array
+("Janvâris",
+ "Februâris",
+ "Marts",
+ "Aprîlis",
+ "Maijs",
+ "Jûnijs",
+ "Jûlijs",
+ "Augusts",
+ "Septembris",
+ "Oktobris",
+ "Novembris",
+ "Decembris");
+
+// short month names
+Calendar._SMN = new Array
+("Jan",
+ "Feb",
+ "Mar",
+ "Apr",
+ "Mai",
+ "Jûn",
+ "Jûl",
+ "Aug",
+ "Sep",
+ "Okt",
+ "Nov",
+ "Dec");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "Par kalendâru";
+
+Calendar._TT["ABOUT"] =
+"DHTML Date/Time Selector\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"For latest version visit: http://www.dynarch.com/projects/calendar/\n" +
+"Distributed under GNU LGPL. See http://gnu.org/licenses/lgpl.html for details." +
+"\n\n" +
+"Datuma izvçle:\n" +
+"- Izmanto \xab, \xbb pogas, lai izvçlçtos gadu\n" +
+"- Izmanto " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + "pogas, lai izvçlçtos mçnesi\n" +
+"- Turi nospiestu peles pogu uz jebkuru no augstâk minçtajâm pogâm, lai paâtrinâtu izvçli.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Laika izvçle:\n" +
+"- Uzklikđíini uz jebkuru no laika daïâm, lai palielinâtu to\n" +
+"- vai Shift-klikđíis, lai samazinâtu to\n" +
+"- vai noklikđíini un velc uz attiecîgo virzienu lai mainîtu âtrâk.";
+
+Calendar._TT["PREV_YEAR"] = "Iepr. gads (turi izvçlnei)";
+Calendar._TT["PREV_MONTH"] = "Iepr. mçnesis (turi izvçlnei)";
+Calendar._TT["GO_TODAY"] = "Đodien";
+Calendar._TT["NEXT_MONTH"] = "Nâkođais mçnesis (turi izvçlnei)";
+Calendar._TT["NEXT_YEAR"] = "Nâkođais gads (turi izvçlnei)";
+Calendar._TT["SEL_DATE"] = "Izvçlies datumu";
+Calendar._TT["DRAG_TO_MOVE"] = "Velc, lai pârvietotu";
+Calendar._TT["PART_TODAY"] = " (đodien)";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "Attçlot %s kâ pirmo";
+
+// This may be locale-dependent. It specifies the week-end days, as an array
+// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "1,7";
+
+Calendar._TT["CLOSE"] = "Aizvçrt";
+Calendar._TT["TODAY"] = "Đodien";
+Calendar._TT["TIME_PART"] = "(Shift-)Klikđíis vai pârvieto, lai mainîtu";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%d-%m-%Y";
+Calendar._TT["TT_DATE_FORMAT"] = "%a, %e %b";
+
+Calendar._TT["WK"] = "wk";
+Calendar._TT["TIME"] = "Laiks:";
diff --git a/js/jscalendar/lang/calendar-mk.js b/js/jscalendar/lang/calendar-mk.js
new file mode 100644
index 0000000..bef512b
--- /dev/null
+++ b/js/jscalendar/lang/calendar-mk.js
@@ -0,0 +1,119 @@
+// Calendar MK Macedonian language
+// Distributed under the same terms as the calendar itself.
+
+// full day names
+Calendar._DN = new Array
+("Đ½ĐµĐ´ĐµĐ»Đ°",
+ "Đ¿Đ¾Đ½ĐµĐ´ĐµĐ»Đ½Đ¸Đº",
+ "Đ²Ñ‚Đ¾Ñ€Đ½Đ¸Đº",
+ "ÑÑ€ĐµĐ´Đ°",
+ "Ñ‡ĐµÑ‚Đ²Ñ€Ñ‚Đ¾Đº",
+ "Đ¿ĐµÑ‚Đ¾Đº",
+ "ÑĐ°Đ±Đ¾Ñ‚Đ°",
+ "Đ½ĐµĐ´ĐµĐ»Đ°");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary. We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+// Calendar._SDN_len = N; // short day name length
+// Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("Đ½ĐµĐ´",
+ "Đ¿Đ¾Đ½",
+ "Đ²Ñ‚",
+ "ÑÑ€Đµ",
+ "Ñ‡ĐµÑ‚",
+ "Đ¿ĐµÑ‚",
+ "Ñаб",
+ "Đ½ĐµĐ´");
+
+// First day of the week. "0" means display Sunday first, "1" means display
+// Monday first, etc.
+Calendar._FD = 1;
+
+// full month names
+Calendar._MN = new Array
+("Ñ˜Đ°Đ½ÑƒĐ°Ñ€Đ¸",
+ "Ñ„ĐµĐ²Ñ€ÑƒĐ°Ñ€Đ¸",
+ "Đ¼Đ°Ñ€Ñ‚",
+ "Đ°Đ¿Ñ€Đ¸Đ»",
+ "Đ¼Đ°Ñ˜",
+ "Ñ˜ÑƒĐ½Đ¸",
+ "Ñ˜ÑƒĐ»Đ¸",
+ "Đ°Đ²Đ³ÑƒÑÑ‚",
+ "ÑĐµĐ¿Ñ‚ĐµĐ¼Đ²Ñ€Đ¸",
+ "Đ¾ĐºÑ‚Đ¾Đ¼Đ²Ñ€Đ¸",
+ "Đ½Đ¾ĐµĐ¼Đ²Ñ€Đ¸",
+ "Đ´ĐµĐºĐµĐ¼Đ²Ñ€Đ¸");
+
+// short month names
+Calendar._SMN = new Array
+("Ñ˜Đ°Đ½",
+ "Ñ„ĐµĐ²",
+ "Đ¼Đ°Ñ€",
+ "Đ°Đ¿Ñ€",
+ "Đ¼Đ°Ñ˜",
+ "Ñ˜ÑƒĐ½",
+ "Ñ˜ÑƒĐ»",
+ "Đ°Đ²Đ³",
+ "ÑĐµĐ¿Ñ‚",
+ "Đ¾ĐºÑ‚",
+ "Đ½Đ¾ĐµĐ¼",
+ "Đ´ĐµĐºĐµĐ¼");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "About the calendar";
+
+Calendar._TT["ABOUT"] =
+"DHTML Date/Time Selector\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"For latest version visit: http://www.dynarch.com/projects/calendar/\n" +
+"Distributed under GNU LGPL. See http://gnu.org/licenses/lgpl.html for details." +
+"\n\n" +
+"Date selection:\n" +
+"- Use the \xab, \xbb buttons to select year\n" +
+"- Use the " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " buttons to select month\n" +
+"- Hold mouse button on any of the above buttons for faster selection.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Time selection:\n" +
+"- Click on any of the time parts to increase it\n" +
+"- or Shift-click to decrease it\n" +
+"- or click and drag for faster selection.";
+
+Calendar._TT["PREV_YEAR"] = "Prev. year (hold for menu)";
+Calendar._TT["PREV_MONTH"] = "Prev. month (hold for menu)";
+Calendar._TT["GO_TODAY"] = "Go Today";
+Calendar._TT["NEXT_MONTH"] = "Next month (hold for menu)";
+Calendar._TT["NEXT_YEAR"] = "Next year (hold for menu)";
+Calendar._TT["SEL_DATE"] = "Select date";
+Calendar._TT["DRAG_TO_MOVE"] = "Drag to move";
+Calendar._TT["PART_TODAY"] = " (today)";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "Display %s first";
+
+// This may be locale-dependent. It specifies the week-end days, as an array
+// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "Close";
+Calendar._TT["TODAY"] = "Đ´ĐµĐ½ĐµÑĐºĐ°";
+Calendar._TT["TIME_PART"] = "(Shift-)Click or drag to change value";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%d.%m.%Y";
+Calendar._TT["TT_DATE_FORMAT"] = "%A - %e %B %Y";
+
+Calendar._TT["WK"] = "wk";
+Calendar._TT["TIME"] = "Time";
diff --git a/js/jscalendar/lang/calendar-nl.js b/js/jscalendar/lang/calendar-nl.js
new file mode 100644
index 0000000..dd71f0f
--- /dev/null
+++ b/js/jscalendar/lang/calendar-nl.js
@@ -0,0 +1,75 @@
+// ** I18N
+Calendar._DN = new Array
+("Zondag",
+ "Maandag",
+ "Dinsdag",
+ "Woensdag",
+ "Donderdag",
+ "Vrijdag",
+ "Zaterdag",
+ "Zondag");
+
+Calendar._SDN_len = 2;
+
+Calendar._FD = 1;
+
+Calendar._MN = new Array
+("Januari",
+ "Februari",
+ "Maart",
+ "April",
+ "Mei",
+ "Juni",
+ "Juli",
+ "Augustus",
+ "September",
+ "Oktober",
+ "November",
+ "December");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "Info";
+
+Calendar._TT["ABOUT"] =
+"DHTML Datum/Tijd Selector\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" +
+"Ga voor de meest recente versie naar: http://www.dynarch.com/projects/calendar/\n" +
+"Verspreid onder de GNU LGPL. Zie http://gnu.org/licenses/lgpl.html voor details." +
+"\n\n" +
+"Datum selectie:\n" +
+"- Gebruik de \xab \xbb knoppen om een jaar te selecteren\n" +
+"- Gebruik de " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " knoppen om een maand te selecteren\n" +
+"- Houd de muis ingedrukt op de genoemde knoppen voor een snellere selectie.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Tijd selectie:\n" +
+"- Klik op een willekeurig onderdeel van het tijd gedeelte om het te verhogen\n" +
+"- of Shift-klik om het te verlagen\n" +
+"- of klik en sleep voor een snellere selectie.";
+
+//Calendar._TT["TOGGLE"] = "Selecteer de eerste week-dag";
+Calendar._TT["PREV_YEAR"] = "Vorig jaar (ingedrukt voor menu)";
+Calendar._TT["PREV_MONTH"] = "Vorige maand (ingedrukt voor menu)";
+Calendar._TT["GO_TODAY"] = "Ga naar Vandaag";
+Calendar._TT["NEXT_MONTH"] = "Volgende maand (ingedrukt voor menu)";
+Calendar._TT["NEXT_YEAR"] = "Volgend jaar (ingedrukt voor menu)";
+Calendar._TT["SEL_DATE"] = "Selecteer datum";
+Calendar._TT["DRAG_TO_MOVE"] = "Klik en sleep om te verplaatsen";
+Calendar._TT["PART_TODAY"] = " (vandaag)";
+//Calendar._TT["MON_FIRST"] = "Toon Maandag eerst";
+//Calendar._TT["SUN_FIRST"] = "Toon Zondag eerst";
+
+Calendar._TT["DAY_FIRST"] = "Toon %s eerst";
+
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "Sluiten";
+Calendar._TT["TODAY"] = "(vandaag)";
+Calendar._TT["TIME_PART"] = "(Shift-)Klik of sleep om de waarde te veranderen";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%d-%m-%Y";
+Calendar._TT["TT_DATE_FORMAT"] = "%a, %e %b %Y";
+
+Calendar._TT["WK"] = "wk";
+Calendar._TT["TIME"] = "Tijd:";
diff --git a/js/jscalendar/lang/calendar-no.js b/js/jscalendar/lang/calendar-no.js
new file mode 100644
index 0000000..9ef42d8
--- /dev/null
+++ b/js/jscalendar/lang/calendar-no.js
@@ -0,0 +1,127 @@
+// ** I18N
+
+// Calendar NO language
+// Author: Daniel Holmen, <daniel.holmen@ciber.no>
+// Encoding: UTF-8
+// Distributed under the same terms as the calendar itself.
+
+// For translators: please use UTF-8 if possible. We strongly believe that
+// Unicode is the answer to a real internationalized world. Also please
+// include your contact information in the header, as can be seen above.
+
+// full day names
+Calendar._DN = new Array
+("Søndag",
+ "Mandag",
+ "Tirsdag",
+ "Onsdag",
+ "Torsdag",
+ "Fredag",
+ "Lørdag",
+ "Søndag");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary. We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+// Calendar._SDN_len = N; // short day name length
+// Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("Søn",
+ "Man",
+ "Tir",
+ "Ons",
+ "Tor",
+ "Fre",
+ "Lør",
+ "Søn");
+
+Calendar._FD = 1;
+
+// full month names
+Calendar._MN = new Array
+("Januar",
+ "Februar",
+ "Mars",
+ "April",
+ "Mai",
+ "Juni",
+ "Juli",
+ "August",
+ "September",
+ "Oktober",
+ "November",
+ "Desember");
+
+// short month names
+Calendar._SMN = new Array
+("Jan",
+ "Feb",
+ "Mar",
+ "Apr",
+ "Mai",
+ "Jun",
+ "Jul",
+ "Aug",
+ "Sep",
+ "Okt",
+ "Nov",
+ "Des");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "Om kalenderen";
+
+Calendar._TT["ABOUT"] =
+"DHTML Dato-/Tidsvelger\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"For nyeste versjon, gĂ¥ til: http://www.dynarch.com/projects/calendar/\n" +
+"Distribuert under GNU LGPL. Se http://gnu.org/licenses/lgpl.html for detaljer." +
+"\n\n" +
+"Datovalg:\n" +
+"- Bruk knappene \xab og \xbb for Ă¥ velge Ă¥r\n" +
+"- Bruk knappene " + String.fromCharCode(0x2039) + " og " + String.fromCharCode(0x203a) + " for Ă¥ velge mĂ¥ned\n" +
+"- Hold inne musknappen eller knappene over for raskere valg.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Tidsvalg:\n" +
+"- Klikk pĂ¥ en av tidsdelene for Ă¥ øke den\n" +
+"- eller Shift-klikk for Ă¥ senke verdien\n" +
+"- eller klikk-og-dra for raskere valg..";
+
+Calendar._TT["PREV_YEAR"] = "Forrige. Ă¥r (hold for meny)";
+Calendar._TT["PREV_MONTH"] = "Forrige. mĂ¥ned (hold for meny)";
+Calendar._TT["GO_TODAY"] = "GĂ¥ til idag";
+Calendar._TT["NEXT_MONTH"] = "Neste mĂ¥ned (hold for meny)";
+Calendar._TT["NEXT_YEAR"] = "Neste Ă¥r (hold for meny)";
+Calendar._TT["SEL_DATE"] = "Velg dato";
+Calendar._TT["DRAG_TO_MOVE"] = "Dra for Ă¥ flytte";
+Calendar._TT["PART_TODAY"] = " (idag)";
+Calendar._TT["MON_FIRST"] = "Vis mandag først";
+Calendar._TT["SUN_FIRST"] = "Vis søndag først";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "Display %s first";
+
+// This may be locale-dependent. It specifies the week-end days, as an array
+// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+
+Calendar._TT["CLOSE"] = "Lukk";
+Calendar._TT["TODAY"] = "Idag";
+Calendar._TT["TIME_PART"] = "(Shift-)Klikk eller dra for Ă¥ endre verdi";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%d.%m.%Y";
+Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e";
+
+Calendar._TT["WK"] = "uke";
diff --git a/js/jscalendar/lang/calendar-pl-utf8.js b/js/jscalendar/lang/calendar-pl-utf8.js
new file mode 100644
index 0000000..6b8ca67
--- /dev/null
+++ b/js/jscalendar/lang/calendar-pl-utf8.js
@@ -0,0 +1,93 @@
+// ** I18N
+
+// Calendar PL language
+// Author: Dariusz Pietrzak, <eyck@ghost.anime.pl>
+// Author: Janusz Piwowarski, <jpiw@go2.pl>
+// Encoding: utf-8
+// Distributed under the same terms as the calendar itself.
+
+Calendar._DN = new Array
+("Niedziela",
+ "Poniedziałek",
+ "Wtorek",
+ "Åroda",
+ "Czwartek",
+ "PiÄ…tek",
+ "Sobota",
+ "Niedziela");
+Calendar._SDN = new Array
+("Nie",
+ "Pn",
+ "Wt",
+ "År",
+ "Cz",
+ "Pt",
+ "So",
+ "Nie");
+Calendar._MN = new Array
+("Styczeń",
+ "Luty",
+ "Marzec",
+ "Kwiecień",
+ "Maj",
+ "Czerwiec",
+ "Lipiec",
+ "Sierpień",
+ "Wrzesień",
+ "Październik",
+ "Listopad",
+ "Grudzień");
+Calendar._SMN = new Array
+("Sty",
+ "Lut",
+ "Mar",
+ "Kwi",
+ "Maj",
+ "Cze",
+ "Lip",
+ "Sie",
+ "Wrz",
+ "Paź",
+ "Lis",
+ "Gru");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "O kalendarzu";
+
+Calendar._TT["ABOUT"] =
+"DHTML Date/Time Selector\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"Aby pobrać najnowszą wersję, odwiedź: http://www.dynarch.com/projects/calendar/\n" +
+"DostÄ™pny na licencji GNU LGPL. Zobacz szczegĂ³Å‚y na http://gnu.org/licenses/lgpl.html." +
+"\n\n" +
+"WybĂ³r daty:\n" +
+"- Użyj przyciskĂ³w \xab, \xbb by wybrać rok\n" +
+"- Użyj przyciskĂ³w " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " by wybrać miesiÄ…c\n" +
+"- Przytrzymaj klawisz myszy nad jednym z powyższych przyciskĂ³w dla szybszego wyboru.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"WybĂ³r czasu:\n" +
+"- Kliknij na jednym z pĂ³l czasu by zwiÄ™kszyć jego wartość\n" +
+"- lub kliknij trzymając Shift by zmiejszyć jego wartość\n" +
+"- lub kliknij i przeciÄ…gnij dla szybszego wyboru.";
+
+//Calendar._TT["TOGGLE"] = "Zmień pierwszy dzień tygodnia";
+Calendar._TT["PREV_YEAR"] = "Poprzedni rok (przytrzymaj dla menu)";
+Calendar._TT["PREV_MONTH"] = "Poprzedni miesiÄ…c (przytrzymaj dla menu)";
+Calendar._TT["GO_TODAY"] = "Idź do dzisiaj";
+Calendar._TT["NEXT_MONTH"] = "Następny miesiąc (przytrzymaj dla menu)";
+Calendar._TT["NEXT_YEAR"] = "Następny rok (przytrzymaj dla menu)";
+Calendar._TT["SEL_DATE"] = "Wybierz datÄ™";
+Calendar._TT["DRAG_TO_MOVE"] = "Przeciągnij by przesunąć";
+Calendar._TT["PART_TODAY"] = " (dzisiaj)";
+Calendar._TT["MON_FIRST"] = "Wyświetl poniedziałek jako pierwszy";
+Calendar._TT["SUN_FIRST"] = "Wyświetl niedzielę jako pierwszą";
+Calendar._TT["CLOSE"] = "Zamknij";
+Calendar._TT["TODAY"] = "Dzisiaj";
+Calendar._TT["TIME_PART"] = "(Shift-)Kliknij lub przeciągnij by zmienić wartość";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d";
+Calendar._TT["TT_DATE_FORMAT"] = "%e %B, %A";
+
+Calendar._TT["WK"] = "ty";
diff --git a/js/jscalendar/lang/calendar-pl.js b/js/jscalendar/lang/calendar-pl.js
new file mode 100644
index 0000000..c2846a3
--- /dev/null
+++ b/js/jscalendar/lang/calendar-pl.js
@@ -0,0 +1,133 @@
+// ** I18N
+
+// ** I18N
+// Calendar PL language
+// Original translator
+// Author: Artur Filipiak, <imagen@poczta.fm>
+// January, 2004
+// Encoding: UTF-8
+// Little modifications to help use this calendar translation with Flyspray:
+// Paweł W., <dawajpoczte@gmail.com>
+// May 2007.
+
+
+// For translators: please use UTF-8 if possible. We strongly believe that
+// Unicode is the answer to a real internationalized world. Also please
+// include your contact information in the header, as can be seen above.
+
+// full day names
+Calendar._DN = new Array
+("Niedziela",
+ "Poniedziałek",
+ "Wtorek",
+ "Åroda",
+ "Czwartek",
+ "PiÄ…tek",
+ "Sobota",
+ "Niedziela");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary. We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+// Calendar._SDN_len = N; // short day name length
+// Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("Nie",
+ "Pon",
+ "Wto",
+ "År.",
+ "Czw",
+ "Pt.",
+ "Sb.",
+ "Nie");
+
+// First day of the week. "0" means display Sunday first, "1" means display
+// Monday first, etc.
+Calendar._FD = 1;
+
+// full month names
+Calendar._MN = new Array
+("Styczeń",
+ "Luty",
+ "Marzec",
+ "Kwiecień",
+ "Maj",
+ "Czerwiec",
+ "Lipiec",
+ "Sierpień",
+ "Wrzesień",
+ "Październik",
+ "Listopad",
+ "Grudzień");
+
+// short month names
+Calendar._SMN = new Array
+("Sty",
+ "Lut",
+ "Mar",
+ "Kwi",
+ "Maj",
+ "Cze",
+ "Lip",
+ "Sie",
+ "Wrz",
+ "Paź",
+ "Lis",
+ "Gru");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "O kalendarzu";
+
+Calendar._TT["ABOUT"] =
+"DHTML Date/Time Selector\n" +
+"(c) dynarch.com 2002-2005 / Autor: Mihai Bazon\n" + // don't translate this this ;-)
+"For latest version visit: http://www.dynarch.com/projects/calendar/\n" +
+"Distributed under GNU LGPL. See http://gnu.org/licenses/lgpl.html for details." +
+"\n\n" +
+"WybĂ³r daty:\n" +
+"- Użyj przyciskĂ³w \xab, \xbb aby wybrać rok year\n" +
+"- Uzyj przyciskĂ³w " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " aby wybrać miesiÄ…c\n" +
+"- aby przyspieszyć wybĂ³r przytrzymaj wciÅ›niÄ™ty przycisk myszy nad ww. przyciskami.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"WybĂ³r czasu:\n" +
+"- aby zwiększyć wartość kliknij na dowolnym elemencie selekcji czasu\n" +
+"- aby zmniejszyć wartość użyj dodatkowo klawisza Shift\n" +
+"- możesz rĂ³wnież poruszać myszkÄ™ w lewo i prawo wraz z wciÅ›niÄ™tym lewym klawiszem.";
+
+Calendar._TT["PREV_YEAR"] = "Poprz. rok (przytrzymaj dla menu)";
+Calendar._TT["PREV_MONTH"] = "Poprz. miesiÄ…c (przytrzymaj dla menu)";
+Calendar._TT["GO_TODAY"] = "Pokaż dziś";
+Calendar._TT["NEXT_MONTH"] = "Nast. miesiÄ…c (przytrzymaj dla menu)";
+Calendar._TT["NEXT_YEAR"] = "Nast. rok (przytrzymaj dla menu)";
+Calendar._TT["SEL_DATE"] = "Wybierz datÄ™";
+Calendar._TT["DRAG_TO_MOVE"] = "Kliknij aby przesunąć okienko";
+Calendar._TT["PART_TODAY"] = " (dziÅ›)";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "%s jako pierwszy dzień tygodnia";
+
+// This may be locale-dependent. It specifies the week-end days, as an array
+// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "Zamknij";
+Calendar._TT["TODAY"] = "DziÅ›";
+Calendar._TT["TIME_PART"] = "(Shift-)klik | przyciśnij, aby zmienić wartość";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d";
+Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e";
+
+Calendar._TT["WK"] = "wk";
+Calendar._TT["TIME"] = "Time:";
diff --git a/js/jscalendar/lang/calendar-pt.js b/js/jscalendar/lang/calendar-pt.js
new file mode 100644
index 0000000..deee8a1
--- /dev/null
+++ b/js/jscalendar/lang/calendar-pt.js
@@ -0,0 +1,123 @@
+// ** I18N
+
+// Calendar pt_BR language
+// Author: Adalberto Machado, <betosm@terra.com.br>
+// Encoding: any
+// Distributed under the same terms as the calendar itself.
+
+// For translators: please use UTF-8 if possible. We strongly believe that
+// Unicode is the answer to a real internationalized world. Also please
+// include your contact information in the header, as can be seen above.
+
+// full day names
+Calendar._DN = new Array
+("Domingo",
+ "Segunda",
+ "Terca",
+ "Quarta",
+ "Quinta",
+ "Sexta",
+ "Sabado",
+ "Domingo");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary. We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+// Calendar._SDN_len = N; // short day name length
+// Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("Dom",
+ "Seg",
+ "Ter",
+ "Qua",
+ "Qui",
+ "Sex",
+ "Sab",
+ "Dom");
+
+// full month names
+Calendar._MN = new Array
+("Janeiro",
+ "Fevereiro",
+ "Marco",
+ "Abril",
+ "Maio",
+ "Junho",
+ "Julho",
+ "Agosto",
+ "Setembro",
+ "Outubro",
+ "Novembro",
+ "Dezembro");
+
+// short month names
+Calendar._SMN = new Array
+("Jan",
+ "Fev",
+ "Mar",
+ "Abr",
+ "Mai",
+ "Jun",
+ "Jul",
+ "Ago",
+ "Set",
+ "Out",
+ "Nov",
+ "Dez");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "Sobre o calendario";
+
+Calendar._TT["ABOUT"] =
+"DHTML Date/Time Selector\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"Ultima versao visite: http://www.dynarch.com/projects/calendar/\n" +
+"Distribuido sobre GNU LGPL. Veja http://gnu.org/licenses/lgpl.html para detalhes." +
+"\n\n" +
+"Selecao de data:\n" +
+"- Use os botoes \xab, \xbb para selecionar o ano\n" +
+"- Use os botoes " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " para selecionar o mes\n" +
+"- Segure o botao do mouse em qualquer um desses botoes para selecao rapida.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Selecao de hora:\n" +
+"- Clique em qualquer parte da hora para incrementar\n" +
+"- ou Shift-click para decrementar\n" +
+"- ou clique e segure para selecao rapida.";
+
+Calendar._TT["PREV_YEAR"] = "Ant. ano (segure para menu)";
+Calendar._TT["PREV_MONTH"] = "Ant. mes (segure para menu)";
+Calendar._TT["GO_TODAY"] = "Hoje";
+Calendar._TT["NEXT_MONTH"] = "Prox. mes (segure para menu)";
+Calendar._TT["NEXT_YEAR"] = "Prox. ano (segure para menu)";
+Calendar._TT["SEL_DATE"] = "Selecione a data";
+Calendar._TT["DRAG_TO_MOVE"] = "Arraste para mover";
+Calendar._TT["PART_TODAY"] = " (hoje)";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "Mostre %s primeiro";
+
+// This may be locale-dependent. It specifies the week-end days, as an array
+// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "Fechar";
+Calendar._TT["TODAY"] = "Hoje";
+Calendar._TT["TIME_PART"] = "(Shift-)Click ou arraste para mudar valor";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%d/%m/%Y";
+Calendar._TT["TT_DATE_FORMAT"] = "%a, %e %b";
+
+Calendar._TT["WK"] = "sm";
+Calendar._TT["TIME"] = "Hora:";
diff --git a/js/jscalendar/lang/calendar-ro.js b/js/jscalendar/lang/calendar-ro.js
new file mode 100644
index 0000000..116e358
--- /dev/null
+++ b/js/jscalendar/lang/calendar-ro.js
@@ -0,0 +1,66 @@
+// ** I18N
+Calendar._DN = new Array
+("Duminică",
+ "Luni",
+ "Marţi",
+ "Miercuri",
+ "Joi",
+ "Vineri",
+ "SĂ¢mbătă",
+ "Duminică");
+Calendar._SDN_len = 2;
+Calendar._MN = new Array
+("Ianuarie",
+ "Februarie",
+ "Martie",
+ "Aprilie",
+ "Mai",
+ "Iunie",
+ "Iulie",
+ "August",
+ "Septembrie",
+ "Octombrie",
+ "Noiembrie",
+ "Decembrie");
+
+// tooltips
+Calendar._TT = {};
+
+Calendar._TT["INFO"] = "Despre calendar";
+
+Calendar._TT["ABOUT"] =
+"DHTML Date/Time Selector\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"Pentru ultima versiune vizitaţi: http://www.dynarch.com/projects/calendar/\n" +
+"Distribuit sub GNU LGPL. See http://gnu.org/licenses/lgpl.html for details." +
+"\n\n" +
+"Selecţia datei:\n" +
+"- Folosiţi butoanele \xab, \xbb pentru a selecta anul\n" +
+"- Folosiţi butoanele " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " pentru a selecta luna\n" +
+"- Tineţi butonul mouse-ului apăsat pentru selecţie mai rapidă.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Selecţia orei:\n" +
+"- Click pe ora sau minut pentru a mări valoarea cu 1\n" +
+"- Sau Shift-Click pentru a micÅŸora valoarea cu 1\n" +
+"- Sau Click ÅŸi drag pentru a selecta mai repede.";
+
+Calendar._TT["PREV_YEAR"] = "Anul precedent (lung pt menu)";
+Calendar._TT["PREV_MONTH"] = "Luna precedentă (lung pt menu)";
+Calendar._TT["GO_TODAY"] = "Data de azi";
+Calendar._TT["NEXT_MONTH"] = "Luna următoare (lung pt menu)";
+Calendar._TT["NEXT_YEAR"] = "Anul următor (lung pt menu)";
+Calendar._TT["SEL_DATE"] = "Selectează data";
+Calendar._TT["DRAG_TO_MOVE"] = "Trage pentru a miÅŸca";
+Calendar._TT["PART_TODAY"] = " (astăzi)";
+Calendar._TT["DAY_FIRST"] = "Afişează %s prima zi";
+Calendar._TT["WEEKEND"] = "0,6";
+Calendar._TT["CLOSE"] = "Ănchide";
+Calendar._TT["TODAY"] = "Astăzi";
+Calendar._TT["TIME_PART"] = "(Shift-)Click sau drag pentru a selecta";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%d-%m-%Y";
+Calendar._TT["TT_DATE_FORMAT"] = "%A, %d %B";
+
+Calendar._TT["WK"] = "spt";
+Calendar._TT["TIME"] = "Ora:";
diff --git a/js/jscalendar/lang/calendar-ru.js b/js/jscalendar/lang/calendar-ru.js
new file mode 100644
index 0000000..5ed2d53
--- /dev/null
+++ b/js/jscalendar/lang/calendar-ru.js
@@ -0,0 +1,126 @@
+// ** I18N
+
+// Calendar RU language
+// Translation: Sly Golovanov, http://golovanov.net, <sly@golovanov.net>
+// Encoding: any
+// Distributed under the same terms as the calendar itself.
+
+// For translators: please use UTF-8 if possible. We strongly believe that
+// Unicode is the answer to a real internationalized world. Also please
+// include your contact information in the header, as can be seen above.
+
+// full day names
+Calendar._DN = new Array
+("Đ²Đ¾ÑĐºÑ€ĐµÑĐµĐ½ÑŒĐµ",
+ "Đ¿Đ¾Đ½ĐµĐ´ĐµĐ»ÑŒĐ½Đ¸Đº",
+ "Đ²Ñ‚Đ¾Ñ€Đ½Đ¸Đº",
+ "ÑÑ€ĐµĐ´Đ°",
+ "Ñ‡ĐµÑ‚Đ²ĐµÑ€Đ³",
+ "Đ¿ÑÑ‚Đ½Đ¸Ñ†Đ°",
+ "ÑÑƒĐ±Đ±Đ¾Ñ‚Đ°",
+ "Đ²Đ¾ÑĐºÑ€ĐµÑĐµĐ½ÑŒĐµ");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary. We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+// Calendar._SDN_len = N; // short day name length
+// Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("Đ²ÑĐº",
+ "Đ¿Đ¾Đ½",
+ "Đ²Ñ‚Ñ€",
+ "ÑÑ€Đ´",
+ "Ñ‡ĐµÑ‚",
+ "Đ¿ÑÑ‚",
+ "ÑÑƒĐ±",
+ "Đ²ÑĐº");
+
+// First day of the week. 0 means Sunday, 1 means Monday
+Calendar._FD = 1;
+
+// full month names
+Calendar._MN = new Array
+("ÑĐ½Đ²Đ°Ñ€ÑŒ",
+ "Ñ„ĐµĐ²Ñ€Đ°Đ»ÑŒ",
+ "Đ¼Đ°Ñ€Ñ‚",
+ "Đ°Đ¿Ñ€ĐµĐ»ÑŒ",
+ "Đ¼Đ°Đ¹",
+ "иÑĐ½ÑŒ",
+ "иÑĐ»ÑŒ",
+ "Đ°Đ²Đ³ÑƒÑÑ‚",
+ "ÑĐµĐ½Ñ‚ÑĐ±Ñ€ÑŒ",
+ "Đ¾ĐºÑ‚ÑĐ±Ñ€ÑŒ",
+ "Đ½Đ¾ÑĐ±Ñ€ÑŒ",
+ "Đ´ĐµĐºĐ°Đ±Ñ€ÑŒ");
+
+// short month names
+Calendar._SMN = new Array
+("ÑĐ½Đ²",
+ "Ñ„ĐµĐ²",
+ "Đ¼Đ°Ñ€",
+ "Đ°Đ¿Ñ€",
+ "Đ¼Đ°Đ¹",
+ "иÑĐ½",
+ "иÑĐ»",
+ "Đ°Đ²Đ³",
+ "ÑĐµĐ½",
+ "Đ¾ĐºÑ‚",
+ "Đ½Đ¾Ñ",
+ "Đ´ĐµĐº");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "Đ ĐºĐ°Đ»ĐµĐ½Đ´Đ°Ñ€Đµ...";
+
+Calendar._TT["ABOUT"] =
+"DHTML Date/Time Selector\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"For latest version visit: http://www.dynarch.com/projects/calendar/\n" +
+"Distributed under GNU LGPL. See http://gnu.org/licenses/lgpl.html for details." +
+"\n\n" +
+"ĐĐ°Đº Đ²Ñ‹Đ±Ñ€Đ°Ñ‚ÑŒ Đ´Đ°Ñ‚Ñƒ:\n" +
+"- ĐŸÑ€Đ¸ Đ¿Đ¾Đ¼Đ¾Ñ‰Đ¸ ĐºĐ½Đ¾Đ¿Đ¾Đº \xab, \xbb Đ¼Đ¾Đ¶Đ½Đ¾ Đ²Ñ‹Đ±Ñ€Đ°Ñ‚ÑŒ Đ³Đ¾Đ´\n" +
+"- ĐŸÑ€Đ¸ Đ¿Đ¾Đ¼Đ¾Ñ‰Đ¸ ĐºĐ½Đ¾Đ¿Đ¾Đº " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " Đ¼Đ¾Đ¶Đ½Đ¾ Đ²Ñ‹Đ±Ñ€Đ°Ñ‚ÑŒ Đ¼ĐµÑÑц\n" +
+"- ĐŸĐ¾Đ´ĐµÑ€Đ¶Đ¸Ñ‚Đµ ÑÑ‚Đ¸ ĐºĐ½Đ¾Đ¿ĐºĐ¸ Đ½Đ°Đ¶Đ°Ñ‚Ñ‹Đ¼Đ¸, Ñ‡Ñ‚Đ¾Đ±Ñ‹ Đ¿Đ¾ÑĐ²Đ¸Đ»Đ¾ÑÑŒ Đ¼ĐµĐ½Ñ Đ±Ñ‹ÑÑ‚Ñ€Đ¾Đ³Đ¾ Đ²Ñ‹Đ±Đ¾Ñ€Đ°.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"ĐĐ°Đº Đ²Ñ‹Đ±Ñ€Đ°Ñ‚ÑŒ Đ²Ñ€ĐµĐ¼Ñ:\n" +
+"- ĐŸÑ€Đ¸ ĐºĐ»Đ¸ĐºĐµ Đ½Đ° Ñ‡Đ°ÑĐ°Ñ… или Đ¼Đ¸Đ½ÑƒÑ‚Đ°Ñ… Đ¾Đ½Đ¸ ÑƒĐ²ĐµĐ»Đ¸Ñ‡Đ¸Đ²Đ°ÑÑ‚ÑÑ\n" +
+"- Đ¿Ñ€Đ¸ ĐºĐ»Đ¸ĐºĐµ Ñ Đ½Đ°Đ¶Đ°Ñ‚Đ¾Đ¹ ĐºĐ»Đ°Đ²Đ¸ÑˆĐµĐ¹ Shift Đ¾Đ½Đ¸ ÑƒĐ¼ĐµĐ½ÑŒÑˆĐ°ÑÑ‚ÑÑ\n" +
+"- еÑли Đ½Đ°Đ¶Đ°Ñ‚ÑŒ и Đ´Đ²Đ¸Đ³Đ°Ñ‚ÑŒ Đ¼Ñ‹ÑˆĐºĐ¾Đ¹ Đ²Đ»ĐµĐ²Đ¾/Đ²Đ¿Ñ€Đ°Đ²Đ¾, Đ¾Đ½Đ¸ Đ±ÑƒĐ´ÑƒÑ‚ Đ¼ĐµĐ½ÑÑ‚ÑŒÑÑ Đ±Ñ‹ÑÑ‚Ñ€ĐµĐµ.";
+
+Calendar._TT["PREV_YEAR"] = "ĐĐ° Đ³Đ¾Đ´ Đ½Đ°Đ·Đ°Đ´ (ÑƒĐ´ĐµÑ€Đ¶Đ¸Đ²Đ°Ñ‚ÑŒ Đ´Đ»Ñ Đ¼ĐµĐ½Ñ)";
+Calendar._TT["PREV_MONTH"] = "ĐĐ° Đ¼ĐµÑÑц Đ½Đ°Đ·Đ°Đ´ (ÑƒĐ´ĐµÑ€Đ¶Đ¸Đ²Đ°Ñ‚ÑŒ Đ´Đ»Ñ Đ¼ĐµĐ½Ñ)";
+Calendar._TT["GO_TODAY"] = "Đ¡ĐµĐ³Đ¾Đ´Đ½Ñ";
+Calendar._TT["NEXT_MONTH"] = "ĐĐ° Đ¼ĐµÑÑц Đ²Đ¿ĐµÑ€ĐµĐ´ (ÑƒĐ´ĐµÑ€Đ¶Đ¸Đ²Đ°Ñ‚ÑŒ Đ´Đ»Ñ Đ¼ĐµĐ½Ñ)";
+Calendar._TT["NEXT_YEAR"] = "ĐĐ° Đ³Đ¾Đ´ Đ²Đ¿ĐµÑ€ĐµĐ´ (ÑƒĐ´ĐµÑ€Đ¶Đ¸Đ²Đ°Ñ‚ÑŒ Đ´Đ»Ñ Đ¼ĐµĐ½Ñ)";
+Calendar._TT["SEL_DATE"] = "Đ’Ñ‹Đ±ĐµÑ€Đ¸Ñ‚Đµ Đ´Đ°Ñ‚Ñƒ";
+Calendar._TT["DRAG_TO_MOVE"] = "ĐŸĐµÑ€ĐµÑ‚Đ°ÑĐºĐ¸Đ²Đ°Đ¹Ñ‚Đµ Đ¼Ñ‹ÑˆĐºĐ¾Đ¹";
+Calendar._TT["PART_TODAY"] = " (ÑĐµĐ³Đ¾Đ´Đ½Ñ)";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "ĐŸĐµÑ€Đ²Ñ‹Đ¹ Đ´ĐµĐ½ÑŒ Đ½ĐµĐ´ĐµĐ»Đ¸ Đ±ÑƒĐ´ĐµÑ‚ %s";
+
+// This may be locale-dependent. It specifies the week-end days, as an array
+// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "Đ—Đ°ĐºÑ€Ñ‹Ñ‚ÑŒ";
+Calendar._TT["TODAY"] = "Đ¡ĐµĐ³Đ¾Đ´Đ½Ñ";
+Calendar._TT["TIME_PART"] = "(Shift-)ĐºĐ»Đ¸Đº или Đ½Đ°Đ¶Đ°Ñ‚ÑŒ и Đ´Đ²Đ¸Đ³Đ°Ñ‚ÑŒ";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d";
+Calendar._TT["TT_DATE_FORMAT"] = "%e %b, %a";
+
+Calendar._TT["WK"] = "Đ½ĐµĐ´";
+Calendar._TT["TIME"] = "Đ’Ñ€ĐµĐ¼Ñ:";
diff --git a/js/jscalendar/lang/calendar-si.js b/js/jscalendar/lang/calendar-si.js
new file mode 100644
index 0000000..dfe83a0
--- /dev/null
+++ b/js/jscalendar/lang/calendar-si.js
@@ -0,0 +1,97 @@
+/* Slovenian language file for the DHTML Calendar version 0.9.2
+* Author David Milost <mercy@volja.net>, January 2004.
+* Feel free to use this script under the terms of the GNU Lesser General
+* Public License, as long as you do not remove or alter this notice.
+*/
+ // full day names
+Calendar._DN = new Array
+("Nedelja",
+ "Ponedeljek",
+ "Torek",
+ "Sreda",
+ "ÄŒetrtek",
+ "Petek",
+ "Sobota",
+ "Nedelja");
+ // short day names
+ Calendar._SDN = new Array
+("Ned",
+ "Pon",
+ "Tor",
+ "Sre",
+ "ÄŒet",
+ "Pet",
+ "Sob",
+ "Ned");
+
+Calendar._FD = 1;
+
+// short month names
+Calendar._SMN = new Array
+("Jan",
+ "Feb",
+ "Mar",
+ "Apr",
+ "Maj",
+ "Jun",
+ "Jul",
+ "Avg",
+ "Sep",
+ "Okt",
+ "Nov",
+ "Dec");
+ // full month names
+Calendar._MN = new Array
+("Januar",
+ "Februar",
+ "Marec",
+ "April",
+ "Maj",
+ "Junij",
+ "Julij",
+ "Avgust",
+ "September",
+ "Oktober",
+ "November",
+ "December");
+
+// tooltips
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "O koledarju";
+
+Calendar._TT["ABOUT"] =
+"DHTML Date/Time Selector\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"Za zadnjo verzijo pojdine na naslov: http://www.dynarch.com/projects/calendar/\n" +
+"Distribuirano pod GNU LGPL. Poglejte http://gnu.org/licenses/lgpl.html za podrobnosti." +
+"\n\n" +
+"Izbor datuma:\n" +
+"- Uporabite \xab, \xbb gumbe za izbor leta\n" +
+"- Uporabite " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " gumbe za izbor meseca\n" +
+"- Zadržite klik na kateremkoli od zgornjih gumbov za hiter izbor.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Izbor ćasa:\n" +
+"- Kliknite na katerikoli del ćasa za poveć. le-tega\n" +
+"- ali Shift-click za zmanj. le-tega\n" +
+"- ali kliknite in povlecite za hiter izbor.";
+
+Calendar._TT["TOGGLE"] = "Spremeni dan s katerim se prićne teden";
+Calendar._TT["PREV_YEAR"] = "Predhodnje leto (dolg klik za meni)";
+Calendar._TT["PREV_MONTH"] = "Predhodnji mesec (dolg klik za meni)";
+Calendar._TT["GO_TODAY"] = "Pojdi na tekoći dan";
+Calendar._TT["NEXT_MONTH"] = "Naslednji mesec (dolg klik za meni)";
+Calendar._TT["NEXT_YEAR"] = "Naslednje leto (dolg klik za meni)";
+Calendar._TT["SEL_DATE"] = "Izberite datum";
+Calendar._TT["DRAG_TO_MOVE"] = "Pritisni in povleci za spremembo pozicije";
+Calendar._TT["PART_TODAY"] = " (danes)";
+Calendar._TT["MON_FIRST"] = "Prikaži ponedeljek kot prvi dan";
+Calendar._TT["SUN_FIRST"] = "Prikaži nedeljo kot prvi dan";
+Calendar._TT["CLOSE"] = "Zapri";
+Calendar._TT["TODAY"] = "Danes";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d";
+Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e";
+
+Calendar._TT["WK"] = "Ted";
diff --git a/js/jscalendar/lang/calendar-sk.js b/js/jscalendar/lang/calendar-sk.js
new file mode 100644
index 0000000..c54d9ac
--- /dev/null
+++ b/js/jscalendar/lang/calendar-sk.js
@@ -0,0 +1,68 @@
+/*
+ calendar-sk.js
+ language: Slovak
+ encoding: UTF-8
+ author: Stanislav Pach (stano.pach@seznam.cz)
+*/
+
+// ** I18N
+Calendar._DN = new Array('Nedeľa','Pondelok','Utorok','Streda','Štvrtok','Piatok','Sobota','Nedeľa');
+Calendar._SDN = new Array('Ne','Po','Ut','St','Å t','Pi','So','Ne');
+Calendar._MN = new Array('JanuĂ¡r','FebruĂ¡r','Marec','AprĂ­l','MĂ¡j','JĂºn','JĂºl','August','September','OktĂ³ber','November','December');
+Calendar._SMN = new Array('Jan','Feb','Mar','Apr','MĂ¡j','JĂºn','JĂºl','Aug','Sep','Okt','Nov','Dec');
+
+// First day of the week. "0" means display Sunday first, "1" means display
+// Monday first, etc.
+Calendar._FD = 1;
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "O komponente kalendĂ¡r";
+Calendar._TT["TOGGLE"] = "Zmena prvĂ©ho dňa v tĂ½Å¾dni";
+Calendar._TT["PREV_YEAR"] = "PredchĂ¡dzajĂºci rok (pridrž pre menu)";
+Calendar._TT["PREV_MONTH"] = "PredchĂ¡dzajĂºci mesiac (pridrž pre menu)";
+Calendar._TT["GO_TODAY"] = "DneÅ¡nĂ½ dĂ¡tum";
+Calendar._TT["NEXT_MONTH"] = "ÄalÅ¡Ă­ mesiac (pridrž pre menu)";
+Calendar._TT["NEXT_YEAR"] = "ÄalÅ¡Ă­ rok (pridrž pre menu)";
+Calendar._TT["SEL_DATE"] = "Zvoľ dĂ¡tum";
+Calendar._TT["DRAG_TO_MOVE"] = "Chyť a ťahaj pre presun";
+Calendar._TT["PART_TODAY"] = " (dnes)";
+Calendar._TT["MON_FIRST"] = "UkĂ¡Å¾ ako prvnĂ½ Pondelok";
+//Calendar._TT["SUN_FIRST"] = "Ukaž jako prvnĂ­ NedÄ›li";
+
+Calendar._TT["ABOUT"] =
+"DHTML Date/Time Selector\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"For latest version visit: http://www.dynarch.com/projects/calendar/\n" +
+"Distributed under GNU LGPL. See http://gnu.org/licenses/lgpl.html for details." +
+"\n\n" +
+"VĂ½ber dĂ¡tumu:\n" +
+"- Použijte tlaÄĂ­tka \xab, \xbb pre voľbu roku\n" +
+"- Použijte tlaÄĂ­tka " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " pre vĂ½ber mesiaca\n" +
+"- Podržte tlaÄĂ­tko myÅ¡i na akomkoľvek z tĂ½chto tlaÄĂ­tok pre rĂ½chlejÅ¡Ă­ vĂ½ber.";
+
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"VĂ½ber Äasu:\n" +
+"- Kliknite na akĂºkoľvek ÄasÅ¥ z vĂ½beru Äasu pre zvĂ½Å¡enie.\n" +
+"- alebo Shift-klick pre znĂ­Å¾enie\n" +
+"- alebo kliknite a Å¥ahajte pre rĂ½chlejÅ¡Ă­ vĂ½ber.";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "Zobraz %s ako prvĂ½";
+
+// This may be locale-dependent. It specifies the week-end days, as an array
+// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "Zavrieť";
+Calendar._TT["TODAY"] = "Dnes";
+Calendar._TT["TIME_PART"] = "(Shift-)Klikni alebo ťahaj pre zmenu hodnoty";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "d.m.yy";
+Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e";
+
+Calendar._TT["WK"] = "tĂ½Å¾";
+Calendar._TT["TIME"] = "ÄŒas:";
diff --git a/js/jscalendar/lang/calendar-sp.js b/js/jscalendar/lang/calendar-sp.js
new file mode 100644
index 0000000..239d1b3
--- /dev/null
+++ b/js/jscalendar/lang/calendar-sp.js
@@ -0,0 +1,110 @@
+// ** I18N
+
+// Calendar SP language
+// Author: Rafael Velasco <rvu_at_idecnet_dot_com>
+// Encoding: any
+// Distributed under the same terms as the calendar itself.
+
+// For translators: please use UTF-8 if possible. We strongly believe that
+// Unicode is the answer to a real internationalized world. Also please
+// include your contact information in the header, as can be seen above.
+
+// full day names
+Calendar._DN = new Array
+("Domingo",
+ "Lunes",
+ "Martes",
+ "Miercoles",
+ "Jueves",
+ "Viernes",
+ "Sabado",
+ "Domingo");
+
+Calendar._SDN = new Array
+("Dom",
+ "Lun",
+ "Mar",
+ "Mie",
+ "Jue",
+ "Vie",
+ "Sab",
+ "Dom");
+
+// full month names
+Calendar._MN = new Array
+("Enero",
+ "Febrero",
+ "Marzo",
+ "Abril",
+ "Mayo",
+ "Junio",
+ "Julio",
+ "Agosto",
+ "Septiembre",
+ "Octubre",
+ "Noviembre",
+ "Diciembre");
+
+// short month names
+Calendar._SMN = new Array
+("Ene",
+ "Feb",
+ "Mar",
+ "Abr",
+ "May",
+ "Jun",
+ "Jul",
+ "Ago",
+ "Sep",
+ "Oct",
+ "Nov",
+ "Dic");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "Información del Calendario";
+
+Calendar._TT["ABOUT"] =
+"DHTML Date/Time Selector\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"Nuevas versiones en: http://www.dynarch.com/projects/calendar/\n" +
+"Distribuida bajo licencia GNU LGPL. Para detalles vea http://gnu.org/licenses/lgpl.html ." +
+"\n\n" +
+"Selección de Fechas:\n" +
+"- Use \xab, \xbb para seleccionar el año\n" +
+"- Use " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " para seleccionar el mes\n" +
+"- Mantenga presionado el botón del ratón en cualquiera de las opciones superiores para un acceso rapido .";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Selección del Reloj:\n" +
+"- Seleccione la hora para cambiar el reloj\n" +
+"- o presione Shift-click para disminuirlo\n" +
+"- o presione click y arrastre del ratón para una selección rapida.";
+
+Calendar._TT["PREV_YEAR"] = "Año anterior (Presione para menu)";
+Calendar._TT["PREV_MONTH"] = "Mes Anterior (Presione para menu)";
+Calendar._TT["GO_TODAY"] = "Ir a Hoy";
+Calendar._TT["NEXT_MONTH"] = "Mes Siguiente (Presione para menu)";
+Calendar._TT["NEXT_YEAR"] = "Año Siguiente (Presione para menu)";
+Calendar._TT["SEL_DATE"] = "Seleccione fecha";
+Calendar._TT["DRAG_TO_MOVE"] = "Arrastre y mueva";
+Calendar._TT["PART_TODAY"] = " (Hoy)";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "Mostrar %s primero";
+
+// This may be locale-dependent. It specifies the week-end days, as an array
+// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "Cerrar";
+Calendar._TT["TODAY"] = "Hoy";
+Calendar._TT["TIME_PART"] = "(Shift-)Click o arrastra para cambar el valor";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%dd-%mm-%yy";
+Calendar._TT["TT_DATE_FORMAT"] = "%A, %e de %B de %Y";
+
+Calendar._TT["WK"] = "Sm";
+Calendar._TT["TIME"] = "Hora:";
diff --git a/js/jscalendar/lang/calendar-sr.js b/js/jscalendar/lang/calendar-sr.js
new file mode 100644
index 0000000..0b5383b
--- /dev/null
+++ b/js/jscalendar/lang/calendar-sr.js
@@ -0,0 +1,122 @@
+// Calendar SR serbian language
+
+// 2019-03-11: based on calendar-en.js to make jscalendar work when serbian language is choosen
+// (sr or sr_lat) in Flyspray currently, as L('locale') needs to be set, so other date/locale stuff within
+// Flyspray works for serbian as expected.
+
+// full day names
+Calendar._DN = new Array
+("Sunday",
+ "Monday",
+ "Tuesday",
+ "Wednesday",
+ "Thursday",
+ "Friday",
+ "Saturday",
+ "Sunday");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary. We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+// Calendar._SDN_len = N; // short day name length
+// Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("Sun",
+ "Mon",
+ "Tue",
+ "Wed",
+ "Thu",
+ "Fri",
+ "Sat",
+ "Sun");
+
+// First day of the week. "0" means display Sunday first, "1" means display
+// Monday first, etc.
+Calendar._FD = 1;
+
+// full month names
+Calendar._MN = new Array
+("January",
+ "February",
+ "March",
+ "April",
+ "May",
+ "June",
+ "July",
+ "August",
+ "September",
+ "October",
+ "November",
+ "December");
+
+// short month names
+Calendar._SMN = new Array
+("Jan",
+ "Feb",
+ "Mar",
+ "Apr",
+ "May",
+ "Jun",
+ "Jul",
+ "Aug",
+ "Sep",
+ "Oct",
+ "Nov",
+ "Dec");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "About the calendar";
+
+Calendar._TT["ABOUT"] =
+"DHTML Date/Time Selector\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"For latest version visit: http://www.dynarch.com/projects/calendar/\n" +
+"Distributed under GNU LGPL. See http://gnu.org/licenses/lgpl.html for details." +
+"\n\n" +
+"Date selection:\n" +
+"- Use the \xab, \xbb buttons to select year\n" +
+"- Use the " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " buttons to select month\n" +
+"- Hold mouse button on any of the above buttons for faster selection.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Time selection:\n" +
+"- Click on any of the time parts to increase it\n" +
+"- or Shift-click to decrease it\n" +
+"- or click and drag for faster selection.";
+
+Calendar._TT["PREV_YEAR"] = "Prev. year (hold for menu)";
+Calendar._TT["PREV_MONTH"] = "Prev. month (hold for menu)";
+Calendar._TT["GO_TODAY"] = "Go Today";
+Calendar._TT["NEXT_MONTH"] = "Next month (hold for menu)";
+Calendar._TT["NEXT_YEAR"] = "Next year (hold for menu)";
+Calendar._TT["SEL_DATE"] = "Select date";
+Calendar._TT["DRAG_TO_MOVE"] = "Drag to move";
+Calendar._TT["PART_TODAY"] = " (today)";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "Display %s first";
+
+// This may be locale-dependent. It specifies the week-end days, as an array
+// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "Close";
+Calendar._TT["TODAY"] = "Today";
+Calendar._TT["TIME_PART"] = "(Shift-)Click or drag to change value";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%d.%m.%Y";
+Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e";
+
+Calendar._TT["WK"] = "wk";
+Calendar._TT["TIME"] = "Time:";
diff --git a/js/jscalendar/lang/calendar-sv.js b/js/jscalendar/lang/calendar-sv.js
new file mode 100644
index 0000000..3370d16
--- /dev/null
+++ b/js/jscalendar/lang/calendar-sv.js
@@ -0,0 +1,98 @@
+// ** I18N
+
+// Calendar SV language (Swedish, svenska)
+// Author: Mihai Bazon, <mihai_bazon@yahoo.com>
+// Translation team: <sv@li.org>
+// Translator: Leonard NorrgĂ¥rd <leonard.norrgard@refactor.fi>
+// Last translator: Leonard NorrgĂ¥rd <leonard.norrgard@refactor.fi>
+// Last Minor fixes: Mikael Silfver, mikael dot silfver gmail com
+// Encoding: UTF-8
+// Distributed under the same terms as the calendar itself.
+
+// For translators: please use UTF-8 if possible. We strongly believe that
+// Unicode is the answer to a real internationalized world. Also please
+// include your contact information in the header, as can be seen above.
+
+// full day names
+Calendar._DN = new Array
+("söndag",
+ "mĂ¥ndag",
+ "tisdag",
+ "onsdag",
+ "torsdag",
+ "fredag",
+ "lördag",
+ "söndag");
+
+Calendar._FD = 1;
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary. We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+// Calendar._SDN_len = N; // short day name length
+// Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+Calendar._SDN_len = 2;
+Calendar._SMN_len = 3;
+
+// full month names
+Calendar._MN = new Array
+("januari",
+ "februari",
+ "mars",
+ "april",
+ "maj",
+ "juni",
+ "juli",
+ "augusti",
+ "september",
+ "oktober",
+ "november",
+ "december");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "Om kalendern";
+
+Calendar._TT["ABOUT"] =
+"DHTML Datum/tid-väljare\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"För senaste version gĂ¥ till: http://www.dynarch.com/projects/calendar/\n" +
+"Distribueras under GNU LGPL. Se http://gnu.org/licenses/lgpl.html för detaljer." +
+"\n\n" +
+"Val av datum:\n" +
+"- Använd knapparna \xab, \xbb för att välja Ă¥r\n" +
+"- Använd knapparna " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " för att välja mĂ¥nad\n" +
+"- HĂ¥ll musknappen nedtryckt pĂ¥ nĂ¥gon av ovanstĂ¥ende knappar för snabbare val.";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"Val av tid:\n" +
+"- Klicka pĂ¥ en del av tiden för att öka den delen\n" +
+"- eller skift-klicka för att minska den\n" +
+"- eller klicka och drag för snabbare val.";
+
+Calendar._TT["PREV_YEAR"] = "FöregĂ¥ende Ă¥r (hĂ¥ll för menu)";
+Calendar._TT["PREV_MONTH"] = "FöregĂ¥ende mĂ¥nad (hĂ¥ll för menu)";
+Calendar._TT["GO_TODAY"] = "GĂ¥ till dagens datum";
+Calendar._TT["NEXT_MONTH"] = "Följande mĂ¥nad (hĂ¥ll för menu)";
+Calendar._TT["NEXT_YEAR"] = "Följande Ă¥r (hĂ¥ll för menu)";
+Calendar._TT["SEL_DATE"] = "Välj datum";
+Calendar._TT["DRAG_TO_MOVE"] = "Drag för att flytta";
+Calendar._TT["PART_TODAY"] = " (idag)";
+Calendar._TT["MON_FIRST"] = "Visa mĂ¥ndag först";
+Calendar._TT["SUN_FIRST"] = "Visa söndag först";
+Calendar._TT["CLOSE"] = "Stäng";
+Calendar._TT["TODAY"] = "Idag";
+Calendar._TT["TIME_PART"] = "(Skift-)klicka eller drag för att ändra tid";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d";
+Calendar._TT["TT_DATE_FORMAT"] = "%A %d %b %Y";
+
+Calendar._TT["WK"] = "vecka";
+Calendar._TT["WEEKEND"] = "veckoslut";
+Calendar._TT["DAY_FIRST"] = "%s som första dag";
diff --git a/js/jscalendar/lang/calendar-tr.js b/js/jscalendar/lang/calendar-tr.js
new file mode 100644
index 0000000..34eafae
--- /dev/null
+++ b/js/jscalendar/lang/calendar-tr.js
@@ -0,0 +1,50 @@
+// Calendar Turkish Translation
+// Author: Nuri AKMAN, <nuriakman@hotmail.com>
+// Encoding: UTF-8
+// Distributed under the same terms as the calendar itself.
+
+// ** I18N
+Calendar._DN = new Array
+("Pazar",
+ "Pazartesi",
+ "Salı",
+ "ÇarÅŸamba",
+ "PerÅŸembe",
+ "Cuma",
+ "Cumartesi",
+ "Pazar");
+Calendar._MN = new Array
+("Ocak",
+ "Åubat",
+ "Mart",
+ "Nisan",
+ "Mayıs",
+ "Haziran",
+ "Temmuz",
+ "AÄŸustos",
+ "EylĂ¼l",
+ "Ekim",
+ "Kasım",
+ "Aralık");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["TOGGLE"] = "Haftanın ilk gĂ¼nĂ¼nĂ¼ kaydır";
+Calendar._TT["PREV_YEAR"] = "Ă–nceki Yıl (MenĂ¼ için basılı tutunuz)";
+Calendar._TT["PREV_MONTH"] = "Ă–nceki Ay (MenĂ¼ için basılı tutunuz)";
+Calendar._TT["GO_TODAY"] = "BugĂ¼n'e git";
+Calendar._TT["NEXT_MONTH"] = "Sonraki Ay (MenĂ¼ için basılı tutunuz)";
+Calendar._TT["NEXT_YEAR"] = "Sonraki Yıl (MenĂ¼ için basılı tutunuz)";
+Calendar._TT["SEL_DATE"] = "Tarih seçiniz";
+Calendar._TT["DRAG_TO_MOVE"] = "Taşımak için sĂ¼rĂ¼kleyiniz";
+Calendar._TT["PART_TODAY"] = " (bugĂ¼n)";
+Calendar._TT["MON_FIRST"] = "Takvim Pazartesi gĂ¼nĂ¼nden baÅŸlasın";
+Calendar._TT["SUN_FIRST"] = "Takvim Pazar gĂ¼nĂ¼nden baÅŸlasın";
+Calendar._TT["CLOSE"] = "Kapat";
+Calendar._TT["TODAY"] = "BugĂ¼n";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "dd-mm-y";
+Calendar._TT["TT_DATE_FORMAT"] = "d MM y, DD";
+
+Calendar._TT["WK"] = "Hafta";
diff --git a/js/jscalendar/lang/calendar-zh.js b/js/jscalendar/lang/calendar-zh.js
new file mode 100644
index 0000000..58aa0a7
--- /dev/null
+++ b/js/jscalendar/lang/calendar-zh.js
@@ -0,0 +1,123 @@
+// ** I18N
+
+// Calendar ZH language
+// Author: muziq, <muziq@sina.com>
+// Encoding: UTF-8
+// Distributed under the same terms as the calendar itself.
+
+// full day names
+Calendar._DN = new Array
+("星期日",
+ "星期一",
+ "星期二",
+ "星期三",
+ "星期四",
+ "星期五",
+ "星期六",
+ "星期日");
+
+// Please note that the following array of short day names (and the same goes
+// for short month names, _SMN) isn't absolutely necessary. We give it here
+// for exemplification on how one can customize the short day names, but if
+// they are simply the first N letters of the full name you can simply say:
+//
+// Calendar._SDN_len = N; // short day name length
+// Calendar._SMN_len = N; // short month name length
+//
+// If N = 3 then this is not needed either since we assume a value of 3 if not
+// present, to be compatible with translation files that were written before
+// this feature.
+
+// short day names
+Calendar._SDN = new Array
+("æ—¥",
+ "一",
+ "二",
+ "三",
+ "å››",
+ "五",
+ "å…­",
+ "æ—¥");
+
+// full month names
+Calendar._MN = new Array
+("一月",
+ "二月",
+ "三月",
+ "四月",
+ "五月",
+ "六月",
+ "七月",
+ "八月",
+ "ä¹æœˆ",
+ "å月",
+ "å一月",
+ "å二月");
+
+// short month names
+Calendar._SMN = new Array
+("一月",
+ "二月",
+ "三月",
+ "四月",
+ "五月",
+ "六月",
+ "七月",
+ "八月",
+ "ä¹æœˆ",
+ "å月",
+ "å一月",
+ "å二月");
+
+// tooltips
+Calendar._TT = {};
+Calendar._TT["INFO"] = "帮å©";
+
+Calendar._TT["ABOUT"] =
+"DHTML Date/Time Selector\n" +
+"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-)
+"For latest version visit: http://www.dynarch.com/projects/calendar/\n" +
+"Distributed under GNU LGPL. See http://gnu.org/licenses/lgpl.html for details." +
+"\n\n" +
+"选择日期:\n" +
+"- 点击 \xab, \xbb 按钮选择年份\n" +
+"- 点击 " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " 按钮选择月份\n" +
+"- 长按以ä¸æŒ‰é’®å¯ä»èœå•ä¸­å¿«é€Ÿé€‰æ‹©å¹´ä»½æˆ–月份";
+Calendar._TT["ABOUT_TIME"] = "\n\n" +
+"选择时间:\n" +
+"- 点击å°æ—¶æˆ–分钟å¯ä½¿æ”¹æ•°å€¼å ä¸€\n" +
+"- 按ä½Shift键点击å°æ—¶æˆ–分钟å¯ä½¿æ”¹æ•°å€¼å‡ä¸€\n" +
+"- 点击拖å¨é¼ æ ‡å¯è¿›è¡Œå¿«é€Ÿé€‰æ‹©";
+
+Calendar._TT["PREV_YEAR"] = "ä¸ä¸€å¹´ (按ä½å‡ºèœå•)";
+Calendar._TT["PREV_MONTH"] = "ä¸ä¸€æœˆ (按ä½å‡ºèœå•)";
+Calendar._TT["GO_TODAY"] = "转到ä»æ—¥";
+Calendar._TT["NEXT_MONTH"] = "下一月 (按ä½å‡ºèœå•)";
+Calendar._TT["NEXT_YEAR"] = "下一年 (按ä½å‡ºèœå•)";
+Calendar._TT["SEL_DATE"] = "选择日期";
+Calendar._TT["DRAG_TO_MOVE"] = "æ‹–å¨";
+Calendar._TT["PART_TODAY"] = " (ä»æ—¥)";
+
+// the following is to inform that "%s" is to be the first day of week
+// %s will be replaced with the day name.
+Calendar._TT["DAY_FIRST"] = "最左边显示%s";
+
+// This may be locale-dependent. It specifies the week-end days, as an array
+// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1
+// means Monday, etc.
+Calendar._TT["WEEKEND"] = "0,6";
+
+Calendar._TT["CLOSE"] = "关闭";
+Calendar._TT["TODAY"] = "ä»æ—¥";
+Calendar._TT["TIME_PART"] = "(Shift-)点击鼠标或拖å¨æ”¹å˜å€¼";
+
+// date formats
+Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d";
+Calendar._TT["TT_DATE_FORMAT"] = "%A, %b %eæ—¥";
+
+Calendar._TT["WK"] = "周";
+Calendar._TT["TIME"] = "时间:";
+
+// First day of the week. 0 means display Sunday first, 1 means display
+// Monday first, etc.
+Calendar._FD = 1;
diff --git a/js/jscalendar/menuarrow.gif b/js/jscalendar/menuarrow.gif
new file mode 100644
index 0000000..ed2dee0
--- /dev/null
+++ b/js/jscalendar/menuarrow.gif
Binary files differ
diff --git a/js/jscalendar/menuarrow2.gif b/js/jscalendar/menuarrow2.gif
new file mode 100644
index 0000000..40c0aad
--- /dev/null
+++ b/js/jscalendar/menuarrow2.gif
Binary files differ
diff --git a/js/jscalendar/skins/aqua/active-bg.gif b/js/jscalendar/skins/aqua/active-bg.gif
new file mode 100644
index 0000000..d608c54
--- /dev/null
+++ b/js/jscalendar/skins/aqua/active-bg.gif
Binary files differ
diff --git a/js/jscalendar/skins/aqua/dark-bg.gif b/js/jscalendar/skins/aqua/dark-bg.gif
new file mode 100644
index 0000000..1dea48a
--- /dev/null
+++ b/js/jscalendar/skins/aqua/dark-bg.gif
Binary files differ
diff --git a/js/jscalendar/skins/aqua/hover-bg.gif b/js/jscalendar/skins/aqua/hover-bg.gif
new file mode 100644
index 0000000..fbf94fc
--- /dev/null
+++ b/js/jscalendar/skins/aqua/hover-bg.gif
Binary files differ
diff --git a/js/jscalendar/skins/aqua/menuarrow.gif b/js/jscalendar/skins/aqua/menuarrow.gif
new file mode 100644
index 0000000..40c0aad
--- /dev/null
+++ b/js/jscalendar/skins/aqua/menuarrow.gif
Binary files differ
diff --git a/js/jscalendar/skins/aqua/normal-bg.gif b/js/jscalendar/skins/aqua/normal-bg.gif
new file mode 100644
index 0000000..bdb5068
--- /dev/null
+++ b/js/jscalendar/skins/aqua/normal-bg.gif
Binary files differ
diff --git a/js/jscalendar/skins/aqua/rowhover-bg.gif b/js/jscalendar/skins/aqua/rowhover-bg.gif
new file mode 100644
index 0000000..7715342
--- /dev/null
+++ b/js/jscalendar/skins/aqua/rowhover-bg.gif
Binary files differ
diff --git a/js/jscalendar/skins/aqua/status-bg.gif b/js/jscalendar/skins/aqua/status-bg.gif
new file mode 100644
index 0000000..857108c
--- /dev/null
+++ b/js/jscalendar/skins/aqua/status-bg.gif
Binary files differ
diff --git a/js/jscalendar/skins/aqua/theme.css b/js/jscalendar/skins/aqua/theme.css
new file mode 100644
index 0000000..18dd6cf
--- /dev/null
+++ b/js/jscalendar/skins/aqua/theme.css
@@ -0,0 +1,236 @@
+/* Distributed as part of The Coolest DHTML Calendar
+ Author: Mihai Bazon, www.bazon.net/mishoo
+ Copyright Dynarch.com 2005, www.dynarch.com
+*/
+
+/* The main calendar widget. DIV containing a table. */
+
+div.calendar { position: relative; }
+
+.calendar, .calendar table {
+ border: 1px solid #bdb2bf;
+ font-size: 11px;
+ color: #000;
+ cursor: default;
+ background: url("normal-bg.gif");
+ font-family: "trebuchet ms",verdana,tahoma,sans-serif;
+}
+
+.calendar {
+ border-color: #797979;
+}
+
+/* Header part -- contains navigation buttons and day names. */
+
+.calendar .button { /* "<<", "<", ">", ">>" buttons have this class */
+ text-align: center; /* They are the navigation buttons */
+ padding: 2px; /* Make the buttons seem like they're pressing */
+ background: url("title-bg.gif") repeat-x 0 100%; color: #000;
+ font-weight: bold;
+}
+
+.calendar .nav {
+ font-family: verdana,tahoma,sans-serif;
+}
+
+.calendar .nav div {
+ background: transparent url("menuarrow.gif") no-repeat 100% 100%;
+}
+
+.calendar thead tr { background: url("title-bg.gif") repeat-x 0 100%; color: #000; }
+
+.calendar thead .title { /* This holds the current "month, year" */
+ font-weight: bold; /* Pressing it will take you to the current date */
+ text-align: center;
+ padding: 2px;
+ background: url("title-bg.gif") repeat-x 0 100%; color: #000;
+}
+
+.calendar thead .headrow { /* Row <TR> containing navigation buttons */
+}
+
+.calendar thead .name { /* Cells <TD> containing the day names */
+ border-bottom: 1px solid #797979;
+ padding: 2px;
+ text-align: center;
+ color: #000;
+}
+
+.calendar thead .weekend { /* How a weekend day name shows in header */
+ color: #c44;
+}
+
+.calendar thead .hilite { /* How do the buttons in header appear when hover */
+ background: url("hover-bg.gif");
+ border-bottom: 1px solid #797979;
+ padding: 2px 2px 1px 2px;
+}
+
+.calendar thead .active { /* Active (pressed) buttons in header */
+ background: url("active-bg.gif"); color: #fff;
+ padding: 3px 1px 0px 3px;
+ border-bottom: 1px solid #797979;
+}
+
+.calendar thead .daynames { /* Row <TR> containing the day names */
+ background: url("dark-bg.gif");
+}
+
+/* The body part -- contains all the days in month. */
+
+.calendar tbody .day { /* Cells <TD> containing month days dates */
+ font-family: verdana,tahoma,sans-serif;
+ width: 2em;
+ color: #000;
+ text-align: right;
+ padding: 2px 4px 2px 2px;
+}
+.calendar tbody .day.othermonth {
+ font-size: 80%;
+ color: #999;
+}
+.calendar tbody .day.othermonth.oweekend {
+ color: #f99;
+}
+
+.calendar table .wn {
+ padding: 2px 3px 2px 2px;
+ border-right: 1px solid #797979;
+ background: url("dark-bg.gif");
+}
+
+.calendar tbody .rowhilite td,
+.calendar tbody .rowhilite td.wn {
+ background: url("rowhover-bg.gif");
+}
+
+.calendar tbody td.today { font-weight: bold; /* background: url("today-bg.gif") no-repeat 70% 50%; */ }
+
+.calendar tbody td.hilite { /* Hovered cells <TD> */
+ background: url("hover-bg.gif");
+ padding: 1px 3px 1px 1px;
+ border: 1px solid #bbb;
+}
+
+.calendar tbody td.active { /* Active (pressed) cells <TD> */
+ padding: 2px 2px 0px 2px;
+}
+
+.calendar tbody td.weekend { /* Cells showing weekend days */
+ color: #c44;
+}
+
+.calendar tbody td.selected { /* Cell showing selected date */
+ font-weight: bold;
+ border: 1px solid #797979;
+ padding: 1px 3px 1px 1px;
+ background: url("active-bg.gif"); color: #fff;
+}
+
+.calendar tbody .disabled { color: #999; }
+
+.calendar tbody .emptycell { /* Empty cells (the best is to hide them) */
+ visibility: hidden;
+}
+
+.calendar tbody .emptyrow { /* Empty row (some months need less than 6 rows) */
+ display: none;
+}
+
+/* The footer part -- status bar and "Close" button */
+
+.calendar tfoot .footrow { /* The <TR> in footer (only one right now) */
+ text-align: center;
+ background: #565;
+ color: #fff;
+}
+
+.calendar tfoot .ttip { /* Tooltip (status bar) cell <TD> */
+ padding: 2px;
+ background: url("status-bg.gif") repeat-x 0 0; color: #000;
+}
+
+.calendar tfoot .hilite { /* Hover style for buttons in footer */
+ background: #afa;
+ border: 1px solid #084;
+ color: #000;
+ padding: 1px;
+}
+
+.calendar tfoot .active { /* Active (pressed) style for buttons in footer */
+ background: #7c7;
+ padding: 2px 0px 0px 2px;
+}
+
+/* Combo boxes (menus that display months/years for direct selection) */
+
+.calendar .combo {
+ position: absolute;
+ display: none;
+ top: 0px;
+ left: 0px;
+ width: 4em;
+ cursor: default;
+ border-width: 0 1px 1px 1px;
+ border-style: solid;
+ border-color: #797979;
+ background: url("normal-bg.gif"); color: #000;
+ z-index: 100;
+ font-size: 90%;
+}
+
+.calendar .combo .label,
+.calendar .combo .label-IEfix {
+ text-align: center;
+ padding: 1px;
+}
+
+.calendar .combo .label-IEfix {
+ width: 4em;
+}
+
+.calendar .combo .hilite {
+ background: url("hover-bg.gif"); color: #000;
+}
+
+.calendar .combo .active {
+ background: url("active-bg.gif"); color: #fff;
+ font-weight: bold;
+}
+
+.calendar td.time {
+ border-top: 1px solid #797979;
+ padding: 1px 0px;
+ text-align: center;
+ background: url("dark-bg.gif");
+}
+
+.calendar td.time .hour,
+.calendar td.time .minute,
+.calendar td.time .ampm {
+ padding: 0px 5px 0px 6px;
+ font-weight: bold;
+ background: url("normal-bg.gif"); color: #000;
+}
+
+.calendar td.time .hour,
+.calendar td.time .minute {
+ font-family: monospace;
+}
+
+.calendar td.time .ampm {
+ text-align: center;
+}
+
+.calendar td.time .colon {
+ padding: 0px 2px 0px 3px;
+ font-weight: bold;
+}
+
+.calendar td.time span.hilite {
+ background: url("hover-bg.gif"); color: #000;
+}
+
+.calendar td.time span.active {
+ background: url("active-bg.gif"); color: #fff;
+}
diff --git a/js/jscalendar/skins/aqua/title-bg.gif b/js/jscalendar/skins/aqua/title-bg.gif
new file mode 100644
index 0000000..6a541b3
--- /dev/null
+++ b/js/jscalendar/skins/aqua/title-bg.gif
Binary files differ
diff --git a/js/jscalendar/skins/aqua/today-bg.gif b/js/jscalendar/skins/aqua/today-bg.gif
new file mode 100644
index 0000000..7161538
--- /dev/null
+++ b/js/jscalendar/skins/aqua/today-bg.gif
Binary files differ
diff --git a/js/lightbox/css/lightbox.css b/js/lightbox/css/lightbox.css
new file mode 100644
index 0000000..38b7301
--- /dev/null
+++ b/js/lightbox/css/lightbox.css
@@ -0,0 +1,27 @@
+#lightbox{ position: absolute; left: 0; width: 100%; z-index: 100; text-align: center; line-height: 0;}
+#lightbox img{ width: auto; height: auto;}
+#lightbox a img{ border: none; }
+
+#outerImageContainer{ position: relative; background-color: #fff; width: 250px; height: 250px; margin: 0 auto; }
+#imageContainer{ padding: 10px; }
+
+#loading{ position: absolute; top: 40%; left: 0%; height: 25%; width: 100%; text-align: center; line-height: 0; }
+#hoverNav{ position: absolute; top: 0; left: 0; height: 100%; width: 100%; z-index: 10; }
+#imageContainer>#hoverNav{ left: 0;}
+#hoverNav a{ outline: none;}
+
+#prevLink, #nextLink{ width: 49%; height: 100%; background-image: url(data:image/gif;base64,AAAA); /* Trick IE into showing hover */ display: block; }
+#prevLink { left: 0; float: left;}
+#nextLink { right: 0; float: right;}
+#prevLink:hover, #prevLink:visited:hover { background: url(../images/prevlabel.gif) left 15% no-repeat; }
+#nextLink:hover, #nextLink:visited:hover { background: url(../images/nextlabel.gif) right 15% no-repeat; }
+
+#imageDataContainer{ font: 10px Verdana, Helvetica, sans-serif; background-color: #fff; margin: 0 auto; line-height: 1.4em; overflow: auto; width: 100%; min-width:250px;}
+
+#imageData{ padding:0 10px; color: #666; }
+#imageData #imageDetails{ width: 70%; float: left; text-align: left; }
+#imageData #caption{ font-weight: bold; }
+#imageData #numberDisplay{ display: block; clear: left; padding-bottom: 1.0em; }
+#imageData #bottomNavClose{ width: 66px; float: right; padding-bottom: 0.7em; outline: none;}
+
+#overlay{ position: absolute; top: 0; left: 0; z-index: 90; width: 100%; height: 500px; background-color: #000; }
diff --git a/js/lightbox/images/bullet.gif b/js/lightbox/images/bullet.gif
new file mode 100644
index 0000000..bf8e3c6
--- /dev/null
+++ b/js/lightbox/images/bullet.gif
Binary files differ
diff --git a/js/lightbox/images/close.gif b/js/lightbox/images/close.gif
new file mode 100644
index 0000000..ca517b6
--- /dev/null
+++ b/js/lightbox/images/close.gif
Binary files differ
diff --git a/js/lightbox/images/closelabel.gif b/js/lightbox/images/closelabel.gif
new file mode 100644
index 0000000..87b4f8b
--- /dev/null
+++ b/js/lightbox/images/closelabel.gif
Binary files differ
diff --git a/js/lightbox/images/loading.gif b/js/lightbox/images/loading.gif
new file mode 100644
index 0000000..f864d5f
--- /dev/null
+++ b/js/lightbox/images/loading.gif
Binary files differ
diff --git a/js/lightbox/images/nextlabel.gif b/js/lightbox/images/nextlabel.gif
new file mode 100644
index 0000000..6c40e51
--- /dev/null
+++ b/js/lightbox/images/nextlabel.gif
Binary files differ
diff --git a/js/lightbox/images/prevlabel.gif b/js/lightbox/images/prevlabel.gif
new file mode 100644
index 0000000..51a31c2
--- /dev/null
+++ b/js/lightbox/images/prevlabel.gif
Binary files differ
diff --git a/js/lightbox/js/lightbox.js b/js/lightbox/js/lightbox.js
new file mode 100644
index 0000000..2a9b1a7
--- /dev/null
+++ b/js/lightbox/js/lightbox.js
@@ -0,0 +1,497 @@
+// -----------------------------------------------------------------------------------
+//
+// Lightbox v2.04
+// by Lokesh Dhakar - http://www.lokeshdhakar.com
+// Last Modification: 2/9/08
+//
+// For more information, visit:
+// http://lokeshdhakar.com/projects/lightbox2/
+//
+// Licensed under the Creative Commons Attribution 2.5 License - http://creativecommons.org/licenses/by/2.5/
+// - Free for use in both personal and commercial projects
+// - Attribution requires leaving author name, author link, and the license info intact.
+//
+// Thanks: Scott Upton(uptonic.com), Peter-Paul Koch(quirksmode.com), and Thomas Fuchs(mir.aculo.us) for ideas, libs, and snippets.
+// Artemy Tregubenko (arty.name) for cleanup and help in updating to latest ver of proto-aculous.
+//
+// -----------------------------------------------------------------------------------
+/*
+
+ Table of Contents
+ -----------------
+ Configuration
+
+ Lightbox Class Declaration
+ - initialize()
+ - updateImageList()
+ - start()
+ - changeImage()
+ - resizeImageContainer()
+ - showImage()
+ - updateDetails()
+ - updateNav()
+ - enableKeyboardNav()
+ - disableKeyboardNav()
+ - keyboardAction()
+ - preloadNeighborImages()
+ - end()
+
+ Function Calls
+ - document.observe()
+
+*/
+// -----------------------------------------------------------------------------------
+
+//
+// Configurationl
+//
+LightboxOptions = Object.extend({
+ fileLoadingImage: 'js/lightbox/images/loading.gif',
+ fileBottomNavCloseImage: 'js/lightbox/images/closelabel.gif',
+
+ overlayOpacity: 0.8, // controls transparency of shadow overlay
+
+ animate: true, // toggles resizing animations
+ resizeSpeed: 7, // controls the speed of the image resizing animations (1=slowest and 10=fastest)
+
+ borderSize: 10, //if you adjust the padding in the CSS, you will need to update this variable
+
+ // When grouping images this is used to write: Image # of #.
+ // Change it for non-english localization
+ labelImage: "Image",
+ labelOf: "of"
+}, window.LightboxOptions || {});
+
+// -----------------------------------------------------------------------------------
+
+var Lightbox = Class.create();
+
+Lightbox.prototype = {
+ imageArray: [],
+ activeImage: undefined,
+
+ // initialize()
+ // Constructor runs on completion of the DOM loading. Calls updateImageList and then
+ // the function inserts html at the bottom of the page which is used to display the shadow
+ // overlay and the image container.
+ //
+ initialize: function() {
+
+ this.updateImageList();
+
+ this.keyboardAction = this.keyboardAction.bindAsEventListener(this);
+
+ if (LightboxOptions.resizeSpeed > 10) LightboxOptions.resizeSpeed = 10;
+ if (LightboxOptions.resizeSpeed < 1) LightboxOptions.resizeSpeed = 1;
+
+ this.resizeDuration = LightboxOptions.animate ? ((11 - LightboxOptions.resizeSpeed) * 0.15) : 0;
+ this.overlayDuration = LightboxOptions.animate ? 0.2 : 0; // shadow fade in/out duration
+
+ // When Lightbox starts it will resize itself from 250 by 250 to the current image dimension.
+ // If animations are turned off, it will be hidden as to prevent a flicker of a
+ // white 250 by 250 box.
+ var size = (LightboxOptions.animate ? 250 : 1) + 'px';
+
+
+ // Code inserts html at the bottom of the page that looks similar to this:
+ //
+ // <div id="overlay"></div>
+ // <div id="lightbox">
+ // <div id="outerImageContainer">
+ // <div id="imageContainer">
+ // <img id="lightboxImage">
+ // <div style="" id="hoverNav">
+ // <a href="#" id="prevLink"></a>
+ // <a href="#" id="nextLink"></a>
+ // </div>
+ // <div id="loading">
+ // <a href="#" id="loadingLink">
+ // <img src="images/loading.gif">
+ // </a>
+ // </div>
+ // </div>
+ // </div>
+ // <div id="imageDataContainer">
+ // <div id="imageData">
+ // <div id="imageDetails">
+ // <span id="caption"></span>
+ // <span id="numberDisplay"></span>
+ // </div>
+ // <div id="bottomNav">
+ // <a href="#" id="bottomNavClose">
+ // <img src="images/close.gif">
+ // </a>
+ // </div>
+ // </div>
+ // </div>
+ // </div>
+
+
+ var objBody = $$('body')[0];
+
+ objBody.appendChild(Builder.node('div',{id:'overlay'}));
+
+ objBody.appendChild(Builder.node('div',{id:'lightbox'}, [
+ Builder.node('div',{id:'outerImageContainer'},
+ Builder.node('div',{id:'imageContainer'}, [
+ Builder.node('img',{id:'lightboxImage'}),
+ Builder.node('div',{id:'hoverNav'}, [
+ Builder.node('a',{id:'prevLink', href: '#' }),
+ Builder.node('a',{id:'nextLink', href: '#' })
+ ]),
+ Builder.node('div',{id:'loading'},
+ Builder.node('a',{id:'loadingLink', href: '#' },
+ Builder.node('img', {src: LightboxOptions.fileLoadingImage})
+ )
+ )
+ ])
+ ),
+ Builder.node('div', {id:'imageDataContainer'},
+ Builder.node('div',{id:'imageData'}, [
+ Builder.node('div',{id:'imageDetails'}, [
+ Builder.node('span',{id:'caption'}),
+ Builder.node('span',{id:'numberDisplay'})
+ ]),
+ Builder.node('div',{id:'bottomNav'},
+ Builder.node('a',{id:'bottomNavClose', href: '#' },
+ Builder.node('img', { src: LightboxOptions.fileBottomNavCloseImage })
+ )
+ )
+ ])
+ )
+ ]));
+
+
+ $('overlay').hide().observe('click', (function() { this.end(); }).bind(this));
+ $('lightbox').hide().observe('click', (function(event) { if (event.element().id == 'lightbox') this.end(); }).bind(this));
+ $('outerImageContainer').setStyle({ width: size, height: size });
+ $('prevLink').observe('click', (function(event) { event.stop(); this.changeImage(this.activeImage - 1); }).bindAsEventListener(this));
+ $('nextLink').observe('click', (function(event) { event.stop(); this.changeImage(this.activeImage + 1); }).bindAsEventListener(this));
+ $('loadingLink').observe('click', (function(event) { event.stop(); this.end(); }).bind(this));
+ $('bottomNavClose').observe('click', (function(event) { event.stop(); this.end(); }).bind(this));
+
+ var th = this;
+ (function(){
+ var ids =
+ 'overlay lightbox outerImageContainer imageContainer lightboxImage hoverNav prevLink nextLink loading loadingLink ' +
+ 'imageDataContainer imageData imageDetails caption numberDisplay bottomNav bottomNavClose';
+ $w(ids).each(function(id){ th[id] = $(id); });
+ }).defer();
+ },
+
+ //
+ // updateImageList()
+ // Loops through anchor tags looking for 'lightbox' references and applies onclick
+ // events to appropriate links. You can rerun after dynamically adding images w/ajax.
+ //
+ updateImageList: function() {
+ this.updateImageList = Prototype.emptyFunction;
+
+ document.observe('click', (function(event){
+ var target = event.findElement('a[rel^=lightbox]') || event.findElement('area[rel^=lightbox]');
+ if (target) {
+ event.stop();
+ this.start(target);
+ }
+ }).bind(this));
+ },
+
+ //
+ // start()
+ // Display overlay and lightbox. If image is part of a set, add siblings to imageArray.
+ //
+ start: function(imageLink) {
+
+ $$('select', 'object', 'embed').each(function(node){ node.style.visibility = 'hidden' });
+
+ // stretch overlay to fill page and fade in
+ var arrayPageSize = this.getPageSize();
+ $('overlay').setStyle({ width: arrayPageSize[0] + 'px', height: arrayPageSize[1] + 'px' });
+
+ new Effect.Appear(this.overlay, { duration: this.overlayDuration, from: 0.0, to: LightboxOptions.overlayOpacity });
+
+ this.imageArray = [];
+ var imageNum = 0;
+
+ if ((imageLink.rel == 'lightbox')){
+ // if image is NOT part of a set, add single image to imageArray
+ this.imageArray.push([imageLink.href, imageLink.title]);
+ } else {
+ // if image is part of a set..
+ this.imageArray =
+ $$(imageLink.tagName + '[href][rel="' + imageLink.rel + '"]').
+ collect(function(anchor){ return [anchor.href, anchor.title]; }).
+ uniq();
+
+ while (this.imageArray[imageNum][0] != imageLink.href) { imageNum++; }
+ }
+
+ // calculate top and left offset for the lightbox
+ var arrayPageScroll = document.viewport.getScrollOffsets();
+ var lightboxTop = arrayPageScroll[1] + (document.viewport.getHeight() / 10);
+ var lightboxLeft = arrayPageScroll[0];
+ this.lightbox.setStyle({ top: lightboxTop + 'px', left: lightboxLeft + 'px' }).show();
+
+ this.changeImage(imageNum);
+ },
+
+ //
+ // changeImage()
+ // Hide most elements and preload image in preparation for resizing image container.
+ //
+ changeImage: function(imageNum) {
+
+ this.activeImage = imageNum; // update global var
+
+ // hide elements during transition
+ if (LightboxOptions.animate) this.loading.show();
+ this.lightboxImage.hide();
+ this.hoverNav.hide();
+ this.prevLink.hide();
+ this.nextLink.hide();
+ // HACK: Opera9 does not currently support scriptaculous opacity and appear fx
+ this.imageDataContainer.setStyle({opacity: .0001});
+ this.numberDisplay.hide();
+
+ var imgPreloader = new Image();
+
+ // once image is preloaded, resize image container
+
+
+ imgPreloader.onload = (function(){
+ this.lightboxImage.src = this.imageArray[this.activeImage][0];
+ this.resizeImageContainer(imgPreloader.width, imgPreloader.height);
+ }).bind(this);
+ imgPreloader.src = this.imageArray[this.activeImage][0];
+ },
+
+ //
+ // resizeImageContainer()
+ //
+ resizeImageContainer: function(imgWidth, imgHeight) {
+
+ // get current width and height
+ var widthCurrent = this.outerImageContainer.getWidth();
+ var heightCurrent = this.outerImageContainer.getHeight();
+
+ // get new width and height
+ var widthNew = (imgWidth + LightboxOptions.borderSize * 2);
+ var heightNew = (imgHeight + LightboxOptions.borderSize * 2);
+
+ // scalars based on change from old to new
+ var xScale = (widthNew / widthCurrent) * 100;
+ var yScale = (heightNew / heightCurrent) * 100;
+
+ // calculate size difference between new and old image, and resize if necessary
+ var wDiff = widthCurrent - widthNew;
+ var hDiff = heightCurrent - heightNew;
+
+ if (hDiff != 0) new Effect.Scale(this.outerImageContainer, yScale, {scaleX: false, duration: this.resizeDuration, queue: 'front'});
+ if (wDiff != 0) new Effect.Scale(this.outerImageContainer, xScale, {scaleY: false, duration: this.resizeDuration, delay: this.resizeDuration});
+
+ // if new and old image are same size and no scaling transition is necessary,
+ // do a quick pause to prevent image flicker.
+ var timeout = 0;
+ if ((hDiff == 0) && (wDiff == 0)){
+ timeout = 100;
+ if (Prototype.Browser.IE) timeout = 250;
+ }
+
+ (function(){
+ this.prevLink.setStyle({ height: imgHeight + 'px' });
+ this.nextLink.setStyle({ height: imgHeight + 'px' });
+ this.imageDataContainer.setStyle({ width: widthNew + 'px' });
+
+ this.showImage();
+ }).bind(this).delay(timeout / 1000);
+ },
+
+ //
+ // showImage()
+ // Display image and begin preloading neighbors.
+ //
+ showImage: function(){
+ this.loading.hide();
+ new Effect.Appear(this.lightboxImage, {
+ duration: this.resizeDuration,
+ queue: 'end',
+ afterFinish: (function(){ this.updateDetails(); }).bind(this)
+ });
+ this.preloadNeighborImages();
+ },
+
+ //
+ // updateDetails()
+ // Display caption, image number, and bottom nav.
+ //
+ updateDetails: function() {
+
+ // if caption is not null
+ if (this.imageArray[this.activeImage][1] != ""){
+ this.caption.update(this.imageArray[this.activeImage][1]).show();
+ }
+
+ // if image is part of set display 'Image x of x'
+ if (this.imageArray.length > 1){
+ this.numberDisplay.update( LightboxOptions.labelImage + ' ' + (this.activeImage + 1) + ' ' + LightboxOptions.labelOf + ' ' + this.imageArray.length).show();
+ }
+
+ new Effect.Parallel(
+ [
+ new Effect.SlideDown(this.imageDataContainer, { sync: true, duration: this.resizeDuration, from: 0.0, to: 1.0 }),
+ new Effect.Appear(this.imageDataContainer, { sync: true, duration: this.resizeDuration })
+ ],
+ {
+ duration: this.resizeDuration,
+ afterFinish: (function() {
+ // update overlay size and update nav
+ var arrayPageSize = this.getPageSize();
+ this.overlay.setStyle({ height: arrayPageSize[1] + 'px' });
+ this.updateNav();
+ }).bind(this)
+ }
+ );
+ },
+
+ //
+ // updateNav()
+ // Display appropriate previous and next hover navigation.
+ //
+ updateNav: function() {
+
+ this.hoverNav.show();
+
+ // if not first image in set, display prev image button
+ if (this.activeImage > 0) this.prevLink.show();
+
+ // if not last image in set, display next image button
+ if (this.activeImage < (this.imageArray.length - 1)) this.nextLink.show();
+
+ this.enableKeyboardNav();
+ },
+
+ //
+ // enableKeyboardNav()
+ //
+ enableKeyboardNav: function() {
+ document.observe('keydown', this.keyboardAction);
+ },
+
+ //
+ // disableKeyboardNav()
+ //
+ disableKeyboardNav: function() {
+ document.stopObserving('keydown', this.keyboardAction);
+ },
+
+ //
+ // keyboardAction()
+ //
+ keyboardAction: function(event) {
+ var keycode = event.keyCode;
+
+ var escapeKey;
+ if (event.DOM_VK_ESCAPE) { // mozilla
+ escapeKey = event.DOM_VK_ESCAPE;
+ } else { // ie
+ escapeKey = 27;
+ }
+
+ var key = String.fromCharCode(keycode).toLowerCase();
+
+ if (key.match(/x|o|c/) || (keycode == escapeKey)){ // close lightbox
+ this.end();
+ } else if ((key == 'p') || (keycode == 37)){ // display previous image
+ if (this.activeImage != 0){
+ this.disableKeyboardNav();
+ this.changeImage(this.activeImage - 1);
+ }
+ } else if ((key == 'n') || (keycode == 39)){ // display next image
+ if (this.activeImage != (this.imageArray.length - 1)){
+ this.disableKeyboardNav();
+ this.changeImage(this.activeImage + 1);
+ }
+ }
+ },
+
+ //
+ // preloadNeighborImages()
+ // Preload previous and next images.
+ //
+ preloadNeighborImages: function(){
+ var preloadNextImage, preloadPrevImage;
+ if (this.imageArray.length > this.activeImage + 1){
+ preloadNextImage = new Image();
+ preloadNextImage.src = this.imageArray[this.activeImage + 1][0];
+ }
+ if (this.activeImage > 0){
+ preloadPrevImage = new Image();
+ preloadPrevImage.src = this.imageArray[this.activeImage - 1][0];
+ }
+
+ },
+
+ //
+ // end()
+ //
+ end: function() {
+ this.disableKeyboardNav();
+ this.lightbox.hide();
+ new Effect.Fade(this.overlay, { duration: this.overlayDuration });
+ $$('select', 'object', 'embed').each(function(node){ node.style.visibility = 'visible' });
+ },
+
+ //
+ // getPageSize()
+ //
+ getPageSize: function() {
+
+ var xScroll, yScroll;
+
+ if (window.innerHeight && window.scrollMaxY) {
+ xScroll = window.innerWidth + window.scrollMaxX;
+ yScroll = window.innerHeight + window.scrollMaxY;
+ } else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
+ xScroll = document.body.scrollWidth;
+ yScroll = document.body.scrollHeight;
+ } else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
+ xScroll = document.body.offsetWidth;
+ yScroll = document.body.offsetHeight;
+ }
+
+ var windowWidth, windowHeight;
+
+ if (self.innerHeight) { // all except Explorer
+ if(document.documentElement.clientWidth){
+ windowWidth = document.documentElement.clientWidth;
+ } else {
+ windowWidth = self.innerWidth;
+ }
+ windowHeight = self.innerHeight;
+ } else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
+ windowWidth = document.documentElement.clientWidth;
+ windowHeight = document.documentElement.clientHeight;
+ } else if (document.body) { // other Explorers
+ windowWidth = document.body.clientWidth;
+ windowHeight = document.body.clientHeight;
+ }
+
+ // for small pages with total height less then height of the viewport
+ if(yScroll < windowHeight){
+ pageHeight = windowHeight;
+ } else {
+ pageHeight = yScroll;
+ }
+
+ // for small pages with total width less then width of the viewport
+ if(xScroll < windowWidth){
+ pageWidth = xScroll;
+ } else {
+ pageWidth = windowWidth;
+ }
+
+ return [pageWidth,pageHeight];
+ }
+}
+
+document.observe('dom:loaded', function () { new Lightbox(); });
diff --git a/js/prototype/prototype.js b/js/prototype/prototype.js
new file mode 100644
index 0000000..04a4779
--- /dev/null
+++ b/js/prototype/prototype.js
@@ -0,0 +1,6081 @@
+/* Prototype JavaScript framework, version 1.7
+ * (c) 2005-2010 Sam Stephenson
+ *
+ * Prototype is freely distributable under the terms of an MIT-style license.
+ * For details, see the Prototype web site: http://www.prototypejs.org/
+ *
+ *--------------------------------------------------------------------------*/
+
+var Prototype = {
+
+ Version: '1.7',
+
+ Browser: (function(){
+ var ua = navigator.userAgent;
+ var isOpera = Object.prototype.toString.call(window.opera) == '[object Opera]';
+ return {
+ IE: !!window.attachEvent && !isOpera,
+ Opera: isOpera,
+ WebKit: ua.indexOf('AppleWebKit/') > -1,
+ Gecko: ua.indexOf('Gecko') > -1 && ua.indexOf('KHTML') === -1,
+ MobileSafari: /Apple.*Mobile/.test(ua)
+ }
+ })(),
+
+ BrowserFeatures: {
+ XPath: !!document.evaluate,
+
+ SelectorsAPI: !!document.querySelector,
+
+ ElementExtensions: (function() {
+ var constructor = window.Element || window.HTMLElement;
+ return !!(constructor && constructor.prototype);
+ })(),
+ SpecificElementExtensions: (function() {
+ if (typeof window.HTMLDivElement !== 'undefined')
+ return true;
+
+ var div = document.createElement('div'),
+ form = document.createElement('form'),
+ isSupported = false;
+
+ if (div['__proto__'] && (div['__proto__'] !== form['__proto__'])) {
+ isSupported = true;
+ }
+
+ div = form = null;
+
+ return isSupported;
+ })()
+ },
+
+ ScriptFragment: '<script[^>]*>([\\S\\s]*?)<\/script>',
+ JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/,
+
+ emptyFunction: function() { },
+
+ K: function(x) { return x }
+};
+
+if (Prototype.Browser.MobileSafari)
+ Prototype.BrowserFeatures.SpecificElementExtensions = false;
+/* Based on Alex Arnell's inheritance implementation. */
+
+var Class = (function() {
+
+ var IS_DONTENUM_BUGGY = (function(){
+ for (var p in { toString: 1 }) {
+ if (p === 'toString') return false;
+ }
+ return true;
+ })();
+
+ function subclass() {};
+ function create() {
+ var parent = null, properties = $A(arguments);
+ if (Object.isFunction(properties[0]))
+ parent = properties.shift();
+
+ function klass() {
+ this.initialize.apply(this, arguments);
+ }
+
+ Object.extend(klass, Class.Methods);
+ klass.superclass = parent;
+ klass.subclasses = [];
+
+ if (parent) {
+ subclass.prototype = parent.prototype;
+ klass.prototype = new subclass;
+ parent.subclasses.push(klass);
+ }
+
+ for (var i = 0, length = properties.length; i < length; i++)
+ klass.addMethods(properties[i]);
+
+ if (!klass.prototype.initialize)
+ klass.prototype.initialize = Prototype.emptyFunction;
+
+ klass.prototype.constructor = klass;
+ return klass;
+ }
+
+ function addMethods(source) {
+ var ancestor = this.superclass && this.superclass.prototype,
+ properties = Object.keys(source);
+
+ if (IS_DONTENUM_BUGGY) {
+ if (source.toString != Object.prototype.toString)
+ properties.push("toString");
+ if (source.valueOf != Object.prototype.valueOf)
+ properties.push("valueOf");
+ }
+
+ for (var i = 0, length = properties.length; i < length; i++) {
+ var property = properties[i], value = source[property];
+ if (ancestor && Object.isFunction(value) &&
+ value.argumentNames()[0] == "$super") {
+ var method = value;
+ value = (function(m) {
+ return function() { return ancestor[m].apply(this, arguments); };
+ })(property).wrap(method);
+
+ value.valueOf = method.valueOf.bind(method);
+ value.toString = method.toString.bind(method);
+ }
+ this.prototype[property] = value;
+ }
+
+ return this;
+ }
+
+ return {
+ create: create,
+ Methods: {
+ addMethods: addMethods
+ }
+ };
+})();
+(function() {
+
+ var _toString = Object.prototype.toString,
+ NULL_TYPE = 'Null',
+ UNDEFINED_TYPE = 'Undefined',
+ BOOLEAN_TYPE = 'Boolean',
+ NUMBER_TYPE = 'Number',
+ STRING_TYPE = 'String',
+ OBJECT_TYPE = 'Object',
+ FUNCTION_CLASS = '[object Function]',
+ BOOLEAN_CLASS = '[object Boolean]',
+ NUMBER_CLASS = '[object Number]',
+ STRING_CLASS = '[object String]',
+ ARRAY_CLASS = '[object Array]',
+ DATE_CLASS = '[object Date]',
+ NATIVE_JSON_STRINGIFY_SUPPORT = window.JSON &&
+ typeof JSON.stringify === 'function' &&
+ JSON.stringify(0) === '0' &&
+ typeof JSON.stringify(Prototype.K) === 'undefined';
+
+ function Type(o) {
+ switch(o) {
+ case null: return NULL_TYPE;
+ case (void 0): return UNDEFINED_TYPE;
+ }
+ var type = typeof o;
+ switch(type) {
+ case 'boolean': return BOOLEAN_TYPE;
+ case 'number': return NUMBER_TYPE;
+ case 'string': return STRING_TYPE;
+ }
+ return OBJECT_TYPE;
+ }
+
+ function extend(destination, source) {
+ for (var property in source)
+ destination[property] = source[property];
+ return destination;
+ }
+
+ function inspect(object) {
+ try {
+ if (isUndefined(object)) return 'undefined';
+ if (object === null) return 'null';
+ return object.inspect ? object.inspect() : String(object);
+ } catch (e) {
+ if (e instanceof RangeError) return '...';
+ throw e;
+ }
+ }
+
+ function toJSON(value) {
+ return Str('', { '': value }, []);
+ }
+
+ function Str(key, holder, stack) {
+ var value = holder[key],
+ type = typeof value;
+
+ if (Type(value) === OBJECT_TYPE && typeof value.toJSON === 'function') {
+ value = value.toJSON(key);
+ }
+
+ var _class = _toString.call(value);
+
+ switch (_class) {
+ case NUMBER_CLASS:
+ case BOOLEAN_CLASS:
+ case STRING_CLASS:
+ value = value.valueOf();
+ }
+
+ switch (value) {
+ case null: return 'null';
+ case true: return 'true';
+ case false: return 'false';
+ }
+
+ type = typeof value;
+ switch (type) {
+ case 'string':
+ return value.inspect(true);
+ case 'number':
+ return isFinite(value) ? String(value) : 'null';
+ case 'object':
+
+ for (var i = 0, length = stack.length; i < length; i++) {
+ if (stack[i] === value) { throw new TypeError(); }
+ }
+ stack.push(value);
+
+ var partial = [];
+ if (_class === ARRAY_CLASS) {
+ for (var i = 0, length = value.length; i < length; i++) {
+ var str = Str(i, value, stack);
+ partial.push(typeof str === 'undefined' ? 'null' : str);
+ }
+ partial = '[' + partial.join(',') + ']';
+ } else {
+ var keys = Object.keys(value);
+ for (var i = 0, length = keys.length; i < length; i++) {
+ var key = keys[i], str = Str(key, value, stack);
+ if (typeof str !== "undefined") {
+ partial.push(key.inspect(true)+ ':' + str);
+ }
+ }
+ partial = '{' + partial.join(',') + '}';
+ }
+ stack.pop();
+ return partial;
+ }
+ }
+
+ function stringify(object) {
+ return JSON.stringify(object);
+ }
+
+ function toQueryString(object) {
+ return $H(object).toQueryString();
+ }
+
+ function toHTML(object) {
+ return object && object.toHTML ? object.toHTML() : String.interpret(object);
+ }
+
+ function keys(object) {
+ if (Type(object) !== OBJECT_TYPE) { throw new TypeError(); }
+ var results = [];
+ for (var property in object) {
+ if (object.hasOwnProperty(property)) {
+ results.push(property);
+ }
+ }
+ return results;
+ }
+
+ function values(object) {
+ var results = [];
+ for (var property in object)
+ results.push(object[property]);
+ return results;
+ }
+
+ function clone(object) {
+ return extend({ }, object);
+ }
+
+ function isElement(object) {
+ return !!(object && object.nodeType == 1);
+ }
+
+ function isArray(object) {
+ return _toString.call(object) === ARRAY_CLASS;
+ }
+
+ var hasNativeIsArray = (typeof Array.isArray == 'function')
+ && Array.isArray([]) && !Array.isArray({});
+
+ if (hasNativeIsArray) {
+ isArray = Array.isArray;
+ }
+
+ function isHash(object) {
+ return object instanceof Hash;
+ }
+
+ function isFunction(object) {
+ return _toString.call(object) === FUNCTION_CLASS;
+ }
+
+ function isString(object) {
+ return _toString.call(object) === STRING_CLASS;
+ }
+
+ function isNumber(object) {
+ return _toString.call(object) === NUMBER_CLASS;
+ }
+
+ function isDate(object) {
+ return _toString.call(object) === DATE_CLASS;
+ }
+
+ function isUndefined(object) {
+ return typeof object === "undefined";
+ }
+
+ extend(Object, {
+ extend: extend,
+ inspect: inspect,
+ toJSON: NATIVE_JSON_STRINGIFY_SUPPORT ? stringify : toJSON,
+ toQueryString: toQueryString,
+ toHTML: toHTML,
+ keys: Object.keys || keys,
+ values: values,
+ clone: clone,
+ isElement: isElement,
+ isArray: isArray,
+ isHash: isHash,
+ isFunction: isFunction,
+ isString: isString,
+ isNumber: isNumber,
+ isDate: isDate,
+ isUndefined: isUndefined
+ });
+})();
+Object.extend(Function.prototype, (function() {
+ var slice = Array.prototype.slice;
+
+ function update(array, args) {
+ var arrayLength = array.length, length = args.length;
+ while (length--) array[arrayLength + length] = args[length];
+ return array;
+ }
+
+ function merge(array, args) {
+ array = slice.call(array, 0);
+ return update(array, args);
+ }
+
+ function argumentNames() {
+ var names = this.toString().match(/^[\s\(]*function[^(]*\(([^)]*)\)/)[1]
+ .replace(/\/\/.*?[\r\n]|\/\*(?:.|[\r\n])*?\*\//g, '')
+ .replace(/\s+/g, '').split(',');
+ return names.length == 1 && !names[0] ? [] : names;
+ }
+
+ function bind(context) {
+ if (arguments.length < 2 && Object.isUndefined(arguments[0])) return this;
+ var __method = this, args = slice.call(arguments, 1);
+ return function() {
+ var a = merge(args, arguments);
+ return __method.apply(context, a);
+ }
+ }
+
+ function bindAsEventListener(context) {
+ var __method = this, args = slice.call(arguments, 1);
+ return function(event) {
+ var a = update([event || window.event], args);
+ return __method.apply(context, a);
+ }
+ }
+
+ function curry() {
+ if (!arguments.length) return this;
+ var __method = this, args = slice.call(arguments, 0);
+ return function() {
+ var a = merge(args, arguments);
+ return __method.apply(this, a);
+ }
+ }
+
+ function delay(timeout) {
+ var __method = this, args = slice.call(arguments, 1);
+ timeout = timeout * 1000;
+ return window.setTimeout(function() {
+ return __method.apply(__method, args);
+ }, timeout);
+ }
+
+ function defer() {
+ var args = update([0.01], arguments);
+ return this.delay.apply(this, args);
+ }
+
+ function wrap(wrapper) {
+ var __method = this;
+ return function() {
+ var a = update([__method.bind(this)], arguments);
+ return wrapper.apply(this, a);
+ }
+ }
+
+ function methodize() {
+ if (this._methodized) return this._methodized;
+ var __method = this;
+ return this._methodized = function() {
+ var a = update([this], arguments);
+ return __method.apply(null, a);
+ };
+ }
+
+ return {
+ argumentNames: argumentNames,
+ bind: bind,
+ bindAsEventListener: bindAsEventListener,
+ curry: curry,
+ delay: delay,
+ defer: defer,
+ wrap: wrap,
+ methodize: methodize
+ }
+})());
+
+
+
+(function(proto) {
+
+
+ function toISOString() {
+ return this.getUTCFullYear() + '-' +
+ (this.getUTCMonth() + 1).toPaddedString(2) + '-' +
+ this.getUTCDate().toPaddedString(2) + 'T' +
+ this.getUTCHours().toPaddedString(2) + ':' +
+ this.getUTCMinutes().toPaddedString(2) + ':' +
+ this.getUTCSeconds().toPaddedString(2) + 'Z';
+ }
+
+
+ function toJSON() {
+ return this.toISOString();
+ }
+
+ if (!proto.toISOString) proto.toISOString = toISOString;
+ if (!proto.toJSON) proto.toJSON = toJSON;
+
+})(Date.prototype);
+
+
+RegExp.prototype.match = RegExp.prototype.test;
+
+RegExp.escape = function(str) {
+ return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');
+};
+var PeriodicalExecuter = Class.create({
+ initialize: function(callback, frequency) {
+ this.callback = callback;
+ this.frequency = frequency;
+ this.currentlyExecuting = false;
+
+ this.registerCallback();
+ },
+
+ registerCallback: function() {
+ this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
+ },
+
+ execute: function() {
+ this.callback(this);
+ },
+
+ stop: function() {
+ if (!this.timer) return;
+ clearInterval(this.timer);
+ this.timer = null;
+ },
+
+ onTimerEvent: function() {
+ if (!this.currentlyExecuting) {
+ try {
+ this.currentlyExecuting = true;
+ this.execute();
+ this.currentlyExecuting = false;
+ } catch(e) {
+ this.currentlyExecuting = false;
+ throw e;
+ }
+ }
+ }
+});
+Object.extend(String, {
+ interpret: function(value) {
+ return value == null ? '' : String(value);
+ },
+ specialChar: {
+ '\b': '\\b',
+ '\t': '\\t',
+ '\n': '\\n',
+ '\f': '\\f',
+ '\r': '\\r',
+ '\\': '\\\\'
+ }
+});
+
+Object.extend(String.prototype, (function() {
+ var NATIVE_JSON_PARSE_SUPPORT = window.JSON &&
+ typeof JSON.parse === 'function' &&
+ JSON.parse('{"test": true}').test;
+
+ function prepareReplacement(replacement) {
+ if (Object.isFunction(replacement)) return replacement;
+ var template = new Template(replacement);
+ return function(match) { return template.evaluate(match) };
+ }
+
+ function gsub(pattern, replacement) {
+ var result = '', source = this, match;
+ replacement = prepareReplacement(replacement);
+
+ if (Object.isString(pattern))
+ pattern = RegExp.escape(pattern);
+
+ if (!(pattern.length || pattern.source)) {
+ replacement = replacement('');
+ return replacement + source.split('').join(replacement) + replacement;
+ }
+
+ while (source.length > 0) {
+ if (match = source.match(pattern)) {
+ result += source.slice(0, match.index);
+ result += String.interpret(replacement(match));
+ source = source.slice(match.index + match[0].length);
+ } else {
+ result += source, source = '';
+ }
+ }
+ return result;
+ }
+
+ function sub(pattern, replacement, count) {
+ replacement = prepareReplacement(replacement);
+ count = Object.isUndefined(count) ? 1 : count;
+
+ return this.gsub(pattern, function(match) {
+ if (--count < 0) return match[0];
+ return replacement(match);
+ });
+ }
+
+ function scan(pattern, iterator) {
+ this.gsub(pattern, iterator);
+ return String(this);
+ }
+
+ function truncate(length, truncation) {
+ length = length || 30;
+ truncation = Object.isUndefined(truncation) ? '...' : truncation;
+ return this.length > length ?
+ this.slice(0, length - truncation.length) + truncation : String(this);
+ }
+
+ function strip() {
+ return this.replace(/^\s+/, '').replace(/\s+$/, '');
+ }
+
+ function stripTags() {
+ return this.replace(/<\w+(\s+("[^"]*"|'[^']*'|[^>])+)?>|<\/\w+>/gi, '');
+ }
+
+ function stripScripts() {
+ return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), '');
+ }
+
+ function extractScripts() {
+ var matchAll = new RegExp(Prototype.ScriptFragment, 'img'),
+ matchOne = new RegExp(Prototype.ScriptFragment, 'im');
+ return (this.match(matchAll) || []).map(function(scriptTag) {
+ return (scriptTag.match(matchOne) || ['', ''])[1];
+ });
+ }
+
+ function evalScripts() {
+ return this.extractScripts().map(function(script) { return eval(script) });
+ }
+
+ function escapeHTML() {
+ return this.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
+ }
+
+ function unescapeHTML() {
+ return this.stripTags().replace(/&lt;/g,'<').replace(/&gt;/g,'>').replace(/&amp;/g,'&');
+ }
+
+
+ function toQueryParams(separator) {
+ var match = this.strip().match(/([^?#]*)(#.*)?$/);
+ if (!match) return { };
+
+ return match[1].split(separator || '&').inject({ }, function(hash, pair) {
+ if ((pair = pair.split('='))[0]) {
+ var key = decodeURIComponent(pair.shift()),
+ value = pair.length > 1 ? pair.join('=') : pair[0];
+
+ if (value != undefined) value = decodeURIComponent(value);
+
+ if (key in hash) {
+ if (!Object.isArray(hash[key])) hash[key] = [hash[key]];
+ hash[key].push(value);
+ }
+ else hash[key] = value;
+ }
+ return hash;
+ });
+ }
+
+ function toArray() {
+ return this.split('');
+ }
+
+ function succ() {
+ return this.slice(0, this.length - 1) +
+ String.fromCharCode(this.charCodeAt(this.length - 1) + 1);
+ }
+
+ function times(count) {
+ return count < 1 ? '' : new Array(count + 1).join(this);
+ }
+
+ function camelize() {
+ return this.replace(/-+(.)?/g, function(match, chr) {
+ return chr ? chr.toUpperCase() : '';
+ });
+ }
+
+ function capitalize() {
+ return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();
+ }
+
+ function underscore() {
+ return this.replace(/::/g, '/')
+ .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2')
+ .replace(/([a-z\d])([A-Z])/g, '$1_$2')
+ .replace(/-/g, '_')
+ .toLowerCase();
+ }
+
+ function dasherize() {
+ return this.replace(/_/g, '-');
+ }
+
+ function inspect(useDoubleQuotes) {
+ var escapedString = this.replace(/[\x00-\x1f\\]/g, function(character) {
+ if (character in String.specialChar) {
+ return String.specialChar[character];
+ }
+ return '\\u00' + character.charCodeAt().toPaddedString(2, 16);
+ });
+ if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"';
+ return "'" + escapedString.replace(/'/g, '\\\'') + "'";
+ }
+
+ function unfilterJSON(filter) {
+ return this.replace(filter || Prototype.JSONFilter, '$1');
+ }
+
+ function isJSON() {
+ var str = this;
+ if (str.blank()) return false;
+ str = str.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@');
+ str = str.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']');
+ str = str.replace(/(?:^|:|,)(?:\s*\[)+/g, '');
+ return (/^[\],:{}\s]*$/).test(str);
+ }
+
+ function evalJSON(sanitize) {
+ var json = this.unfilterJSON(),
+ cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
+ if (cx.test(json)) {
+ json = json.replace(cx, function (a) {
+ return '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
+ });
+ }
+ try {
+ if (!sanitize || json.isJSON()) return eval('(' + json + ')');
+ } catch (e) { }
+ throw new SyntaxError('Badly formed JSON string: ' + this.inspect());
+ }
+
+ function parseJSON() {
+ var json = this.unfilterJSON();
+ return JSON.parse(json);
+ }
+
+ function include(pattern) {
+ return this.indexOf(pattern) > -1;
+ }
+
+ function startsWith(pattern) {
+ return this.lastIndexOf(pattern, 0) === 0;
+ }
+
+ function endsWith(pattern) {
+ var d = this.length - pattern.length;
+ return d >= 0 && this.indexOf(pattern, d) === d;
+ }
+
+ function empty() {
+ return this == '';
+ }
+
+ function blank() {
+ return /^\s*$/.test(this);
+ }
+
+ function interpolate(object, pattern) {
+ return new Template(this, pattern).evaluate(object);
+ }
+
+ return {
+ gsub: gsub,
+ sub: sub,
+ scan: scan,
+ truncate: truncate,
+ strip: String.prototype.trim || strip,
+ stripTags: stripTags,
+ stripScripts: stripScripts,
+ extractScripts: extractScripts,
+ evalScripts: evalScripts,
+ escapeHTML: escapeHTML,
+ unescapeHTML: unescapeHTML,
+ toQueryParams: toQueryParams,
+ parseQuery: toQueryParams,
+ toArray: toArray,
+ succ: succ,
+ times: times,
+ camelize: camelize,
+ capitalize: capitalize,
+ underscore: underscore,
+ dasherize: dasherize,
+ inspect: inspect,
+ unfilterJSON: unfilterJSON,
+ isJSON: isJSON,
+ evalJSON: NATIVE_JSON_PARSE_SUPPORT ? parseJSON : evalJSON,
+ include: include,
+ startsWith: startsWith,
+ endsWith: endsWith,
+ empty: empty,
+ blank: blank,
+ interpolate: interpolate
+ };
+})());
+
+var Template = Class.create({
+ initialize: function(template, pattern) {
+ this.template = template.toString();
+ this.pattern = pattern || Template.Pattern;
+ },
+
+ evaluate: function(object) {
+ if (object && Object.isFunction(object.toTemplateReplacements))
+ object = object.toTemplateReplacements();
+
+ return this.template.gsub(this.pattern, function(match) {
+ if (object == null) return (match[1] + '');
+
+ var before = match[1] || '';
+ if (before == '\\') return match[2];
+
+ var ctx = object, expr = match[3],
+ pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/;
+
+ match = pattern.exec(expr);
+ if (match == null) return before;
+
+ while (match != null) {
+ var comp = match[1].startsWith('[') ? match[2].replace(/\\\\]/g, ']') : match[1];
+ ctx = ctx[comp];
+ if (null == ctx || '' == match[3]) break;
+ expr = expr.substring('[' == match[3] ? match[1].length : match[0].length);
+ match = pattern.exec(expr);
+ }
+
+ return before + String.interpret(ctx);
+ });
+ }
+});
+Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;
+
+var $break = { };
+
+var Enumerable = (function() {
+ function each(iterator, context) {
+ var index = 0;
+ try {
+ this._each(function(value) {
+ iterator.call(context, value, index++);
+ });
+ } catch (e) {
+ if (e != $break) throw e;
+ }
+ return this;
+ }
+
+ function eachSlice(number, iterator, context) {
+ var index = -number, slices = [], array = this.toArray();
+ if (number < 1) return array;
+ while ((index += number) < array.length)
+ slices.push(array.slice(index, index+number));
+ return slices.collect(iterator, context);
+ }
+
+ function all(iterator, context) {
+ iterator = iterator || Prototype.K;
+ var result = true;
+ this.each(function(value, index) {
+ result = result && !!iterator.call(context, value, index);
+ if (!result) throw $break;
+ });
+ return result;
+ }
+
+ function any(iterator, context) {
+ iterator = iterator || Prototype.K;
+ var result = false;
+ this.each(function(value, index) {
+ if (result = !!iterator.call(context, value, index))
+ throw $break;
+ });
+ return result;
+ }
+
+ function collect(iterator, context) {
+ iterator = iterator || Prototype.K;
+ var results = [];
+ this.each(function(value, index) {
+ results.push(iterator.call(context, value, index));
+ });
+ return results;
+ }
+
+ function detect(iterator, context) {
+ var result;
+ this.each(function(value, index) {
+ if (iterator.call(context, value, index)) {
+ result = value;
+ throw $break;
+ }
+ });
+ return result;
+ }
+
+ function findAll(iterator, context) {
+ var results = [];
+ this.each(function(value, index) {
+ if (iterator.call(context, value, index))
+ results.push(value);
+ });
+ return results;
+ }
+
+ function grep(filter, iterator, context) {
+ iterator = iterator || Prototype.K;
+ var results = [];
+
+ if (Object.isString(filter))
+ filter = new RegExp(RegExp.escape(filter));
+
+ this.each(function(value, index) {
+ if (filter.match(value))
+ results.push(iterator.call(context, value, index));
+ });
+ return results;
+ }
+
+ function include(object) {
+ if (Object.isFunction(this.indexOf))
+ if (this.indexOf(object) != -1) return true;
+
+ var found = false;
+ this.each(function(value) {
+ if (value == object) {
+ found = true;
+ throw $break;
+ }
+ });
+ return found;
+ }
+
+ function inGroupsOf(number, fillWith) {
+ fillWith = Object.isUndefined(fillWith) ? null : fillWith;
+ return this.eachSlice(number, function(slice) {
+ while(slice.length < number) slice.push(fillWith);
+ return slice;
+ });
+ }
+
+ function inject(memo, iterator, context) {
+ this.each(function(value, index) {
+ memo = iterator.call(context, memo, value, index);
+ });
+ return memo;
+ }
+
+ function invoke(method) {
+ var args = $A(arguments).slice(1);
+ return this.map(function(value) {
+ return value[method].apply(value, args);
+ });
+ }
+
+ function max(iterator, context) {
+ iterator = iterator || Prototype.K;
+ var result;
+ this.each(function(value, index) {
+ value = iterator.call(context, value, index);
+ if (result == null || value >= result)
+ result = value;
+ });
+ return result;
+ }
+
+ function min(iterator, context) {
+ iterator = iterator || Prototype.K;
+ var result;
+ this.each(function(value, index) {
+ value = iterator.call(context, value, index);
+ if (result == null || value < result)
+ result = value;
+ });
+ return result;
+ }
+
+ function partition(iterator, context) {
+ iterator = iterator || Prototype.K;
+ var trues = [], falses = [];
+ this.each(function(value, index) {
+ (iterator.call(context, value, index) ?
+ trues : falses).push(value);
+ });
+ return [trues, falses];
+ }
+
+ function pluck(property) {
+ var results = [];
+ this.each(function(value) {
+ results.push(value[property]);
+ });
+ return results;
+ }
+
+ function reject(iterator, context) {
+ var results = [];
+ this.each(function(value, index) {
+ if (!iterator.call(context, value, index))
+ results.push(value);
+ });
+ return results;
+ }
+
+ function sortBy(iterator, context) {
+ return this.map(function(value, index) {
+ return {
+ value: value,
+ criteria: iterator.call(context, value, index)
+ };
+ }).sort(function(left, right) {
+ var a = left.criteria, b = right.criteria;
+ return a < b ? -1 : a > b ? 1 : 0;
+ }).pluck('value');
+ }
+
+ function toArray() {
+ return this.map();
+ }
+
+ function zip() {
+ var iterator = Prototype.K, args = $A(arguments);
+ if (Object.isFunction(args.last()))
+ iterator = args.pop();
+
+ var collections = [this].concat(args).map($A);
+ return this.map(function(value, index) {
+ return iterator(collections.pluck(index));
+ });
+ }
+
+ function size() {
+ return this.toArray().length;
+ }
+
+ function inspect() {
+ return '#<Enumerable:' + this.toArray().inspect() + '>';
+ }
+
+
+
+
+
+
+
+
+
+ return {
+ each: each,
+ eachSlice: eachSlice,
+ all: all,
+ every: all,
+ any: any,
+ some: any,
+ collect: collect,
+ map: collect,
+ detect: detect,
+ findAll: findAll,
+ select: findAll,
+ filter: findAll,
+ grep: grep,
+ include: include,
+ member: include,
+ inGroupsOf: inGroupsOf,
+ inject: inject,
+ invoke: invoke,
+ max: max,
+ min: min,
+ partition: partition,
+ pluck: pluck,
+ reject: reject,
+ sortBy: sortBy,
+ toArray: toArray,
+ entries: toArray,
+ zip: zip,
+ size: size,
+ inspect: inspect,
+ find: detect
+ };
+})();
+
+function $A(iterable) {
+ if (!iterable) return [];
+ if ('toArray' in Object(iterable)) return iterable.toArray();
+ var length = iterable.length || 0, results = new Array(length);
+ while (length--) results[length] = iterable[length];
+ return results;
+}
+
+
+function $w(string) {
+ if (!Object.isString(string)) return [];
+ string = string.strip();
+ return string ? string.split(/\s+/) : [];
+}
+
+Array.from = $A;
+
+
+(function() {
+ var arrayProto = Array.prototype,
+ slice = arrayProto.slice,
+ _each = arrayProto.forEach; // use native browser JS 1.6 implementation if available
+
+ function each(iterator, context) {
+ for (var i = 0, length = this.length >>> 0; i < length; i++) {
+ if (i in this) iterator.call(context, this[i], i, this);
+ }
+ }
+ if (!_each) _each = each;
+
+ function clear() {
+ this.length = 0;
+ return this;
+ }
+
+ function first() {
+ return this[0];
+ }
+
+ function last() {
+ return this[this.length - 1];
+ }
+
+ function compact() {
+ return this.select(function(value) {
+ return value != null;
+ });
+ }
+
+ function flatten() {
+ return this.inject([], function(array, value) {
+ if (Object.isArray(value))
+ return array.concat(value.flatten());
+ array.push(value);
+ return array;
+ });
+ }
+
+ function without() {
+ var values = slice.call(arguments, 0);
+ return this.select(function(value) {
+ return !values.include(value);
+ });
+ }
+
+ function reverse(inline) {
+ return (inline === false ? this.toArray() : this)._reverse();
+ }
+
+ function uniq(sorted) {
+ return this.inject([], function(array, value, index) {
+ if (0 == index || (sorted ? array.last() != value : !array.include(value)))
+ array.push(value);
+ return array;
+ });
+ }
+
+ function intersect(array) {
+ return this.uniq().findAll(function(item) {
+ return array.detect(function(value) { return item === value });
+ });
+ }
+
+
+ function clone() {
+ return slice.call(this, 0);
+ }
+
+ function size() {
+ return this.length;
+ }
+
+ function inspect() {
+ return '[' + this.map(Object.inspect).join(', ') + ']';
+ }
+
+ function indexOf(item, i) {
+ i || (i = 0);
+ var length = this.length;
+ if (i < 0) i = length + i;
+ for (; i < length; i++)
+ if (this[i] === item) return i;
+ return -1;
+ }
+
+ function lastIndexOf(item, i) {
+ i = isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1;
+ var n = this.slice(0, i).reverse().indexOf(item);
+ return (n < 0) ? n : i - n - 1;
+ }
+
+ function concat() {
+ var array = slice.call(this, 0), item;
+ for (var i = 0, length = arguments.length; i < length; i++) {
+ item = arguments[i];
+ if (Object.isArray(item) && !('callee' in item)) {
+ for (var j = 0, arrayLength = item.length; j < arrayLength; j++)
+ array.push(item[j]);
+ } else {
+ array.push(item);
+ }
+ }
+ return array;
+ }
+
+ Object.extend(arrayProto, Enumerable);
+
+ if (!arrayProto._reverse)
+ arrayProto._reverse = arrayProto.reverse;
+
+ Object.extend(arrayProto, {
+ _each: _each,
+ clear: clear,
+ first: first,
+ last: last,
+ compact: compact,
+ flatten: flatten,
+ without: without,
+ reverse: reverse,
+ uniq: uniq,
+ intersect: intersect,
+ clone: clone,
+ toArray: clone,
+ size: size,
+ inspect: inspect
+ });
+
+ var CONCAT_ARGUMENTS_BUGGY = (function() {
+ return [].concat(arguments)[0][0] !== 1;
+ })(1,2)
+
+ if (CONCAT_ARGUMENTS_BUGGY) arrayProto.concat = concat;
+
+ if (!arrayProto.indexOf) arrayProto.indexOf = indexOf;
+ if (!arrayProto.lastIndexOf) arrayProto.lastIndexOf = lastIndexOf;
+})();
+function $H(object) {
+ return new Hash(object);
+};
+
+var Hash = Class.create(Enumerable, (function() {
+ function initialize(object) {
+ this._object = Object.isHash(object) ? object.toObject() : Object.clone(object);
+ }
+
+
+ function _each(iterator) {
+ for (var key in this._object) {
+ var value = this._object[key], pair = [key, value];
+ pair.key = key;
+ pair.value = value;
+ iterator(pair);
+ }
+ }
+
+ function set(key, value) {
+ return this._object[key] = value;
+ }
+
+ function get(key) {
+ if (this._object[key] !== Object.prototype[key])
+ return this._object[key];
+ }
+
+ function unset(key) {
+ var value = this._object[key];
+ delete this._object[key];
+ return value;
+ }
+
+ function toObject() {
+ return Object.clone(this._object);
+ }
+
+
+
+ function keys() {
+ return this.pluck('key');
+ }
+
+ function values() {
+ return this.pluck('value');
+ }
+
+ function index(value) {
+ var match = this.detect(function(pair) {
+ return pair.value === value;
+ });
+ return match && match.key;
+ }
+
+ function merge(object) {
+ return this.clone().update(object);
+ }
+
+ function update(object) {
+ return new Hash(object).inject(this, function(result, pair) {
+ result.set(pair.key, pair.value);
+ return result;
+ });
+ }
+
+ function toQueryPair(key, value) {
+ if (Object.isUndefined(value)) return key;
+ return key + '=' + encodeURIComponent(String.interpret(value));
+ }
+
+ function toQueryString() {
+ return this.inject([], function(results, pair) {
+ var key = encodeURIComponent(pair.key), values = pair.value;
+
+ if (values && typeof values == 'object') {
+ if (Object.isArray(values)) {
+ var queryValues = [];
+ for (var i = 0, len = values.length, value; i < len; i++) {
+ value = values[i];
+ queryValues.push(toQueryPair(key, value));
+ }
+ return results.concat(queryValues);
+ }
+ } else results.push(toQueryPair(key, values));
+ return results;
+ }).join('&');
+ }
+
+ function inspect() {
+ return '#<Hash:{' + this.map(function(pair) {
+ return pair.map(Object.inspect).join(': ');
+ }).join(', ') + '}>';
+ }
+
+ function clone() {
+ return new Hash(this);
+ }
+
+ return {
+ initialize: initialize,
+ _each: _each,
+ set: set,
+ get: get,
+ unset: unset,
+ toObject: toObject,
+ toTemplateReplacements: toObject,
+ keys: keys,
+ values: values,
+ index: index,
+ merge: merge,
+ update: update,
+ toQueryString: toQueryString,
+ inspect: inspect,
+ toJSON: toObject,
+ clone: clone
+ };
+})());
+
+Hash.from = $H;
+Object.extend(Number.prototype, (function() {
+ function toColorPart() {
+ return this.toPaddedString(2, 16);
+ }
+
+ function succ() {
+ return this + 1;
+ }
+
+ function times(iterator, context) {
+ $R(0, this, true).each(iterator, context);
+ return this;
+ }
+
+ function toPaddedString(length, radix) {
+ var string = this.toString(radix || 10);
+ return '0'.times(length - string.length) + string;
+ }
+
+ function abs() {
+ return Math.abs(this);
+ }
+
+ function round() {
+ return Math.round(this);
+ }
+
+ function ceil() {
+ return Math.ceil(this);
+ }
+
+ function floor() {
+ return Math.floor(this);
+ }
+
+ return {
+ toColorPart: toColorPart,
+ succ: succ,
+ times: times,
+ toPaddedString: toPaddedString,
+ abs: abs,
+ round: round,
+ ceil: ceil,
+ floor: floor
+ };
+})());
+
+function $R(start, end, exclusive) {
+ return new ObjectRange(start, end, exclusive);
+}
+
+var ObjectRange = Class.create(Enumerable, (function() {
+ function initialize(start, end, exclusive) {
+ this.start = start;
+ this.end = end;
+ this.exclusive = exclusive;
+ }
+
+ function _each(iterator) {
+ var value = this.start;
+ while (this.include(value)) {
+ iterator(value);
+ value = value.succ();
+ }
+ }
+
+ function include(value) {
+ if (value < this.start)
+ return false;
+ if (this.exclusive)
+ return value < this.end;
+ return value <= this.end;
+ }
+
+ return {
+ initialize: initialize,
+ _each: _each,
+ include: include
+ };
+})());
+
+
+
+var Abstract = { };
+
+
+var Try = {
+ these: function() {
+ var returnValue;
+
+ for (var i = 0, length = arguments.length; i < length; i++) {
+ var lambda = arguments[i];
+ try {
+ returnValue = lambda();
+ break;
+ } catch (e) { }
+ }
+
+ return returnValue;
+ }
+};
+
+var Ajax = {
+ getTransport: function() {
+ return Try.these(
+ function() {return new XMLHttpRequest()},
+ function() {return new ActiveXObject('Msxml2.XMLHTTP')},
+ function() {return new ActiveXObject('Microsoft.XMLHTTP')}
+ ) || false;
+ },
+
+ activeRequestCount: 0
+};
+
+Ajax.Responders = {
+ responders: [],
+
+ _each: function(iterator) {
+ this.responders._each(iterator);
+ },
+
+ register: function(responder) {
+ if (!this.include(responder))
+ this.responders.push(responder);
+ },
+
+ unregister: function(responder) {
+ this.responders = this.responders.without(responder);
+ },
+
+ dispatch: function(callback, request, transport, json) {
+ this.each(function(responder) {
+ if (Object.isFunction(responder[callback])) {
+ try {
+ responder[callback].apply(responder, [request, transport, json]);
+ } catch (e) { }
+ }
+ });
+ }
+};
+
+Object.extend(Ajax.Responders, Enumerable);
+
+Ajax.Responders.register({
+ onCreate: function() { Ajax.activeRequestCount++ },
+ onComplete: function() { Ajax.activeRequestCount-- }
+});
+Ajax.Base = Class.create({
+ initialize: function(options) {
+ this.options = {
+ method: 'post',
+ asynchronous: true,
+ contentType: 'application/x-www-form-urlencoded',
+ encoding: 'UTF-8',
+ parameters: '',
+ evalJSON: true,
+ evalJS: true
+ };
+ Object.extend(this.options, options || { });
+
+ this.options.method = this.options.method.toLowerCase();
+
+ if (Object.isHash(this.options.parameters))
+ this.options.parameters = this.options.parameters.toObject();
+ }
+});
+Ajax.Request = Class.create(Ajax.Base, {
+ _complete: false,
+
+ initialize: function($super, url, options) {
+ $super(options);
+ this.transport = Ajax.getTransport();
+ this.request(url);
+ },
+
+ request: function(url) {
+ this.url = url;
+ this.method = this.options.method;
+ var params = Object.isString(this.options.parameters) ?
+ this.options.parameters :
+ Object.toQueryString(this.options.parameters);
+
+ if (!['get', 'post'].include(this.method)) {
+ params += (params ? '&' : '') + "_method=" + this.method;
+ this.method = 'post';
+ }
+
+ if (params && this.method === 'get') {
+ this.url += (this.url.include('?') ? '&' : '?') + params;
+ }
+
+ this.parameters = params.toQueryParams();
+
+ try {
+ var response = new Ajax.Response(this);
+ if (this.options.onCreate) this.options.onCreate(response);
+ Ajax.Responders.dispatch('onCreate', this, response);
+
+ this.transport.open(this.method.toUpperCase(), this.url,
+ this.options.asynchronous);
+
+ if (this.options.asynchronous) this.respondToReadyState.bind(this).defer(1);
+
+ this.transport.onreadystatechange = this.onStateChange.bind(this);
+ this.setRequestHeaders();
+
+ this.body = this.method == 'post' ? (this.options.postBody || params) : null;
+ this.transport.send(this.body);
+
+ /* Force Firefox to handle ready state 4 for synchronous requests */
+ if (!this.options.asynchronous && this.transport.overrideMimeType)
+ this.onStateChange();
+
+ }
+ catch (e) {
+ this.dispatchException(e);
+ }
+ },
+
+ onStateChange: function() {
+ var readyState = this.transport.readyState;
+ if (readyState > 1 && !((readyState == 4) && this._complete))
+ this.respondToReadyState(this.transport.readyState);
+ },
+
+ setRequestHeaders: function() {
+ var headers = {
+ 'X-Requested-With': 'XMLHttpRequest',
+ 'X-Prototype-Version': Prototype.Version,
+ 'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'
+ };
+
+ if (this.method == 'post') {
+ headers['Content-type'] = this.options.contentType +
+ (this.options.encoding ? '; charset=' + this.options.encoding : '');
+
+ /* Force "Connection: close" for older Mozilla browsers to work
+ * around a bug where XMLHttpRequest sends an incorrect
+ * Content-length header. See Mozilla Bugzilla #246651.
+ */
+ if (this.transport.overrideMimeType &&
+ (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005)
+ headers['Connection'] = 'close';
+ }
+
+ if (typeof this.options.requestHeaders == 'object') {
+ var extras = this.options.requestHeaders;
+
+ if (Object.isFunction(extras.push))
+ for (var i = 0, length = extras.length; i < length; i += 2)
+ headers[extras[i]] = extras[i+1];
+ else
+ $H(extras).each(function(pair) { headers[pair.key] = pair.value });
+ }
+
+ for (var name in headers)
+ this.transport.setRequestHeader(name, headers[name]);
+ },
+
+ success: function() {
+ var status = this.getStatus();
+ return !status || (status >= 200 && status < 300) || status == 304;
+ },
+
+ getStatus: function() {
+ try {
+ if (this.transport.status === 1223) return 204;
+ return this.transport.status || 0;
+ } catch (e) { return 0 }
+ },
+
+ respondToReadyState: function(readyState) {
+ var state = Ajax.Request.Events[readyState], response = new Ajax.Response(this);
+
+ if (state == 'Complete') {
+ try {
+ this._complete = true;
+ (this.options['on' + response.status]
+ || this.options['on' + (this.success() ? 'Success' : 'Failure')]
+ || Prototype.emptyFunction)(response, response.headerJSON);
+ } catch (e) {
+ this.dispatchException(e);
+ }
+
+ var contentType = response.getHeader('Content-type');
+ if (this.options.evalJS == 'force'
+ || (this.options.evalJS && this.isSameOrigin() && contentType
+ && contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i)))
+ this.evalResponse();
+ }
+
+ try {
+ (this.options['on' + state] || Prototype.emptyFunction)(response, response.headerJSON);
+ Ajax.Responders.dispatch('on' + state, this, response, response.headerJSON);
+ } catch (e) {
+ this.dispatchException(e);
+ }
+
+ if (state == 'Complete') {
+ this.transport.onreadystatechange = Prototype.emptyFunction;
+ }
+ },
+
+ isSameOrigin: function() {
+ var m = this.url.match(/^\s*https?:\/\/[^\/]*/);
+ return !m || (m[0] == '#{protocol}//#{domain}#{port}'.interpolate({
+ protocol: location.protocol,
+ domain: document.domain,
+ port: location.port ? ':' + location.port : ''
+ }));
+ },
+
+ getHeader: function(name) {
+ try {
+ return this.transport.getResponseHeader(name) || null;
+ } catch (e) { return null; }
+ },
+
+ evalResponse: function() {
+ try {
+ return eval((this.transport.responseText || '').unfilterJSON());
+ } catch (e) {
+ this.dispatchException(e);
+ }
+ },
+
+ dispatchException: function(exception) {
+ (this.options.onException || Prototype.emptyFunction)(this, exception);
+ Ajax.Responders.dispatch('onException', this, exception);
+ }
+});
+
+Ajax.Request.Events =
+ ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];
+
+
+
+
+
+
+
+
+Ajax.Response = Class.create({
+ initialize: function(request){
+ this.request = request;
+ var transport = this.transport = request.transport,
+ readyState = this.readyState = transport.readyState;
+
+ if ((readyState > 2 && !Prototype.Browser.IE) || readyState == 4) {
+ this.status = this.getStatus();
+ this.statusText = this.getStatusText();
+ this.responseText = String.interpret(transport.responseText);
+ this.headerJSON = this._getHeaderJSON();
+ }
+
+ if (readyState == 4) {
+ var xml = transport.responseXML;
+ this.responseXML = Object.isUndefined(xml) ? null : xml;
+ this.responseJSON = this._getResponseJSON();
+ }
+ },
+
+ status: 0,
+
+ statusText: '',
+
+ getStatus: Ajax.Request.prototype.getStatus,
+
+ getStatusText: function() {
+ try {
+ return this.transport.statusText || '';
+ } catch (e) { return '' }
+ },
+
+ getHeader: Ajax.Request.prototype.getHeader,
+
+ getAllHeaders: function() {
+ try {
+ return this.getAllResponseHeaders();
+ } catch (e) { return null }
+ },
+
+ getResponseHeader: function(name) {
+ return this.transport.getResponseHeader(name);
+ },
+
+ getAllResponseHeaders: function() {
+ return this.transport.getAllResponseHeaders();
+ },
+
+ _getHeaderJSON: function() {
+ var json = this.getHeader('X-JSON');
+ if (!json) return null;
+ json = decodeURIComponent(escape(json));
+ try {
+ return json.evalJSON(this.request.options.sanitizeJSON ||
+ !this.request.isSameOrigin());
+ } catch (e) {
+ this.request.dispatchException(e);
+ }
+ },
+
+ _getResponseJSON: function() {
+ var options = this.request.options;
+ if (!options.evalJSON || (options.evalJSON != 'force' &&
+ !(this.getHeader('Content-type') || '').include('application/json')) ||
+ this.responseText.blank())
+ return null;
+ try {
+ return this.responseText.evalJSON(options.sanitizeJSON ||
+ !this.request.isSameOrigin());
+ } catch (e) {
+ this.request.dispatchException(e);
+ }
+ }
+});
+
+Ajax.Updater = Class.create(Ajax.Request, {
+ initialize: function($super, container, url, options) {
+ this.container = {
+ success: (container.success || container),
+ failure: (container.failure || (container.success ? null : container))
+ };
+
+ options = Object.clone(options);
+ var onComplete = options.onComplete;
+ options.onComplete = (function(response, json) {
+ this.updateContent(response.responseText);
+ if (Object.isFunction(onComplete)) onComplete(response, json);
+ }).bind(this);
+
+ $super(url, options);
+ },
+
+ updateContent: function(responseText) {
+ var receiver = this.container[this.success() ? 'success' : 'failure'],
+ options = this.options;
+
+ if (!options.evalScripts) responseText = responseText.stripScripts();
+
+ if (receiver = $(receiver)) {
+ if (options.insertion) {
+ if (Object.isString(options.insertion)) {
+ var insertion = { }; insertion[options.insertion] = responseText;
+ receiver.insert(insertion);
+ }
+ else options.insertion(receiver, responseText);
+ }
+ else receiver.update(responseText);
+ }
+ }
+});
+
+Ajax.PeriodicalUpdater = Class.create(Ajax.Base, {
+ initialize: function($super, container, url, options) {
+ $super(options);
+ this.onComplete = this.options.onComplete;
+
+ this.frequency = (this.options.frequency || 2);
+ this.decay = (this.options.decay || 1);
+
+ this.updater = { };
+ this.container = container;
+ this.url = url;
+
+ this.start();
+ },
+
+ start: function() {
+ this.options.onComplete = this.updateComplete.bind(this);
+ this.onTimerEvent();
+ },
+
+ stop: function() {
+ this.updater.options.onComplete = undefined;
+ clearTimeout(this.timer);
+ (this.onComplete || Prototype.emptyFunction).apply(this, arguments);
+ },
+
+ updateComplete: function(response) {
+ if (this.options.decay) {
+ this.decay = (response.responseText == this.lastText ?
+ this.decay * this.options.decay : 1);
+
+ this.lastText = response.responseText;
+ }
+ this.timer = this.onTimerEvent.bind(this).delay(this.decay * this.frequency);
+ },
+
+ onTimerEvent: function() {
+ this.updater = new Ajax.Updater(this.container, this.url, this.options);
+ }
+});
+
+
+function $(element) {
+ if (arguments.length > 1) {
+ for (var i = 0, elements = [], length = arguments.length; i < length; i++)
+ elements.push($(arguments[i]));
+ return elements;
+ }
+ if (Object.isString(element))
+ element = document.getElementById(element);
+ return Element.extend(element);
+}
+
+if (Prototype.BrowserFeatures.XPath) {
+ document._getElementsByXPath = function(expression, parentElement) {
+ var results = [];
+ var query = document.evaluate(expression, $(parentElement) || document,
+ null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+ for (var i = 0, length = query.snapshotLength; i < length; i++)
+ results.push(Element.extend(query.snapshotItem(i)));
+ return results;
+ };
+}
+
+/*--------------------------------------------------------------------------*/
+
+if (!Node) var Node = { };
+
+if (!Node.ELEMENT_NODE) {
+ Object.extend(Node, {
+ ELEMENT_NODE: 1,
+ ATTRIBUTE_NODE: 2,
+ TEXT_NODE: 3,
+ CDATA_SECTION_NODE: 4,
+ ENTITY_REFERENCE_NODE: 5,
+ ENTITY_NODE: 6,
+ PROCESSING_INSTRUCTION_NODE: 7,
+ COMMENT_NODE: 8,
+ DOCUMENT_NODE: 9,
+ DOCUMENT_TYPE_NODE: 10,
+ DOCUMENT_FRAGMENT_NODE: 11,
+ NOTATION_NODE: 12
+ });
+}
+
+
+
+(function(global) {
+ function shouldUseCache(tagName, attributes) {
+ if (tagName === 'select') return false;
+ if ('type' in attributes) return false;
+ return true;
+ }
+
+ var HAS_EXTENDED_CREATE_ELEMENT_SYNTAX = (function(){
+ try {
+ var el = document.createElement('<input name="x">');
+ return el.tagName.toLowerCase() === 'input' && el.name === 'x';
+ }
+ catch(err) {
+ return false;
+ }
+ })();
+
+ var element = global.Element;
+
+ global.Element = function(tagName, attributes) {
+ attributes = attributes || { };
+ tagName = tagName.toLowerCase();
+ var cache = Element.cache;
+
+ if (HAS_EXTENDED_CREATE_ELEMENT_SYNTAX && attributes.name) {
+ tagName = '<' + tagName + ' name="' + attributes.name + '">';
+ delete attributes.name;
+ return Element.writeAttribute(document.createElement(tagName), attributes);
+ }
+
+ if (!cache[tagName]) cache[tagName] = Element.extend(document.createElement(tagName));
+
+ var node = shouldUseCache(tagName, attributes) ?
+ cache[tagName].cloneNode(false) : document.createElement(tagName);
+
+ return Element.writeAttribute(node, attributes);
+ };
+
+ Object.extend(global.Element, element || { });
+ if (element) global.Element.prototype = element.prototype;
+
+})(this);
+
+Element.idCounter = 1;
+Element.cache = { };
+
+Element._purgeElement = function(element) {
+ var uid = element._prototypeUID;
+ if (uid) {
+ Element.stopObserving(element);
+ element._prototypeUID = void 0;
+ delete Element.Storage[uid];
+ }
+}
+
+Element.Methods = {
+ visible: function(element) {
+ return $(element).style.display != 'none';
+ },
+
+ toggle: function(element) {
+ element = $(element);
+ Element[Element.visible(element) ? 'hide' : 'show'](element);
+ return element;
+ },
+
+ hide: function(element) {
+ element = $(element);
+ element.style.display = 'none';
+ return element;
+ },
+
+ show: function(element) {
+ element = $(element);
+ element.style.display = '';
+ return element;
+ },
+
+ remove: function(element) {
+ element = $(element);
+ element.parentNode.removeChild(element);
+ return element;
+ },
+
+ update: (function(){
+
+ var SELECT_ELEMENT_INNERHTML_BUGGY = (function(){
+ var el = document.createElement("select"),
+ isBuggy = true;
+ el.innerHTML = "<option value=\"test\">test</option>";
+ if (el.options && el.options[0]) {
+ isBuggy = el.options[0].nodeName.toUpperCase() !== "OPTION";
+ }
+ el = null;
+ return isBuggy;
+ })();
+
+ var TABLE_ELEMENT_INNERHTML_BUGGY = (function(){
+ try {
+ var el = document.createElement("table");
+ if (el && el.tBodies) {
+ el.innerHTML = "<tbody><tr><td>test</td></tr></tbody>";
+ var isBuggy = typeof el.tBodies[0] == "undefined";
+ el = null;
+ return isBuggy;
+ }
+ } catch (e) {
+ return true;
+ }
+ })();
+
+ var LINK_ELEMENT_INNERHTML_BUGGY = (function() {
+ try {
+ var el = document.createElement('div');
+ el.innerHTML = "<link>";
+ var isBuggy = (el.childNodes.length === 0);
+ el = null;
+ return isBuggy;
+ } catch(e) {
+ return true;
+ }
+ })();
+
+ var ANY_INNERHTML_BUGGY = SELECT_ELEMENT_INNERHTML_BUGGY ||
+ TABLE_ELEMENT_INNERHTML_BUGGY || LINK_ELEMENT_INNERHTML_BUGGY;
+
+ var SCRIPT_ELEMENT_REJECTS_TEXTNODE_APPENDING = (function () {
+ var s = document.createElement("script"),
+ isBuggy = false;
+ try {
+ s.appendChild(document.createTextNode(""));
+ isBuggy = !s.firstChild ||
+ s.firstChild && s.firstChild.nodeType !== 3;
+ } catch (e) {
+ isBuggy = true;
+ }
+ s = null;
+ return isBuggy;
+ })();
+
+
+ function update(element, content) {
+ element = $(element);
+ var purgeElement = Element._purgeElement;
+
+ var descendants = element.getElementsByTagName('*'),
+ i = descendants.length;
+ while (i--) purgeElement(descendants[i]);
+
+ if (content && content.toElement)
+ content = content.toElement();
+
+ if (Object.isElement(content))
+ return element.update().insert(content);
+
+ content = Object.toHTML(content);
+
+ var tagName = element.tagName.toUpperCase();
+
+ if (tagName === 'SCRIPT' && SCRIPT_ELEMENT_REJECTS_TEXTNODE_APPENDING) {
+ element.text = content;
+ return element;
+ }
+
+ if (ANY_INNERHTML_BUGGY) {
+ if (tagName in Element._insertionTranslations.tags) {
+ while (element.firstChild) {
+ element.removeChild(element.firstChild);
+ }
+ Element._getContentFromAnonymousElement(tagName, content.stripScripts())
+ .each(function(node) {
+ element.appendChild(node)
+ });
+ } else if (LINK_ELEMENT_INNERHTML_BUGGY && Object.isString(content) && content.indexOf('<link') > -1) {
+ while (element.firstChild) {
+ element.removeChild(element.firstChild);
+ }
+ var nodes = Element._getContentFromAnonymousElement(tagName, content.stripScripts(), true);
+ nodes.each(function(node) { element.appendChild(node) });
+ }
+ else {
+ element.innerHTML = content.stripScripts();
+ }
+ }
+ else {
+ element.innerHTML = content.stripScripts();
+ }
+
+ content.evalScripts.bind(content).defer();
+ return element;
+ }
+
+ return update;
+ })(),
+
+ replace: function(element, content) {
+ element = $(element);
+ if (content && content.toElement) content = content.toElement();
+ else if (!Object.isElement(content)) {
+ content = Object.toHTML(content);
+ var range = element.ownerDocument.createRange();
+ range.selectNode(element);
+ content.evalScripts.bind(content).defer();
+ content = range.createContextualFragment(content.stripScripts());
+ }
+ element.parentNode.replaceChild(content, element);
+ return element;
+ },
+
+ insert: function(element, insertions) {
+ element = $(element);
+
+ if (Object.isString(insertions) || Object.isNumber(insertions) ||
+ Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML)))
+ insertions = {bottom:insertions};
+
+ var content, insert, tagName, childNodes;
+
+ for (var position in insertions) {
+ content = insertions[position];
+ position = position.toLowerCase();
+ insert = Element._insertionTranslations[position];
+
+ if (content && content.toElement) content = content.toElement();
+ if (Object.isElement(content)) {
+ insert(element, content);
+ continue;
+ }
+
+ content = Object.toHTML(content);
+
+ tagName = ((position == 'before' || position == 'after')
+ ? element.parentNode : element).tagName.toUpperCase();
+
+ childNodes = Element._getContentFromAnonymousElement(tagName, content.stripScripts());
+
+ if (position == 'top' || position == 'after') childNodes.reverse();
+ childNodes.each(insert.curry(element));
+
+ content.evalScripts.bind(content).defer();
+ }
+
+ return element;
+ },
+
+ wrap: function(element, wrapper, attributes) {
+ element = $(element);
+ if (Object.isElement(wrapper))
+ $(wrapper).writeAttribute(attributes || { });
+ else if (Object.isString(wrapper)) wrapper = new Element(wrapper, attributes);
+ else wrapper = new Element('div', wrapper);
+ if (element.parentNode)
+ element.parentNode.replaceChild(wrapper, element);
+ wrapper.appendChild(element);
+ return wrapper;
+ },
+
+ inspect: function(element) {
+ element = $(element);
+ var result = '<' + element.tagName.toLowerCase();
+ $H({'id': 'id', 'className': 'class'}).each(function(pair) {
+ var property = pair.first(),
+ attribute = pair.last(),
+ value = (element[property] || '').toString();
+ if (value) result += ' ' + attribute + '=' + value.inspect(true);
+ });
+ return result + '>';
+ },
+
+ recursivelyCollect: function(element, property, maximumLength) {
+ element = $(element);
+ maximumLength = maximumLength || -1;
+ var elements = [];
+
+ while (element = element[property]) {
+ if (element.nodeType == 1)
+ elements.push(Element.extend(element));
+ if (elements.length == maximumLength)
+ break;
+ }
+
+ return elements;
+ },
+
+ ancestors: function(element) {
+ return Element.recursivelyCollect(element, 'parentNode');
+ },
+
+ descendants: function(element) {
+ return Element.select(element, "*");
+ },
+
+ firstDescendant: function(element) {
+ element = $(element).firstChild;
+ while (element && element.nodeType != 1) element = element.nextSibling;
+ return $(element);
+ },
+
+ immediateDescendants: function(element) {
+ var results = [], child = $(element).firstChild;
+ while (child) {
+ if (child.nodeType === 1) {
+ results.push(Element.extend(child));
+ }
+ child = child.nextSibling;
+ }
+ return results;
+ },
+
+ previousSiblings: function(element, maximumLength) {
+ return Element.recursivelyCollect(element, 'previousSibling');
+ },
+
+ nextSiblings: function(element) {
+ return Element.recursivelyCollect(element, 'nextSibling');
+ },
+
+ siblings: function(element) {
+ element = $(element);
+ return Element.previousSiblings(element).reverse()
+ .concat(Element.nextSiblings(element));
+ },
+
+ match: function(element, selector) {
+ element = $(element);
+ if (Object.isString(selector))
+ return Prototype.Selector.match(element, selector);
+ return selector.match(element);
+ },
+
+ up: function(element, expression, index) {
+ element = $(element);
+ if (arguments.length == 1) return $(element.parentNode);
+ var ancestors = Element.ancestors(element);
+ return Object.isNumber(expression) ? ancestors[expression] :
+ Prototype.Selector.find(ancestors, expression, index);
+ },
+
+ down: function(element, expression, index) {
+ element = $(element);
+ if (arguments.length == 1) return Element.firstDescendant(element);
+ return Object.isNumber(expression) ? Element.descendants(element)[expression] :
+ Element.select(element, expression)[index || 0];
+ },
+
+ previous: function(element, expression, index) {
+ element = $(element);
+ if (Object.isNumber(expression)) index = expression, expression = false;
+ if (!Object.isNumber(index)) index = 0;
+
+ if (expression) {
+ return Prototype.Selector.find(element.previousSiblings(), expression, index);
+ } else {
+ return element.recursivelyCollect("previousSibling", index + 1)[index];
+ }
+ },
+
+ next: function(element, expression, index) {
+ element = $(element);
+ if (Object.isNumber(expression)) index = expression, expression = false;
+ if (!Object.isNumber(index)) index = 0;
+
+ if (expression) {
+ return Prototype.Selector.find(element.nextSiblings(), expression, index);
+ } else {
+ var maximumLength = Object.isNumber(index) ? index + 1 : 1;
+ return element.recursivelyCollect("nextSibling", index + 1)[index];
+ }
+ },
+
+
+ select: function(element) {
+ element = $(element);
+ var expressions = Array.prototype.slice.call(arguments, 1).join(', ');
+ return Prototype.Selector.select(expressions, element);
+ },
+
+ adjacent: function(element) {
+ element = $(element);
+ var expressions = Array.prototype.slice.call(arguments, 1).join(', ');
+ return Prototype.Selector.select(expressions, element.parentNode).without(element);
+ },
+
+ identify: function(element) {
+ element = $(element);
+ var id = Element.readAttribute(element, 'id');
+ if (id) return id;
+ do { id = 'anonymous_element_' + Element.idCounter++ } while ($(id));
+ Element.writeAttribute(element, 'id', id);
+ return id;
+ },
+
+ readAttribute: function(element, name) {
+ element = $(element);
+ if (Prototype.Browser.IE) {
+ var t = Element._attributeTranslations.read;
+ if (t.values[name]) return t.values[name](element, name);
+ if (t.names[name]) name = t.names[name];
+ if (name.include(':')) {
+ return (!element.attributes || !element.attributes[name]) ? null :
+ element.attributes[name].value;
+ }
+ }
+ return element.getAttribute(name);
+ },
+
+ writeAttribute: function(element, name, value) {
+ element = $(element);
+ var attributes = { }, t = Element._attributeTranslations.write;
+
+ if (typeof name == 'object') attributes = name;
+ else attributes[name] = Object.isUndefined(value) ? true : value;
+
+ for (var attr in attributes) {
+ name = t.names[attr] || attr;
+ value = attributes[attr];
+ if (t.values[attr]) name = t.values[attr](element, value);
+ if (value === false || value === null)
+ element.removeAttribute(name);
+ else if (value === true)
+ element.setAttribute(name, name);
+ else element.setAttribute(name, value);
+ }
+ return element;
+ },
+
+ getHeight: function(element) {
+ return Element.getDimensions(element).height;
+ },
+
+ getWidth: function(element) {
+ return Element.getDimensions(element).width;
+ },
+
+ classNames: function(element) {
+ return new Element.ClassNames(element);
+ },
+
+ hasClassName: function(element, className) {
+ if (!(element = $(element))) return;
+ var elementClassName = element.className;
+ return (elementClassName.length > 0 && (elementClassName == className ||
+ new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName)));
+ },
+
+ addClassName: function(element, className) {
+ if (!(element = $(element))) return;
+ if (!Element.hasClassName(element, className))
+ element.className += (element.className ? ' ' : '') + className;
+ return element;
+ },
+
+ removeClassName: function(element, className) {
+ if (!(element = $(element))) return;
+ element.className = element.className.replace(
+ new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ').strip();
+ return element;
+ },
+
+ toggleClassName: function(element, className) {
+ if (!(element = $(element))) return;
+ return Element[Element.hasClassName(element, className) ?
+ 'removeClassName' : 'addClassName'](element, className);
+ },
+
+ cleanWhitespace: function(element) {
+ element = $(element);
+ var node = element.firstChild;
+ while (node) {
+ var nextNode = node.nextSibling;
+ if (node.nodeType == 3 && !/\S/.test(node.nodeValue))
+ element.removeChild(node);
+ node = nextNode;
+ }
+ return element;
+ },
+
+ empty: function(element) {
+ return $(element).innerHTML.blank();
+ },
+
+ descendantOf: function(element, ancestor) {
+ element = $(element), ancestor = $(ancestor);
+
+ if (element.compareDocumentPosition)
+ return (element.compareDocumentPosition(ancestor) & 8) === 8;
+
+ if (ancestor.contains)
+ return ancestor.contains(element) && ancestor !== element;
+
+ while (element = element.parentNode)
+ if (element == ancestor) return true;
+
+ return false;
+ },
+
+ scrollTo: function(element) {
+ element = $(element);
+ var pos = Element.cumulativeOffset(element);
+ window.scrollTo(pos[0], pos[1]);
+ return element;
+ },
+
+ getStyle: function(element, style) {
+ element = $(element);
+ style = style == 'float' ? 'cssFloat' : style.camelize();
+ var value = element.style[style];
+ if (!value || value == 'auto') {
+ var css = document.defaultView.getComputedStyle(element, null);
+ value = css ? css[style] : null;
+ }
+ if (style == 'opacity') return value ? parseFloat(value) : 1.0;
+ return value == 'auto' ? null : value;
+ },
+
+ getOpacity: function(element) {
+ return $(element).getStyle('opacity');
+ },
+
+ setStyle: function(element, styles) {
+ element = $(element);
+ var elementStyle = element.style, match;
+ if (Object.isString(styles)) {
+ element.style.cssText += ';' + styles;
+ return styles.include('opacity') ?
+ element.setOpacity(styles.match(/opacity:\s*(\d?\.?\d*)/)[1]) : element;
+ }
+ for (var property in styles)
+ if (property == 'opacity') element.setOpacity(styles[property]);
+ else
+ elementStyle[(property == 'float' || property == 'cssFloat') ?
+ (Object.isUndefined(elementStyle.styleFloat) ? 'cssFloat' : 'styleFloat') :
+ property] = styles[property];
+
+ return element;
+ },
+
+ setOpacity: function(element, value) {
+ element = $(element);
+ element.style.opacity = (value == 1 || value === '') ? '' :
+ (value < 0.00001) ? 0 : value;
+ return element;
+ },
+
+ makePositioned: function(element) {
+ element = $(element);
+ var pos = Element.getStyle(element, 'position');
+ if (pos == 'static' || !pos) {
+ element._madePositioned = true;
+ element.style.position = 'relative';
+ if (Prototype.Browser.Opera) {
+ element.style.top = 0;
+ element.style.left = 0;
+ }
+ }
+ return element;
+ },
+
+ undoPositioned: function(element) {
+ element = $(element);
+ if (element._madePositioned) {
+ element._madePositioned = undefined;
+ element.style.position =
+ element.style.top =
+ element.style.left =
+ element.style.bottom =
+ element.style.right = '';
+ }
+ return element;
+ },
+
+ makeClipping: function(element) {
+ element = $(element);
+ if (element._overflow) return element;
+ element._overflow = Element.getStyle(element, 'overflow') || 'auto';
+ if (element._overflow !== 'hidden')
+ element.style.overflow = 'hidden';
+ return element;
+ },
+
+ undoClipping: function(element) {
+ element = $(element);
+ if (!element._overflow) return element;
+ element.style.overflow = element._overflow == 'auto' ? '' : element._overflow;
+ element._overflow = null;
+ return element;
+ },
+
+ clonePosition: function(element, source) {
+ var options = Object.extend({
+ setLeft: true,
+ setTop: true,
+ setWidth: true,
+ setHeight: true,
+ offsetTop: 0,
+ offsetLeft: 0
+ }, arguments[2] || { });
+
+ source = $(source);
+ var p = Element.viewportOffset(source), delta = [0, 0], parent = null;
+
+ element = $(element);
+
+ if (Element.getStyle(element, 'position') == 'absolute') {
+ parent = Element.getOffsetParent(element);
+ delta = Element.viewportOffset(parent);
+ }
+
+ if (parent == document.body) {
+ delta[0] -= document.body.offsetLeft;
+ delta[1] -= document.body.offsetTop;
+ }
+
+ if (options.setLeft) element.style.left = (p[0] - delta[0] + options.offsetLeft) + 'px';
+ if (options.setTop) element.style.top = (p[1] - delta[1] + options.offsetTop) + 'px';
+ if (options.setWidth) element.style.width = source.offsetWidth + 'px';
+ if (options.setHeight) element.style.height = source.offsetHeight + 'px';
+ return element;
+ }
+};
+
+Object.extend(Element.Methods, {
+ getElementsBySelector: Element.Methods.select,
+
+ childElements: Element.Methods.immediateDescendants
+});
+
+Element._attributeTranslations = {
+ write: {
+ names: {
+ className: 'class',
+ htmlFor: 'for'
+ },
+ values: { }
+ }
+};
+
+if (Prototype.Browser.Opera) {
+ Element.Methods.getStyle = Element.Methods.getStyle.wrap(
+ function(proceed, element, style) {
+ switch (style) {
+ case 'height': case 'width':
+ if (!Element.visible(element)) return null;
+
+ var dim = parseInt(proceed(element, style), 10);
+
+ if (dim !== element['offset' + style.capitalize()])
+ return dim + 'px';
+
+ var properties;
+ if (style === 'height') {
+ properties = ['border-top-width', 'padding-top',
+ 'padding-bottom', 'border-bottom-width'];
+ }
+ else {
+ properties = ['border-left-width', 'padding-left',
+ 'padding-right', 'border-right-width'];
+ }
+ return properties.inject(dim, function(memo, property) {
+ var val = proceed(element, property);
+ return val === null ? memo : memo - parseInt(val, 10);
+ }) + 'px';
+ default: return proceed(element, style);
+ }
+ }
+ );
+
+ Element.Methods.readAttribute = Element.Methods.readAttribute.wrap(
+ function(proceed, element, attribute) {
+ if (attribute === 'title') return element.title;
+ return proceed(element, attribute);
+ }
+ );
+}
+
+else if (Prototype.Browser.IE) {
+ Element.Methods.getStyle = function(element, style) {
+ element = $(element);
+ style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize();
+ var value = element.style[style];
+ if (!value && element.currentStyle) value = element.currentStyle[style];
+
+ if (style == 'opacity') {
+ if (value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/))
+ if (value[1]) return parseFloat(value[1]) / 100;
+ return 1.0;
+ }
+
+ if (value == 'auto') {
+ if ((style == 'width' || style == 'height') && (element.getStyle('display') != 'none'))
+ return element['offset' + style.capitalize()] + 'px';
+ return null;
+ }
+ return value;
+ };
+
+ Element.Methods.setOpacity = function(element, value) {
+ function stripAlpha(filter){
+ return filter.replace(/alpha\([^\)]*\)/gi,'');
+ }
+ element = $(element);
+ var currentStyle = element.currentStyle;
+ if ((currentStyle && !currentStyle.hasLayout) ||
+ (!currentStyle && element.style.zoom == 'normal'))
+ element.style.zoom = 1;
+
+ var filter = element.getStyle('filter'), style = element.style;
+ if (value == 1 || value === '') {
+ (filter = stripAlpha(filter)) ?
+ style.filter = filter : style.removeAttribute('filter');
+ return element;
+ } else if (value < 0.00001) value = 0;
+ style.filter = stripAlpha(filter) +
+ 'alpha(opacity=' + (value * 100) + ')';
+ return element;
+ };
+
+ Element._attributeTranslations = (function(){
+
+ var classProp = 'className',
+ forProp = 'for',
+ el = document.createElement('div');
+
+ el.setAttribute(classProp, 'x');
+
+ if (el.className !== 'x') {
+ el.setAttribute('class', 'x');
+ if (el.className === 'x') {
+ classProp = 'class';
+ }
+ }
+ el = null;
+
+ el = document.createElement('label');
+ el.setAttribute(forProp, 'x');
+ if (el.htmlFor !== 'x') {
+ el.setAttribute('htmlFor', 'x');
+ if (el.htmlFor === 'x') {
+ forProp = 'htmlFor';
+ }
+ }
+ el = null;
+
+ return {
+ read: {
+ names: {
+ 'class': classProp,
+ 'className': classProp,
+ 'for': forProp,
+ 'htmlFor': forProp
+ },
+ values: {
+ _getAttr: function(element, attribute) {
+ return element.getAttribute(attribute);
+ },
+ _getAttr2: function(element, attribute) {
+ return element.getAttribute(attribute, 2);
+ },
+ _getAttrNode: function(element, attribute) {
+ var node = element.getAttributeNode(attribute);
+ return node ? node.value : "";
+ },
+ _getEv: (function(){
+
+ var el = document.createElement('div'), f;
+ el.onclick = Prototype.emptyFunction;
+ var value = el.getAttribute('onclick');
+
+ if (String(value).indexOf('{') > -1) {
+ f = function(element, attribute) {
+ attribute = element.getAttribute(attribute);
+ if (!attribute) return null;
+ attribute = attribute.toString();
+ attribute = attribute.split('{')[1];
+ attribute = attribute.split('}')[0];
+ return attribute.strip();
+ };
+ }
+ else if (value === '') {
+ f = function(element, attribute) {
+ attribute = element.getAttribute(attribute);
+ if (!attribute) return null;
+ return attribute.strip();
+ };
+ }
+ el = null;
+ return f;
+ })(),
+ _flag: function(element, attribute) {
+ return $(element).hasAttribute(attribute) ? attribute : null;
+ },
+ style: function(element) {
+ return element.style.cssText.toLowerCase();
+ },
+ title: function(element) {
+ return element.title;
+ }
+ }
+ }
+ }
+ })();
+
+ Element._attributeTranslations.write = {
+ names: Object.extend({
+ cellpadding: 'cellPadding',
+ cellspacing: 'cellSpacing'
+ }, Element._attributeTranslations.read.names),
+ values: {
+ checked: function(element, value) {
+ element.checked = !!value;
+ },
+
+ style: function(element, value) {
+ element.style.cssText = value ? value : '';
+ }
+ }
+ };
+
+ Element._attributeTranslations.has = {};
+
+ $w('colSpan rowSpan vAlign dateTime accessKey tabIndex ' +
+ 'encType maxLength readOnly longDesc frameBorder').each(function(attr) {
+ Element._attributeTranslations.write.names[attr.toLowerCase()] = attr;
+ Element._attributeTranslations.has[attr.toLowerCase()] = attr;
+ });
+
+ (function(v) {
+ Object.extend(v, {
+ href: v._getAttr2,
+ src: v._getAttr2,
+ type: v._getAttr,
+ action: v._getAttrNode,
+ disabled: v._flag,
+ checked: v._flag,
+ readonly: v._flag,
+ multiple: v._flag,
+ onload: v._getEv,
+ onunload: v._getEv,
+ onclick: v._getEv,
+ ondblclick: v._getEv,
+ onmousedown: v._getEv,
+ onmouseup: v._getEv,
+ onmouseover: v._getEv,
+ onmousemove: v._getEv,
+ onmouseout: v._getEv,
+ onfocus: v._getEv,
+ onblur: v._getEv,
+ onkeypress: v._getEv,
+ onkeydown: v._getEv,
+ onkeyup: v._getEv,
+ onsubmit: v._getEv,
+ onreset: v._getEv,
+ onselect: v._getEv,
+ onchange: v._getEv
+ });
+ })(Element._attributeTranslations.read.values);
+
+ if (Prototype.BrowserFeatures.ElementExtensions) {
+ (function() {
+ function _descendants(element) {
+ var nodes = element.getElementsByTagName('*'), results = [];
+ for (var i = 0, node; node = nodes[i]; i++)
+ if (node.tagName !== "!") // Filter out comment nodes.
+ results.push(node);
+ return results;
+ }
+
+ Element.Methods.down = function(element, expression, index) {
+ element = $(element);
+ if (arguments.length == 1) return element.firstDescendant();
+ return Object.isNumber(expression) ? _descendants(element)[expression] :
+ Element.select(element, expression)[index || 0];
+ }
+ })();
+ }
+
+}
+
+else if (Prototype.Browser.Gecko && /rv:1\.8\.0/.test(navigator.userAgent)) {
+ Element.Methods.setOpacity = function(element, value) {
+ element = $(element);
+ element.style.opacity = (value == 1) ? 0.999999 :
+ (value === '') ? '' : (value < 0.00001) ? 0 : value;
+ return element;
+ };
+}
+
+else if (Prototype.Browser.WebKit) {
+ Element.Methods.setOpacity = function(element, value) {
+ element = $(element);
+ element.style.opacity = (value == 1 || value === '') ? '' :
+ (value < 0.00001) ? 0 : value;
+
+ if (value == 1)
+ if (element.tagName.toUpperCase() == 'IMG' && element.width) {
+ element.width++; element.width--;
+ } else try {
+ var n = document.createTextNode(' ');
+ element.appendChild(n);
+ element.removeChild(n);
+ } catch (e) { }
+
+ return element;
+ };
+}
+
+if ('outerHTML' in document.documentElement) {
+ Element.Methods.replace = function(element, content) {
+ element = $(element);
+
+ if (content && content.toElement) content = content.toElement();
+ if (Object.isElement(content)) {
+ element.parentNode.replaceChild(content, element);
+ return element;
+ }
+
+ content = Object.toHTML(content);
+ var parent = element.parentNode, tagName = parent.tagName.toUpperCase();
+
+ if (Element._insertionTranslations.tags[tagName]) {
+ var nextSibling = element.next(),
+ fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts());
+ parent.removeChild(element);
+ if (nextSibling)
+ fragments.each(function(node) { parent.insertBefore(node, nextSibling) });
+ else
+ fragments.each(function(node) { parent.appendChild(node) });
+ }
+ else element.outerHTML = content.stripScripts();
+
+ content.evalScripts.bind(content).defer();
+ return element;
+ };
+}
+
+Element._returnOffset = function(l, t) {
+ var result = [l, t];
+ result.left = l;
+ result.top = t;
+ return result;
+};
+
+Element._getContentFromAnonymousElement = function(tagName, html, force) {
+ var div = new Element('div'),
+ t = Element._insertionTranslations.tags[tagName];
+
+ var workaround = false;
+ if (t) workaround = true;
+ else if (force) {
+ workaround = true;
+ t = ['', '', 0];
+ }
+
+ if (workaround) {
+ div.innerHTML = '&nbsp;' + t[0] + html + t[1];
+ div.removeChild(div.firstChild);
+ for (var i = t[2]; i--; ) {
+ div = div.firstChild;
+ }
+ }
+ else {
+ div.innerHTML = html;
+ }
+ return $A(div.childNodes);
+};
+
+Element._insertionTranslations = {
+ before: function(element, node) {
+ element.parentNode.insertBefore(node, element);
+ },
+ top: function(element, node) {
+ element.insertBefore(node, element.firstChild);
+ },
+ bottom: function(element, node) {
+ element.appendChild(node);
+ },
+ after: function(element, node) {
+ element.parentNode.insertBefore(node, element.nextSibling);
+ },
+ tags: {
+ TABLE: ['<table>', '</table>', 1],
+ TBODY: ['<table><tbody>', '</tbody></table>', 2],
+ TR: ['<table><tbody><tr>', '</tr></tbody></table>', 3],
+ TD: ['<table><tbody><tr><td>', '</td></tr></tbody></table>', 4],
+ SELECT: ['<select>', '</select>', 1]
+ }
+};
+
+(function() {
+ var tags = Element._insertionTranslations.tags;
+ Object.extend(tags, {
+ THEAD: tags.TBODY,
+ TFOOT: tags.TBODY,
+ TH: tags.TD
+ });
+})();
+
+Element.Methods.Simulated = {
+ hasAttribute: function(element, attribute) {
+ attribute = Element._attributeTranslations.has[attribute] || attribute;
+ var node = $(element).getAttributeNode(attribute);
+ return !!(node && node.specified);
+ }
+};
+
+Element.Methods.ByTag = { };
+
+Object.extend(Element, Element.Methods);
+
+(function(div) {
+
+ if (!Prototype.BrowserFeatures.ElementExtensions && div['__proto__']) {
+ window.HTMLElement = { };
+ window.HTMLElement.prototype = div['__proto__'];
+ Prototype.BrowserFeatures.ElementExtensions = true;
+ }
+
+ div = null;
+
+})(document.createElement('div'));
+
+Element.extend = (function() {
+
+ function checkDeficiency(tagName) {
+ if (typeof window.Element != 'undefined') {
+ var proto = window.Element.prototype;
+ if (proto) {
+ var id = '_' + (Math.random()+'').slice(2),
+ el = document.createElement(tagName);
+ proto[id] = 'x';
+ var isBuggy = (el[id] !== 'x');
+ delete proto[id];
+ el = null;
+ return isBuggy;
+ }
+ }
+ return false;
+ }
+
+ function extendElementWith(element, methods) {
+ for (var property in methods) {
+ var value = methods[property];
+ if (Object.isFunction(value) && !(property in element))
+ element[property] = value.methodize();
+ }
+ }
+
+ var HTMLOBJECTELEMENT_PROTOTYPE_BUGGY = checkDeficiency('object');
+
+ if (Prototype.BrowserFeatures.SpecificElementExtensions) {
+ if (HTMLOBJECTELEMENT_PROTOTYPE_BUGGY) {
+ return function(element) {
+ if (element && typeof element._extendedByPrototype == 'undefined') {
+ var t = element.tagName;
+ if (t && (/^(?:object|applet|embed)$/i.test(t))) {
+ extendElementWith(element, Element.Methods);
+ extendElementWith(element, Element.Methods.Simulated);
+ extendElementWith(element, Element.Methods.ByTag[t.toUpperCase()]);
+ }
+ }
+ return element;
+ }
+ }
+ return Prototype.K;
+ }
+
+ var Methods = { }, ByTag = Element.Methods.ByTag;
+
+ var extend = Object.extend(function(element) {
+ if (!element || typeof element._extendedByPrototype != 'undefined' ||
+ element.nodeType != 1 || element == window) return element;
+
+ var methods = Object.clone(Methods),
+ tagName = element.tagName.toUpperCase();
+
+ if (ByTag[tagName]) Object.extend(methods, ByTag[tagName]);
+
+ extendElementWith(element, methods);
+
+ element._extendedByPrototype = Prototype.emptyFunction;
+ return element;
+
+ }, {
+ refresh: function() {
+ if (!Prototype.BrowserFeatures.ElementExtensions) {
+ Object.extend(Methods, Element.Methods);
+ Object.extend(Methods, Element.Methods.Simulated);
+ }
+ }
+ });
+
+ extend.refresh();
+ return extend;
+})();
+
+if (document.documentElement.hasAttribute) {
+ Element.hasAttribute = function(element, attribute) {
+ return element.hasAttribute(attribute);
+ };
+}
+else {
+ Element.hasAttribute = Element.Methods.Simulated.hasAttribute;
+}
+
+Element.addMethods = function(methods) {
+ var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag;
+
+ if (!methods) {
+ Object.extend(Form, Form.Methods);
+ Object.extend(Form.Element, Form.Element.Methods);
+ Object.extend(Element.Methods.ByTag, {
+ "FORM": Object.clone(Form.Methods),
+ "INPUT": Object.clone(Form.Element.Methods),
+ "SELECT": Object.clone(Form.Element.Methods),
+ "TEXTAREA": Object.clone(Form.Element.Methods),
+ "BUTTON": Object.clone(Form.Element.Methods)
+ });
+ }
+
+ if (arguments.length == 2) {
+ var tagName = methods;
+ methods = arguments[1];
+ }
+
+ if (!tagName) Object.extend(Element.Methods, methods || { });
+ else {
+ if (Object.isArray(tagName)) tagName.each(extend);
+ else extend(tagName);
+ }
+
+ function extend(tagName) {
+ tagName = tagName.toUpperCase();
+ if (!Element.Methods.ByTag[tagName])
+ Element.Methods.ByTag[tagName] = { };
+ Object.extend(Element.Methods.ByTag[tagName], methods);
+ }
+
+ function copy(methods, destination, onlyIfAbsent) {
+ onlyIfAbsent = onlyIfAbsent || false;
+ for (var property in methods) {
+ var value = methods[property];
+ if (!Object.isFunction(value)) continue;
+ if (!onlyIfAbsent || !(property in destination))
+ destination[property] = value.methodize();
+ }
+ }
+
+ function findDOMClass(tagName) {
+ var klass;
+ var trans = {
+ "OPTGROUP": "OptGroup", "TEXTAREA": "TextArea", "P": "Paragraph",
+ "FIELDSET": "FieldSet", "UL": "UList", "OL": "OList", "DL": "DList",
+ "DIR": "Directory", "H1": "Heading", "H2": "Heading", "H3": "Heading",
+ "H4": "Heading", "H5": "Heading", "H6": "Heading", "Q": "Quote",
+ "INS": "Mod", "DEL": "Mod", "A": "Anchor", "IMG": "Image", "CAPTION":
+ "TableCaption", "COL": "TableCol", "COLGROUP": "TableCol", "THEAD":
+ "TableSection", "TFOOT": "TableSection", "TBODY": "TableSection", "TR":
+ "TableRow", "TH": "TableCell", "TD": "TableCell", "FRAMESET":
+ "FrameSet", "IFRAME": "IFrame"
+ };
+ if (trans[tagName]) klass = 'HTML' + trans[tagName] + 'Element';
+ if (window[klass]) return window[klass];
+ klass = 'HTML' + tagName + 'Element';
+ if (window[klass]) return window[klass];
+ klass = 'HTML' + tagName.capitalize() + 'Element';
+ if (window[klass]) return window[klass];
+
+ var element = document.createElement(tagName),
+ proto = element['__proto__'] || element.constructor.prototype;
+
+ element = null;
+ return proto;
+ }
+
+ var elementPrototype = window.HTMLElement ? HTMLElement.prototype :
+ Element.prototype;
+
+ if (F.ElementExtensions) {
+ copy(Element.Methods, elementPrototype);
+ copy(Element.Methods.Simulated, elementPrototype, true);
+ }
+
+ if (F.SpecificElementExtensions) {
+ for (var tag in Element.Methods.ByTag) {
+ var klass = findDOMClass(tag);
+ if (Object.isUndefined(klass)) continue;
+ copy(T[tag], klass.prototype);
+ }
+ }
+
+ Object.extend(Element, Element.Methods);
+ delete Element.ByTag;
+
+ if (Element.extend.refresh) Element.extend.refresh();
+ Element.cache = { };
+};
+
+
+document.viewport = {
+
+ getDimensions: function() {
+ return { width: this.getWidth(), height: this.getHeight() };
+ },
+
+ getScrollOffsets: function() {
+ return Element._returnOffset(
+ window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft,
+ window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop);
+ }
+};
+
+(function(viewport) {
+ var B = Prototype.Browser, doc = document, element, property = {};
+
+ function getRootElement() {
+ if (B.WebKit && !doc.evaluate)
+ return document;
+
+ if (B.Opera && window.parseFloat(window.opera.version()) < 9.5)
+ return document.body;
+
+ return document.documentElement;
+ }
+
+ function define(D) {
+ if (!element) element = getRootElement();
+
+ property[D] = 'client' + D;
+
+ viewport['get' + D] = function() { return element[property[D]] };
+ return viewport['get' + D]();
+ }
+
+ viewport.getWidth = define.curry('Width');
+
+ viewport.getHeight = define.curry('Height');
+})(document.viewport);
+
+
+Element.Storage = {
+ UID: 1
+};
+
+Element.addMethods({
+ getStorage: function(element) {
+ if (!(element = $(element))) return;
+
+ var uid;
+ if (element === window) {
+ uid = 0;
+ } else {
+ if (typeof element._prototypeUID === "undefined")
+ element._prototypeUID = Element.Storage.UID++;
+ uid = element._prototypeUID;
+ }
+
+ if (!Element.Storage[uid])
+ Element.Storage[uid] = $H();
+
+ return Element.Storage[uid];
+ },
+
+ store: function(element, key, value) {
+ if (!(element = $(element))) return;
+
+ if (arguments.length === 2) {
+ Element.getStorage(element).update(key);
+ } else {
+ Element.getStorage(element).set(key, value);
+ }
+
+ return element;
+ },
+
+ retrieve: function(element, key, defaultValue) {
+ if (!(element = $(element))) return;
+ var hash = Element.getStorage(element), value = hash.get(key);
+
+ if (Object.isUndefined(value)) {
+ hash.set(key, defaultValue);
+ value = defaultValue;
+ }
+
+ return value;
+ },
+
+ clone: function(element, deep) {
+ if (!(element = $(element))) return;
+ var clone = element.cloneNode(deep);
+ clone._prototypeUID = void 0;
+ if (deep) {
+ var descendants = Element.select(clone, '*'),
+ i = descendants.length;
+ while (i--) {
+ descendants[i]._prototypeUID = void 0;
+ }
+ }
+ return Element.extend(clone);
+ },
+
+ purge: function(element) {
+ if (!(element = $(element))) return;
+ var purgeElement = Element._purgeElement;
+
+ purgeElement(element);
+
+ var descendants = element.getElementsByTagName('*'),
+ i = descendants.length;
+
+ while (i--) purgeElement(descendants[i]);
+
+ return null;
+ }
+});
+
+(function() {
+
+ function toDecimal(pctString) {
+ var match = pctString.match(/^(\d+)%?$/i);
+ if (!match) return null;
+ return (Number(match[1]) / 100);
+ }
+
+ function getPixelValue(value, property, context) {
+ var element = null;
+ if (Object.isElement(value)) {
+ element = value;
+ value = element.getStyle(property);
+ }
+
+ if (value === null) {
+ return null;
+ }
+
+ if ((/^(?:-)?\d+(\.\d+)?(px)?$/i).test(value)) {
+ return window.parseFloat(value);
+ }
+
+ var isPercentage = value.include('%'), isViewport = (context === document.viewport);
+
+ if (/\d/.test(value) && element && element.runtimeStyle && !(isPercentage && isViewport)) {
+ var style = element.style.left, rStyle = element.runtimeStyle.left;
+ element.runtimeStyle.left = element.currentStyle.left;
+ element.style.left = value || 0;
+ value = element.style.pixelLeft;
+ element.style.left = style;
+ element.runtimeStyle.left = rStyle;
+
+ return value;
+ }
+
+ if (element && isPercentage) {
+ context = context || element.parentNode;
+ var decimal = toDecimal(value);
+ var whole = null;
+ var position = element.getStyle('position');
+
+ var isHorizontal = property.include('left') || property.include('right') ||
+ property.include('width');
+
+ var isVertical = property.include('top') || property.include('bottom') ||
+ property.include('height');
+
+ if (context === document.viewport) {
+ if (isHorizontal) {
+ whole = document.viewport.getWidth();
+ } else if (isVertical) {
+ whole = document.viewport.getHeight();
+ }
+ } else {
+ if (isHorizontal) {
+ whole = $(context).measure('width');
+ } else if (isVertical) {
+ whole = $(context).measure('height');
+ }
+ }
+
+ return (whole === null) ? 0 : whole * decimal;
+ }
+
+ return 0;
+ }
+
+ function toCSSPixels(number) {
+ if (Object.isString(number) && number.endsWith('px')) {
+ return number;
+ }
+ return number + 'px';
+ }
+
+ function isDisplayed(element) {
+ var originalElement = element;
+ while (element && element.parentNode) {
+ var display = element.getStyle('display');
+ if (display === 'none') {
+ return false;
+ }
+ element = $(element.parentNode);
+ }
+ return true;
+ }
+
+ var hasLayout = Prototype.K;
+ if ('currentStyle' in document.documentElement) {
+ hasLayout = function(element) {
+ if (!element.currentStyle.hasLayout) {
+ element.style.zoom = 1;
+ }
+ return element;
+ };
+ }
+
+ function cssNameFor(key) {
+ if (key.include('border')) key = key + '-width';
+ return key.camelize();
+ }
+
+ Element.Layout = Class.create(Hash, {
+ initialize: function($super, element, preCompute) {
+ $super();
+ this.element = $(element);
+
+ Element.Layout.PROPERTIES.each( function(property) {
+ this._set(property, null);
+ }, this);
+
+ if (preCompute) {
+ this._preComputing = true;
+ this._begin();
+ Element.Layout.PROPERTIES.each( this._compute, this );
+ this._end();
+ this._preComputing = false;
+ }
+ },
+
+ _set: function(property, value) {
+ return Hash.prototype.set.call(this, property, value);
+ },
+
+ set: function(property, value) {
+ throw "Properties of Element.Layout are read-only.";
+ },
+
+ get: function($super, property) {
+ var value = $super(property);
+ return value === null ? this._compute(property) : value;
+ },
+
+ _begin: function() {
+ if (this._prepared) return;
+
+ var element = this.element;
+ if (isDisplayed(element)) {
+ this._prepared = true;
+ return;
+ }
+
+ var originalStyles = {
+ position: element.style.position || '',
+ width: element.style.width || '',
+ visibility: element.style.visibility || '',
+ display: element.style.display || ''
+ };
+
+ element.store('prototype_original_styles', originalStyles);
+
+ var position = element.getStyle('position'),
+ width = element.getStyle('width');
+
+ if (width === "0px" || width === null) {
+ element.style.display = 'block';
+ width = element.getStyle('width');
+ }
+
+ var context = (position === 'fixed') ? document.viewport :
+ element.parentNode;
+
+ element.setStyle({
+ position: 'absolute',
+ visibility: 'hidden',
+ display: 'block'
+ });
+
+ var positionedWidth = element.getStyle('width');
+
+ var newWidth;
+ if (width && (positionedWidth === width)) {
+ newWidth = getPixelValue(element, 'width', context);
+ } else if (position === 'absolute' || position === 'fixed') {
+ newWidth = getPixelValue(element, 'width', context);
+ } else {
+ var parent = element.parentNode, pLayout = $(parent).getLayout();
+
+ newWidth = pLayout.get('width') -
+ this.get('margin-left') -
+ this.get('border-left') -
+ this.get('padding-left') -
+ this.get('padding-right') -
+ this.get('border-right') -
+ this.get('margin-right');
+ }
+
+ element.setStyle({ width: newWidth + 'px' });
+
+ this._prepared = true;
+ },
+
+ _end: function() {
+ var element = this.element;
+ var originalStyles = element.retrieve('prototype_original_styles');
+ element.store('prototype_original_styles', null);
+ element.setStyle(originalStyles);
+ this._prepared = false;
+ },
+
+ _compute: function(property) {
+ var COMPUTATIONS = Element.Layout.COMPUTATIONS;
+ if (!(property in COMPUTATIONS)) {
+ throw "Property not found.";
+ }
+
+ return this._set(property, COMPUTATIONS[property].call(this, this.element));
+ },
+
+ toObject: function() {
+ var args = $A(arguments);
+ var keys = (args.length === 0) ? Element.Layout.PROPERTIES :
+ args.join(' ').split(' ');
+ var obj = {};
+ keys.each( function(key) {
+ if (!Element.Layout.PROPERTIES.include(key)) return;
+ var value = this.get(key);
+ if (value != null) obj[key] = value;
+ }, this);
+ return obj;
+ },
+
+ toHash: function() {
+ var obj = this.toObject.apply(this, arguments);
+ return new Hash(obj);
+ },
+
+ toCSS: function() {
+ var args = $A(arguments);
+ var keys = (args.length === 0) ? Element.Layout.PROPERTIES :
+ args.join(' ').split(' ');
+ var css = {};
+
+ keys.each( function(key) {
+ if (!Element.Layout.PROPERTIES.include(key)) return;
+ if (Element.Layout.COMPOSITE_PROPERTIES.include(key)) return;
+
+ var value = this.get(key);
+ if (value != null) css[cssNameFor(key)] = value + 'px';
+ }, this);
+ return css;
+ },
+
+ inspect: function() {
+ return "#<Element.Layout>";
+ }
+ });
+
+ Object.extend(Element.Layout, {
+ PROPERTIES: $w('height width top left right bottom border-left border-right border-top border-bottom padding-left padding-right padding-top padding-bottom margin-top margin-bottom margin-left margin-right padding-box-width padding-box-height border-box-width border-box-height margin-box-width margin-box-height'),
+
+ COMPOSITE_PROPERTIES: $w('padding-box-width padding-box-height margin-box-width margin-box-height border-box-width border-box-height'),
+
+ COMPUTATIONS: {
+ 'height': function(element) {
+ if (!this._preComputing) this._begin();
+
+ var bHeight = this.get('border-box-height');
+ if (bHeight <= 0) {
+ if (!this._preComputing) this._end();
+ return 0;
+ }
+
+ var bTop = this.get('border-top'),
+ bBottom = this.get('border-bottom');
+
+ var pTop = this.get('padding-top'),
+ pBottom = this.get('padding-bottom');
+
+ if (!this._preComputing) this._end();
+
+ return bHeight - bTop - bBottom - pTop - pBottom;
+ },
+
+ 'width': function(element) {
+ if (!this._preComputing) this._begin();
+
+ var bWidth = this.get('border-box-width');
+ if (bWidth <= 0) {
+ if (!this._preComputing) this._end();
+ return 0;
+ }
+
+ var bLeft = this.get('border-left'),
+ bRight = this.get('border-right');
+
+ var pLeft = this.get('padding-left'),
+ pRight = this.get('padding-right');
+
+ if (!this._preComputing) this._end();
+
+ return bWidth - bLeft - bRight - pLeft - pRight;
+ },
+
+ 'padding-box-height': function(element) {
+ var height = this.get('height'),
+ pTop = this.get('padding-top'),
+ pBottom = this.get('padding-bottom');
+
+ return height + pTop + pBottom;
+ },
+
+ 'padding-box-width': function(element) {
+ var width = this.get('width'),
+ pLeft = this.get('padding-left'),
+ pRight = this.get('padding-right');
+
+ return width + pLeft + pRight;
+ },
+
+ 'border-box-height': function(element) {
+ if (!this._preComputing) this._begin();
+ var height = element.offsetHeight;
+ if (!this._preComputing) this._end();
+ return height;
+ },
+
+ 'border-box-width': function(element) {
+ if (!this._preComputing) this._begin();
+ var width = element.offsetWidth;
+ if (!this._preComputing) this._end();
+ return width;
+ },
+
+ 'margin-box-height': function(element) {
+ var bHeight = this.get('border-box-height'),
+ mTop = this.get('margin-top'),
+ mBottom = this.get('margin-bottom');
+
+ if (bHeight <= 0) return 0;
+
+ return bHeight + mTop + mBottom;
+ },
+
+ 'margin-box-width': function(element) {
+ var bWidth = this.get('border-box-width'),
+ mLeft = this.get('margin-left'),
+ mRight = this.get('margin-right');
+
+ if (bWidth <= 0) return 0;
+
+ return bWidth + mLeft + mRight;
+ },
+
+ 'top': function(element) {
+ var offset = element.positionedOffset();
+ return offset.top;
+ },
+
+ 'bottom': function(element) {
+ var offset = element.positionedOffset(),
+ parent = element.getOffsetParent(),
+ pHeight = parent.measure('height');
+
+ var mHeight = this.get('border-box-height');
+
+ return pHeight - mHeight - offset.top;
+ },
+
+ 'left': function(element) {
+ var offset = element.positionedOffset();
+ return offset.left;
+ },
+
+ 'right': function(element) {
+ var offset = element.positionedOffset(),
+ parent = element.getOffsetParent(),
+ pWidth = parent.measure('width');
+
+ var mWidth = this.get('border-box-width');
+
+ return pWidth - mWidth - offset.left;
+ },
+
+ 'padding-top': function(element) {
+ return getPixelValue(element, 'paddingTop');
+ },
+
+ 'padding-bottom': function(element) {
+ return getPixelValue(element, 'paddingBottom');
+ },
+
+ 'padding-left': function(element) {
+ return getPixelValue(element, 'paddingLeft');
+ },
+
+ 'padding-right': function(element) {
+ return getPixelValue(element, 'paddingRight');
+ },
+
+ 'border-top': function(element) {
+ return getPixelValue(element, 'borderTopWidth');
+ },
+
+ 'border-bottom': function(element) {
+ return getPixelValue(element, 'borderBottomWidth');
+ },
+
+ 'border-left': function(element) {
+ return getPixelValue(element, 'borderLeftWidth');
+ },
+
+ 'border-right': function(element) {
+ return getPixelValue(element, 'borderRightWidth');
+ },
+
+ 'margin-top': function(element) {
+ return getPixelValue(element, 'marginTop');
+ },
+
+ 'margin-bottom': function(element) {
+ return getPixelValue(element, 'marginBottom');
+ },
+
+ 'margin-left': function(element) {
+ return getPixelValue(element, 'marginLeft');
+ },
+
+ 'margin-right': function(element) {
+ return getPixelValue(element, 'marginRight');
+ }
+ }
+ });
+
+ if ('getBoundingClientRect' in document.documentElement) {
+ Object.extend(Element.Layout.COMPUTATIONS, {
+ 'right': function(element) {
+ var parent = hasLayout(element.getOffsetParent());
+ var rect = element.getBoundingClientRect(),
+ pRect = parent.getBoundingClientRect();
+
+ return (pRect.right - rect.right).round();
+ },
+
+ 'bottom': function(element) {
+ var parent = hasLayout(element.getOffsetParent());
+ var rect = element.getBoundingClientRect(),
+ pRect = parent.getBoundingClientRect();
+
+ return (pRect.bottom - rect.bottom).round();
+ }
+ });
+ }
+
+ Element.Offset = Class.create({
+ initialize: function(left, top) {
+ this.left = left.round();
+ this.top = top.round();
+
+ this[0] = this.left;
+ this[1] = this.top;
+ },
+
+ relativeTo: function(offset) {
+ return new Element.Offset(
+ this.left - offset.left,
+ this.top - offset.top
+ );
+ },
+
+ inspect: function() {
+ return "#<Element.Offset left: #{left} top: #{top}>".interpolate(this);
+ },
+
+ toString: function() {
+ return "[#{left}, #{top}]".interpolate(this);
+ },
+
+ toArray: function() {
+ return [this.left, this.top];
+ }
+ });
+
+ function getLayout(element, preCompute) {
+ return new Element.Layout(element, preCompute);
+ }
+
+ function measure(element, property) {
+ return $(element).getLayout().get(property);
+ }
+
+ function getDimensions(element) {
+ element = $(element);
+ var display = Element.getStyle(element, 'display');
+
+ if (display && display !== 'none') {
+ return { width: element.offsetWidth, height: element.offsetHeight };
+ }
+
+ var style = element.style;
+ var originalStyles = {
+ visibility: style.visibility,
+ position: style.position,
+ display: style.display
+ };
+
+ var newStyles = {
+ visibility: 'hidden',
+ display: 'block'
+ };
+
+ if (originalStyles.position !== 'fixed')
+ newStyles.position = 'absolute';
+
+ Element.setStyle(element, newStyles);
+
+ var dimensions = {
+ width: element.offsetWidth,
+ height: element.offsetHeight
+ };
+
+ Element.setStyle(element, originalStyles);
+
+ return dimensions;
+ }
+
+ function getOffsetParent(element) {
+ element = $(element);
+
+ if (isDocument(element) || isDetached(element) || isBody(element) || isHtml(element))
+ return $(document.body);
+
+ var isInline = (Element.getStyle(element, 'display') === 'inline');
+ if (!isInline && element.offsetParent) return $(element.offsetParent);
+
+ while ((element = element.parentNode) && element !== document.body) {
+ if (Element.getStyle(element, 'position') !== 'static') {
+ return isHtml(element) ? $(document.body) : $(element);
+ }
+ }
+
+ return $(document.body);
+ }
+
+
+ function cumulativeOffset(element) {
+ element = $(element);
+ var valueT = 0, valueL = 0;
+ if (element.parentNode) {
+ do {
+ valueT += element.offsetTop || 0;
+ valueL += element.offsetLeft || 0;
+ element = element.offsetParent;
+ } while (element);
+ }
+ return new Element.Offset(valueL, valueT);
+ }
+
+ function positionedOffset(element) {
+ element = $(element);
+
+ var layout = element.getLayout();
+
+ var valueT = 0, valueL = 0;
+ do {
+ valueT += element.offsetTop || 0;
+ valueL += element.offsetLeft || 0;
+ element = element.offsetParent;
+ if (element) {
+ if (isBody(element)) break;
+ var p = Element.getStyle(element, 'position');
+ if (p !== 'static') break;
+ }
+ } while (element);
+
+ valueL -= layout.get('margin-top');
+ valueT -= layout.get('margin-left');
+
+ return new Element.Offset(valueL, valueT);
+ }
+
+ function cumulativeScrollOffset(element) {
+ var valueT = 0, valueL = 0;
+ do {
+ valueT += element.scrollTop || 0;
+ valueL += element.scrollLeft || 0;
+ element = element.parentNode;
+ } while (element);
+ return new Element.Offset(valueL, valueT);
+ }
+
+ function viewportOffset(forElement) {
+ element = $(element);
+ var valueT = 0, valueL = 0, docBody = document.body;
+
+ var element = forElement;
+ do {
+ valueT += element.offsetTop || 0;
+ valueL += element.offsetLeft || 0;
+ if (element.offsetParent == docBody &&
+ Element.getStyle(element, 'position') == 'absolute') break;
+ } while (element = element.offsetParent);
+
+ element = forElement;
+ do {
+ if (element != docBody) {
+ valueT -= element.scrollTop || 0;
+ valueL -= element.scrollLeft || 0;
+ }
+ } while (element = element.parentNode);
+ return new Element.Offset(valueL, valueT);
+ }
+
+ function absolutize(element) {
+ element = $(element);
+
+ if (Element.getStyle(element, 'position') === 'absolute') {
+ return element;
+ }
+
+ var offsetParent = getOffsetParent(element);
+ var eOffset = element.viewportOffset(),
+ pOffset = offsetParent.viewportOffset();
+
+ var offset = eOffset.relativeTo(pOffset);
+ var layout = element.getLayout();
+
+ element.store('prototype_absolutize_original_styles', {
+ left: element.getStyle('left'),
+ top: element.getStyle('top'),
+ width: element.getStyle('width'),
+ height: element.getStyle('height')
+ });
+
+ element.setStyle({
+ position: 'absolute',
+ top: offset.top + 'px',
+ left: offset.left + 'px',
+ width: layout.get('width') + 'px',
+ height: layout.get('height') + 'px'
+ });
+
+ return element;
+ }
+
+ function relativize(element) {
+ element = $(element);
+ if (Element.getStyle(element, 'position') === 'relative') {
+ return element;
+ }
+
+ var originalStyles =
+ element.retrieve('prototype_absolutize_original_styles');
+
+ if (originalStyles) element.setStyle(originalStyles);
+ return element;
+ }
+
+ if (Prototype.Browser.IE) {
+ getOffsetParent = getOffsetParent.wrap(
+ function(proceed, element) {
+ element = $(element);
+
+ if (isDocument(element) || isDetached(element) || isBody(element) || isHtml(element))
+ return $(document.body);
+
+ var position = element.getStyle('position');
+ if (position !== 'static') return proceed(element);
+
+ element.setStyle({ position: 'relative' });
+ var value = proceed(element);
+ element.setStyle({ position: position });
+ return value;
+ }
+ );
+
+ positionedOffset = positionedOffset.wrap(function(proceed, element) {
+ element = $(element);
+ if (!element.parentNode) return new Element.Offset(0, 0);
+ var position = element.getStyle('position');
+ if (position !== 'static') return proceed(element);
+
+ var offsetParent = element.getOffsetParent();
+ if (offsetParent && offsetParent.getStyle('position') === 'fixed')
+ hasLayout(offsetParent);
+
+ element.setStyle({ position: 'relative' });
+ var value = proceed(element);
+ element.setStyle({ position: position });
+ return value;
+ });
+ } else if (Prototype.Browser.Webkit) {
+ cumulativeOffset = function(element) {
+ element = $(element);
+ var valueT = 0, valueL = 0;
+ do {
+ valueT += element.offsetTop || 0;
+ valueL += element.offsetLeft || 0;
+ if (element.offsetParent == document.body)
+ if (Element.getStyle(element, 'position') == 'absolute') break;
+
+ element = element.offsetParent;
+ } while (element);
+
+ return new Element.Offset(valueL, valueT);
+ };
+ }
+
+
+ Element.addMethods({
+ getLayout: getLayout,
+ measure: measure,
+ getDimensions: getDimensions,
+ getOffsetParent: getOffsetParent,
+ cumulativeOffset: cumulativeOffset,
+ positionedOffset: positionedOffset,
+ cumulativeScrollOffset: cumulativeScrollOffset,
+ viewportOffset: viewportOffset,
+ absolutize: absolutize,
+ relativize: relativize
+ });
+
+ function isBody(element) {
+ return element.nodeName.toUpperCase() === 'BODY';
+ }
+
+ function isHtml(element) {
+ return element.nodeName.toUpperCase() === 'HTML';
+ }
+
+ function isDocument(element) {
+ return element.nodeType === Node.DOCUMENT_NODE;
+ }
+
+ function isDetached(element) {
+ return element !== document.body &&
+ !Element.descendantOf(element, document.body);
+ }
+
+ if ('getBoundingClientRect' in document.documentElement) {
+ Element.addMethods({
+ viewportOffset: function(element) {
+ element = $(element);
+ if (isDetached(element)) return new Element.Offset(0, 0);
+
+ var rect = element.getBoundingClientRect(),
+ docEl = document.documentElement;
+ return new Element.Offset(rect.left - docEl.clientLeft,
+ rect.top - docEl.clientTop);
+ }
+ });
+ }
+})();
+window.$$ = function() {
+ var expression = $A(arguments).join(', ');
+ return Prototype.Selector.select(expression, document);
+};
+
+Prototype.Selector = (function() {
+
+ function select() {
+ throw new Error('Method "Prototype.Selector.select" must be defined.');
+ }
+
+ function match() {
+ throw new Error('Method "Prototype.Selector.match" must be defined.');
+ }
+
+ function find(elements, expression, index) {
+ index = index || 0;
+ var match = Prototype.Selector.match, length = elements.length, matchIndex = 0, i;
+
+ for (i = 0; i < length; i++) {
+ if (match(elements[i], expression) && index == matchIndex++) {
+ return Element.extend(elements[i]);
+ }
+ }
+ }
+
+ function extendElements(elements) {
+ for (var i = 0, length = elements.length; i < length; i++) {
+ Element.extend(elements[i]);
+ }
+ return elements;
+ }
+
+
+ var K = Prototype.K;
+
+ return {
+ select: select,
+ match: match,
+ find: find,
+ extendElements: (Element.extend === K) ? K : extendElements,
+ extendElement: Element.extend
+ };
+})();
+/*!
+ * Sizzle CSS Selector Engine - v1.0
+ * Copyright 2009, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ * More information: http://sizzlejs.com/
+ */
+(function(){
+
+var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
+ done = 0,
+ toString = Object.prototype.toString,
+ hasDuplicate = false,
+ baseHasDuplicate = true;
+
+[0, 0].sort(function(){
+ baseHasDuplicate = false;
+ return 0;
+});
+
+var Sizzle = function(selector, context, results, seed) {
+ results = results || [];
+ var origContext = context = context || document;
+
+ if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
+ return [];
+ }
+
+ if ( !selector || typeof selector !== "string" ) {
+ return results;
+ }
+
+ var parts = [], m, set, checkSet, check, mode, extra, prune = true, contextXML = isXML(context),
+ soFar = selector;
+
+ while ( (chunker.exec(""), m = chunker.exec(soFar)) !== null ) {
+ soFar = m[3];
+
+ parts.push( m[1] );
+
+ if ( m[2] ) {
+ extra = m[3];
+ break;
+ }
+ }
+
+ if ( parts.length > 1 && origPOS.exec( selector ) ) {
+ if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
+ set = posProcess( parts[0] + parts[1], context );
+ } else {
+ set = Expr.relative[ parts[0] ] ?
+ [ context ] :
+ Sizzle( parts.shift(), context );
+
+ while ( parts.length ) {
+ selector = parts.shift();
+
+ if ( Expr.relative[ selector ] )
+ selector += parts.shift();
+
+ set = posProcess( selector, set );
+ }
+ }
+ } else {
+ if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
+ Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
+ var ret = Sizzle.find( parts.shift(), context, contextXML );
+ context = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0];
+ }
+
+ if ( context ) {
+ var ret = seed ?
+ { expr: parts.pop(), set: makeArray(seed) } :
+ Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
+ set = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set;
+
+ if ( parts.length > 0 ) {
+ checkSet = makeArray(set);
+ } else {
+ prune = false;
+ }
+
+ while ( parts.length ) {
+ var cur = parts.pop(), pop = cur;
+
+ if ( !Expr.relative[ cur ] ) {
+ cur = "";
+ } else {
+ pop = parts.pop();
+ }
+
+ if ( pop == null ) {
+ pop = context;
+ }
+
+ Expr.relative[ cur ]( checkSet, pop, contextXML );
+ }
+ } else {
+ checkSet = parts = [];
+ }
+ }
+
+ if ( !checkSet ) {
+ checkSet = set;
+ }
+
+ if ( !checkSet ) {
+ throw "Syntax error, unrecognized expression: " + (cur || selector);
+ }
+
+ if ( toString.call(checkSet) === "[object Array]" ) {
+ if ( !prune ) {
+ results.push.apply( results, checkSet );
+ } else if ( context && context.nodeType === 1 ) {
+ for ( var i = 0; checkSet[i] != null; i++ ) {
+ if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) {
+ results.push( set[i] );
+ }
+ }
+ } else {
+ for ( var i = 0; checkSet[i] != null; i++ ) {
+ if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
+ results.push( set[i] );
+ }
+ }
+ }
+ } else {
+ makeArray( checkSet, results );
+ }
+
+ if ( extra ) {
+ Sizzle( extra, origContext, results, seed );
+ Sizzle.uniqueSort( results );
+ }
+
+ return results;
+};
+
+Sizzle.uniqueSort = function(results){
+ if ( sortOrder ) {
+ hasDuplicate = baseHasDuplicate;
+ results.sort(sortOrder);
+
+ if ( hasDuplicate ) {
+ for ( var i = 1; i < results.length; i++ ) {
+ if ( results[i] === results[i-1] ) {
+ results.splice(i--, 1);
+ }
+ }
+ }
+ }
+
+ return results;
+};
+
+Sizzle.matches = function(expr, set){
+ return Sizzle(expr, null, null, set);
+};
+
+Sizzle.find = function(expr, context, isXML){
+ var set, match;
+
+ if ( !expr ) {
+ return [];
+ }
+
+ for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
+ var type = Expr.order[i], match;
+
+ if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
+ var left = match[1];
+ match.splice(1,1);
+
+ if ( left.substr( left.length - 1 ) !== "\\" ) {
+ match[1] = (match[1] || "").replace(/\\/g, "");
+ set = Expr.find[ type ]( match, context, isXML );
+ if ( set != null ) {
+ expr = expr.replace( Expr.match[ type ], "" );
+ break;
+ }
+ }
+ }
+ }
+
+ if ( !set ) {
+ set = context.getElementsByTagName("*");
+ }
+
+ return {set: set, expr: expr};
+};
+
+Sizzle.filter = function(expr, set, inplace, not){
+ var old = expr, result = [], curLoop = set, match, anyFound,
+ isXMLFilter = set && set[0] && isXML(set[0]);
+
+ while ( expr && set.length ) {
+ for ( var type in Expr.filter ) {
+ if ( (match = Expr.match[ type ].exec( expr )) != null ) {
+ var filter = Expr.filter[ type ], found, item;
+ anyFound = false;
+
+ if ( curLoop == result ) {
+ result = [];
+ }
+
+ if ( Expr.preFilter[ type ] ) {
+ match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
+
+ if ( !match ) {
+ anyFound = found = true;
+ } else if ( match === true ) {
+ continue;
+ }
+ }
+
+ if ( match ) {
+ for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
+ if ( item ) {
+ found = filter( item, match, i, curLoop );
+ var pass = not ^ !!found;
+
+ if ( inplace && found != null ) {
+ if ( pass ) {
+ anyFound = true;
+ } else {
+ curLoop[i] = false;
+ }
+ } else if ( pass ) {
+ result.push( item );
+ anyFound = true;
+ }
+ }
+ }
+ }
+
+ if ( found !== undefined ) {
+ if ( !inplace ) {
+ curLoop = result;
+ }
+
+ expr = expr.replace( Expr.match[ type ], "" );
+
+ if ( !anyFound ) {
+ return [];
+ }
+
+ break;
+ }
+ }
+ }
+
+ if ( expr == old ) {
+ if ( anyFound == null ) {
+ throw "Syntax error, unrecognized expression: " + expr;
+ } else {
+ break;
+ }
+ }
+
+ old = expr;
+ }
+
+ return curLoop;
+};
+
+var Expr = Sizzle.selectors = {
+ order: [ "ID", "NAME", "TAG" ],
+ match: {
+ ID: /#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
+ CLASS: /\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
+ NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,
+ ATTR: /\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,
+ TAG: /^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,
+ CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,
+ POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,
+ PSEUDO: /:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/
+ },
+ leftMatch: {},
+ attrMap: {
+ "class": "className",
+ "for": "htmlFor"
+ },
+ attrHandle: {
+ href: function(elem){
+ return elem.getAttribute("href");
+ }
+ },
+ relative: {
+ "+": function(checkSet, part, isXML){
+ var isPartStr = typeof part === "string",
+ isTag = isPartStr && !/\W/.test(part),
+ isPartStrNotTag = isPartStr && !isTag;
+
+ if ( isTag && !isXML ) {
+ part = part.toUpperCase();
+ }
+
+ for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
+ if ( (elem = checkSet[i]) ) {
+ while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
+
+ checkSet[i] = isPartStrNotTag || elem && elem.nodeName === part ?
+ elem || false :
+ elem === part;
+ }
+ }
+
+ if ( isPartStrNotTag ) {
+ Sizzle.filter( part, checkSet, true );
+ }
+ },
+ ">": function(checkSet, part, isXML){
+ var isPartStr = typeof part === "string";
+
+ if ( isPartStr && !/\W/.test(part) ) {
+ part = isXML ? part : part.toUpperCase();
+
+ for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+ var elem = checkSet[i];
+ if ( elem ) {
+ var parent = elem.parentNode;
+ checkSet[i] = parent.nodeName === part ? parent : false;
+ }
+ }
+ } else {
+ for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+ var elem = checkSet[i];
+ if ( elem ) {
+ checkSet[i] = isPartStr ?
+ elem.parentNode :
+ elem.parentNode === part;
+ }
+ }
+
+ if ( isPartStr ) {
+ Sizzle.filter( part, checkSet, true );
+ }
+ }
+ },
+ "": function(checkSet, part, isXML){
+ var doneName = done++, checkFn = dirCheck;
+
+ if ( !/\W/.test(part) ) {
+ var nodeCheck = part = isXML ? part : part.toUpperCase();
+ checkFn = dirNodeCheck;
+ }
+
+ checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML);
+ },
+ "~": function(checkSet, part, isXML){
+ var doneName = done++, checkFn = dirCheck;
+
+ if ( typeof part === "string" && !/\W/.test(part) ) {
+ var nodeCheck = part = isXML ? part : part.toUpperCase();
+ checkFn = dirNodeCheck;
+ }
+
+ checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML);
+ }
+ },
+ find: {
+ ID: function(match, context, isXML){
+ if ( typeof context.getElementById !== "undefined" && !isXML ) {
+ var m = context.getElementById(match[1]);
+ return m ? [m] : [];
+ }
+ },
+ NAME: function(match, context, isXML){
+ if ( typeof context.getElementsByName !== "undefined" ) {
+ var ret = [], results = context.getElementsByName(match[1]);
+
+ for ( var i = 0, l = results.length; i < l; i++ ) {
+ if ( results[i].getAttribute("name") === match[1] ) {
+ ret.push( results[i] );
+ }
+ }
+
+ return ret.length === 0 ? null : ret;
+ }
+ },
+ TAG: function(match, context){
+ return context.getElementsByTagName(match[1]);
+ }
+ },
+ preFilter: {
+ CLASS: function(match, curLoop, inplace, result, not, isXML){
+ match = " " + match[1].replace(/\\/g, "") + " ";
+
+ if ( isXML ) {
+ return match;
+ }
+
+ for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
+ if ( elem ) {
+ if ( not ^ (elem.className && (" " + elem.className + " ").indexOf(match) >= 0) ) {
+ if ( !inplace )
+ result.push( elem );
+ } else if ( inplace ) {
+ curLoop[i] = false;
+ }
+ }
+ }
+
+ return false;
+ },
+ ID: function(match){
+ return match[1].replace(/\\/g, "");
+ },
+ TAG: function(match, curLoop){
+ for ( var i = 0; curLoop[i] === false; i++ ){}
+ return curLoop[i] && isXML(curLoop[i]) ? match[1] : match[1].toUpperCase();
+ },
+ CHILD: function(match){
+ if ( match[1] == "nth" ) {
+ var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
+ match[2] == "even" && "2n" || match[2] == "odd" && "2n+1" ||
+ !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
+
+ match[2] = (test[1] + (test[2] || 1)) - 0;
+ match[3] = test[3] - 0;
+ }
+
+ match[0] = done++;
+
+ return match;
+ },
+ ATTR: function(match, curLoop, inplace, result, not, isXML){
+ var name = match[1].replace(/\\/g, "");
+
+ if ( !isXML && Expr.attrMap[name] ) {
+ match[1] = Expr.attrMap[name];
+ }
+
+ if ( match[2] === "~=" ) {
+ match[4] = " " + match[4] + " ";
+ }
+
+ return match;
+ },
+ PSEUDO: function(match, curLoop, inplace, result, not){
+ if ( match[1] === "not" ) {
+ if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
+ match[3] = Sizzle(match[3], null, null, curLoop);
+ } else {
+ var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
+ if ( !inplace ) {
+ result.push.apply( result, ret );
+ }
+ return false;
+ }
+ } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
+ return true;
+ }
+
+ return match;
+ },
+ POS: function(match){
+ match.unshift( true );
+ return match;
+ }
+ },
+ filters: {
+ enabled: function(elem){
+ return elem.disabled === false && elem.type !== "hidden";
+ },
+ disabled: function(elem){
+ return elem.disabled === true;
+ },
+ checked: function(elem){
+ return elem.checked === true;
+ },
+ selected: function(elem){
+ elem.parentNode.selectedIndex;
+ return elem.selected === true;
+ },
+ parent: function(elem){
+ return !!elem.firstChild;
+ },
+ empty: function(elem){
+ return !elem.firstChild;
+ },
+ has: function(elem, i, match){
+ return !!Sizzle( match[3], elem ).length;
+ },
+ header: function(elem){
+ return /h\d/i.test( elem.nodeName );
+ },
+ text: function(elem){
+ return "text" === elem.type;
+ },
+ radio: function(elem){
+ return "radio" === elem.type;
+ },
+ checkbox: function(elem){
+ return "checkbox" === elem.type;
+ },
+ file: function(elem){
+ return "file" === elem.type;
+ },
+ password: function(elem){
+ return "password" === elem.type;
+ },
+ submit: function(elem){
+ return "submit" === elem.type;
+ },
+ image: function(elem){
+ return "image" === elem.type;
+ },
+ reset: function(elem){
+ return "reset" === elem.type;
+ },
+ button: function(elem){
+ return "button" === elem.type || elem.nodeName.toUpperCase() === "BUTTON";
+ },
+ input: function(elem){
+ return /input|select|textarea|button/i.test(elem.nodeName);
+ }
+ },
+ setFilters: {
+ first: function(elem, i){
+ return i === 0;
+ },
+ last: function(elem, i, match, array){
+ return i === array.length - 1;
+ },
+ even: function(elem, i){
+ return i % 2 === 0;
+ },
+ odd: function(elem, i){
+ return i % 2 === 1;
+ },
+ lt: function(elem, i, match){
+ return i < match[3] - 0;
+ },
+ gt: function(elem, i, match){
+ return i > match[3] - 0;
+ },
+ nth: function(elem, i, match){
+ return match[3] - 0 == i;
+ },
+ eq: function(elem, i, match){
+ return match[3] - 0 == i;
+ }
+ },
+ filter: {
+ PSEUDO: function(elem, match, i, array){
+ var name = match[1], filter = Expr.filters[ name ];
+
+ if ( filter ) {
+ return filter( elem, i, match, array );
+ } else if ( name === "contains" ) {
+ return (elem.textContent || elem.innerText || "").indexOf(match[3]) >= 0;
+ } else if ( name === "not" ) {
+ var not = match[3];
+
+ for ( var i = 0, l = not.length; i < l; i++ ) {
+ if ( not[i] === elem ) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+ },
+ CHILD: function(elem, match){
+ var type = match[1], node = elem;
+ switch (type) {
+ case 'only':
+ case 'first':
+ while ( (node = node.previousSibling) ) {
+ if ( node.nodeType === 1 ) return false;
+ }
+ if ( type == 'first') return true;
+ node = elem;
+ case 'last':
+ while ( (node = node.nextSibling) ) {
+ if ( node.nodeType === 1 ) return false;
+ }
+ return true;
+ case 'nth':
+ var first = match[2], last = match[3];
+
+ if ( first == 1 && last == 0 ) {
+ return true;
+ }
+
+ var doneName = match[0],
+ parent = elem.parentNode;
+
+ if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
+ var count = 0;
+ for ( node = parent.firstChild; node; node = node.nextSibling ) {
+ if ( node.nodeType === 1 ) {
+ node.nodeIndex = ++count;
+ }
+ }
+ parent.sizcache = doneName;
+ }
+
+ var diff = elem.nodeIndex - last;
+ if ( first == 0 ) {
+ return diff == 0;
+ } else {
+ return ( diff % first == 0 && diff / first >= 0 );
+ }
+ }
+ },
+ ID: function(elem, match){
+ return elem.nodeType === 1 && elem.getAttribute("id") === match;
+ },
+ TAG: function(elem, match){
+ return (match === "*" && elem.nodeType === 1) || elem.nodeName === match;
+ },
+ CLASS: function(elem, match){
+ return (" " + (elem.className || elem.getAttribute("class")) + " ")
+ .indexOf( match ) > -1;
+ },
+ ATTR: function(elem, match){
+ var name = match[1],
+ result = Expr.attrHandle[ name ] ?
+ Expr.attrHandle[ name ]( elem ) :
+ elem[ name ] != null ?
+ elem[ name ] :
+ elem.getAttribute( name ),
+ value = result + "",
+ type = match[2],
+ check = match[4];
+
+ return result == null ?
+ type === "!=" :
+ type === "=" ?
+ value === check :
+ type === "*=" ?
+ value.indexOf(check) >= 0 :
+ type === "~=" ?
+ (" " + value + " ").indexOf(check) >= 0 :
+ !check ?
+ value && result !== false :
+ type === "!=" ?
+ value != check :
+ type === "^=" ?
+ value.indexOf(check) === 0 :
+ type === "$=" ?
+ value.substr(value.length - check.length) === check :
+ type === "|=" ?
+ value === check || value.substr(0, check.length + 1) === check + "-" :
+ false;
+ },
+ POS: function(elem, match, i, array){
+ var name = match[2], filter = Expr.setFilters[ name ];
+
+ if ( filter ) {
+ return filter( elem, i, match, array );
+ }
+ }
+ }
+};
+
+var origPOS = Expr.match.POS;
+
+for ( var type in Expr.match ) {
+ Expr.match[ type ] = new RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source );
+ Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source );
+}
+
+var makeArray = function(array, results) {
+ array = Array.prototype.slice.call( array, 0 );
+
+ if ( results ) {
+ results.push.apply( results, array );
+ return results;
+ }
+
+ return array;
+};
+
+try {
+ Array.prototype.slice.call( document.documentElement.childNodes, 0 );
+
+} catch(e){
+ makeArray = function(array, results) {
+ var ret = results || [];
+
+ if ( toString.call(array) === "[object Array]" ) {
+ Array.prototype.push.apply( ret, array );
+ } else {
+ if ( typeof array.length === "number" ) {
+ for ( var i = 0, l = array.length; i < l; i++ ) {
+ ret.push( array[i] );
+ }
+ } else {
+ for ( var i = 0; array[i]; i++ ) {
+ ret.push( array[i] );
+ }
+ }
+ }
+
+ return ret;
+ };
+}
+
+var sortOrder;
+
+if ( document.documentElement.compareDocumentPosition ) {
+ sortOrder = function( a, b ) {
+ if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
+ if ( a == b ) {
+ hasDuplicate = true;
+ }
+ return 0;
+ }
+
+ var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1;
+ if ( ret === 0 ) {
+ hasDuplicate = true;
+ }
+ return ret;
+ };
+} else if ( "sourceIndex" in document.documentElement ) {
+ sortOrder = function( a, b ) {
+ if ( !a.sourceIndex || !b.sourceIndex ) {
+ if ( a == b ) {
+ hasDuplicate = true;
+ }
+ return 0;
+ }
+
+ var ret = a.sourceIndex - b.sourceIndex;
+ if ( ret === 0 ) {
+ hasDuplicate = true;
+ }
+ return ret;
+ };
+} else if ( document.createRange ) {
+ sortOrder = function( a, b ) {
+ if ( !a.ownerDocument || !b.ownerDocument ) {
+ if ( a == b ) {
+ hasDuplicate = true;
+ }
+ return 0;
+ }
+
+ var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange();
+ aRange.setStart(a, 0);
+ aRange.setEnd(a, 0);
+ bRange.setStart(b, 0);
+ bRange.setEnd(b, 0);
+ var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange);
+ if ( ret === 0 ) {
+ hasDuplicate = true;
+ }
+ return ret;
+ };
+}
+
+(function(){
+ var form = document.createElement("div"),
+ id = "script" + (new Date).getTime();
+ form.innerHTML = "<a name='" + id + "'/>";
+
+ var root = document.documentElement;
+ root.insertBefore( form, root.firstChild );
+
+ if ( !!document.getElementById( id ) ) {
+ Expr.find.ID = function(match, context, isXML){
+ if ( typeof context.getElementById !== "undefined" && !isXML ) {
+ var m = context.getElementById(match[1]);
+ return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : [];
+ }
+ };
+
+ Expr.filter.ID = function(elem, match){
+ var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
+ return elem.nodeType === 1 && node && node.nodeValue === match;
+ };
+ }
+
+ root.removeChild( form );
+ root = form = null; // release memory in IE
+})();
+
+(function(){
+
+ var div = document.createElement("div");
+ div.appendChild( document.createComment("") );
+
+ if ( div.getElementsByTagName("*").length > 0 ) {
+ Expr.find.TAG = function(match, context){
+ var results = context.getElementsByTagName(match[1]);
+
+ if ( match[1] === "*" ) {
+ var tmp = [];
+
+ for ( var i = 0; results[i]; i++ ) {
+ if ( results[i].nodeType === 1 ) {
+ tmp.push( results[i] );
+ }
+ }
+
+ results = tmp;
+ }
+
+ return results;
+ };
+ }
+
+ div.innerHTML = "<a href='#'></a>";
+ if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
+ div.firstChild.getAttribute("href") !== "#" ) {
+ Expr.attrHandle.href = function(elem){
+ return elem.getAttribute("href", 2);
+ };
+ }
+
+ div = null; // release memory in IE
+})();
+
+if ( document.querySelectorAll ) (function(){
+ var oldSizzle = Sizzle, div = document.createElement("div");
+ div.innerHTML = "<p class='TEST'></p>";
+
+ if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
+ return;
+ }
+
+ Sizzle = function(query, context, extra, seed){
+ context = context || document;
+
+ if ( !seed && context.nodeType === 9 && !isXML(context) ) {
+ try {
+ return makeArray( context.querySelectorAll(query), extra );
+ } catch(e){}
+ }
+
+ return oldSizzle(query, context, extra, seed);
+ };
+
+ for ( var prop in oldSizzle ) {
+ Sizzle[ prop ] = oldSizzle[ prop ];
+ }
+
+ div = null; // release memory in IE
+})();
+
+if ( document.getElementsByClassName && document.documentElement.getElementsByClassName ) (function(){
+ var div = document.createElement("div");
+ div.innerHTML = "<div class='test e'></div><div class='test'></div>";
+
+ if ( div.getElementsByClassName("e").length === 0 )
+ return;
+
+ div.lastChild.className = "e";
+
+ if ( div.getElementsByClassName("e").length === 1 )
+ return;
+
+ Expr.order.splice(1, 0, "CLASS");
+ Expr.find.CLASS = function(match, context, isXML) {
+ if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
+ return context.getElementsByClassName(match[1]);
+ }
+ };
+
+ div = null; // release memory in IE
+})();
+
+function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+ var sibDir = dir == "previousSibling" && !isXML;
+ for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+ var elem = checkSet[i];
+ if ( elem ) {
+ if ( sibDir && elem.nodeType === 1 ){
+ elem.sizcache = doneName;
+ elem.sizset = i;
+ }
+ elem = elem[dir];
+ var match = false;
+
+ while ( elem ) {
+ if ( elem.sizcache === doneName ) {
+ match = checkSet[elem.sizset];
+ break;
+ }
+
+ if ( elem.nodeType === 1 && !isXML ){
+ elem.sizcache = doneName;
+ elem.sizset = i;
+ }
+
+ if ( elem.nodeName === cur ) {
+ match = elem;
+ break;
+ }
+
+ elem = elem[dir];
+ }
+
+ checkSet[i] = match;
+ }
+ }
+}
+
+function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+ var sibDir = dir == "previousSibling" && !isXML;
+ for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+ var elem = checkSet[i];
+ if ( elem ) {
+ if ( sibDir && elem.nodeType === 1 ) {
+ elem.sizcache = doneName;
+ elem.sizset = i;
+ }
+ elem = elem[dir];
+ var match = false;
+
+ while ( elem ) {
+ if ( elem.sizcache === doneName ) {
+ match = checkSet[elem.sizset];
+ break;
+ }
+
+ if ( elem.nodeType === 1 ) {
+ if ( !isXML ) {
+ elem.sizcache = doneName;
+ elem.sizset = i;
+ }
+ if ( typeof cur !== "string" ) {
+ if ( elem === cur ) {
+ match = true;
+ break;
+ }
+
+ } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
+ match = elem;
+ break;
+ }
+ }
+
+ elem = elem[dir];
+ }
+
+ checkSet[i] = match;
+ }
+ }
+}
+
+var contains = document.compareDocumentPosition ? function(a, b){
+ return a.compareDocumentPosition(b) & 16;
+} : function(a, b){
+ return a !== b && (a.contains ? a.contains(b) : true);
+};
+
+var isXML = function(elem){
+ return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" ||
+ !!elem.ownerDocument && elem.ownerDocument.documentElement.nodeName !== "HTML";
+};
+
+var posProcess = function(selector, context){
+ var tmpSet = [], later = "", match,
+ root = context.nodeType ? [context] : context;
+
+ while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
+ later += match[0];
+ selector = selector.replace( Expr.match.PSEUDO, "" );
+ }
+
+ selector = Expr.relative[selector] ? selector + "*" : selector;
+
+ for ( var i = 0, l = root.length; i < l; i++ ) {
+ Sizzle( selector, root[i], tmpSet );
+ }
+
+ return Sizzle.filter( later, tmpSet );
+};
+
+
+window.Sizzle = Sizzle;
+
+})();
+
+Prototype._original_property = window.Sizzle;
+
+;(function(engine) {
+ var extendElements = Prototype.Selector.extendElements;
+
+ function select(selector, scope) {
+ return extendElements(engine(selector, scope || document));
+ }
+
+ function match(element, selector) {
+ return engine.matches(selector, [element]).length == 1;
+ }
+
+ Prototype.Selector.engine = engine;
+ Prototype.Selector.select = select;
+ Prototype.Selector.match = match;
+})(Sizzle);
+
+window.Sizzle = Prototype._original_property;
+delete Prototype._original_property;
+
+var Form = {
+ reset: function(form) {
+ form = $(form);
+ form.reset();
+ return form;
+ },
+
+ serializeElements: function(elements, options) {
+ if (typeof options != 'object') options = { hash: !!options };
+ else if (Object.isUndefined(options.hash)) options.hash = true;
+ var key, value, submitted = false, submit = options.submit, accumulator, initial;
+
+ if (options.hash) {
+ initial = {};
+ accumulator = function(result, key, value) {
+ if (key in result) {
+ if (!Object.isArray(result[key])) result[key] = [result[key]];
+ result[key].push(value);
+ } else result[key] = value;
+ return result;
+ };
+ } else {
+ initial = '';
+ accumulator = function(result, key, value) {
+ return result + (result ? '&' : '') + encodeURIComponent(key) + '=' + encodeURIComponent(value);
+ }
+ }
+
+ return elements.inject(initial, function(result, element) {
+ if (!element.disabled && element.name) {
+ key = element.name; value = $(element).getValue();
+ if (value != null && element.type != 'file' && (element.type != 'submit' || (!submitted &&
+ submit !== false && (!submit || key == submit) && (submitted = true)))) {
+ result = accumulator(result, key, value);
+ }
+ }
+ return result;
+ });
+ }
+};
+
+Form.Methods = {
+ serialize: function(form, options) {
+ return Form.serializeElements(Form.getElements(form), options);
+ },
+
+ getElements: function(form) {
+ var elements = $(form).getElementsByTagName('*'),
+ element,
+ arr = [ ],
+ serializers = Form.Element.Serializers;
+ for (var i = 0; element = elements[i]; i++) {
+ arr.push(element);
+ }
+ return arr.inject([], function(elements, child) {
+ if (serializers[child.tagName.toLowerCase()])
+ elements.push(Element.extend(child));
+ return elements;
+ })
+ },
+
+ getInputs: function(form, typeName, name) {
+ form = $(form);
+ var inputs = form.getElementsByTagName('input');
+
+ if (!typeName && !name) return $A(inputs).map(Element.extend);
+
+ for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) {
+ var input = inputs[i];
+ if ((typeName && input.type != typeName) || (name && input.name != name))
+ continue;
+ matchingInputs.push(Element.extend(input));
+ }
+
+ return matchingInputs;
+ },
+
+ disable: function(form) {
+ form = $(form);
+ Form.getElements(form).invoke('disable');
+ return form;
+ },
+
+ enable: function(form) {
+ form = $(form);
+ Form.getElements(form).invoke('enable');
+ return form;
+ },
+
+ findFirstElement: function(form) {
+ var elements = $(form).getElements().findAll(function(element) {
+ return 'hidden' != element.type && !element.disabled;
+ });
+ var firstByIndex = elements.findAll(function(element) {
+ return element.hasAttribute('tabIndex') && element.tabIndex >= 0;
+ }).sortBy(function(element) { return element.tabIndex }).first();
+
+ return firstByIndex ? firstByIndex : elements.find(function(element) {
+ return /^(?:input|select|textarea)$/i.test(element.tagName);
+ });
+ },
+
+ focusFirstElement: function(form) {
+ form = $(form);
+ var element = form.findFirstElement();
+ if (element) element.activate();
+ return form;
+ },
+
+ request: function(form, options) {
+ form = $(form), options = Object.clone(options || { });
+
+ var params = options.parameters, action = form.readAttribute('action') || '';
+ if (action.blank()) action = window.location.href;
+ options.parameters = form.serialize(true);
+
+ if (params) {
+ if (Object.isString(params)) params = params.toQueryParams();
+ Object.extend(options.parameters, params);
+ }
+
+ if (form.hasAttribute('method') && !options.method)
+ options.method = form.method;
+
+ return new Ajax.Request(action, options);
+ }
+};
+
+/*--------------------------------------------------------------------------*/
+
+
+Form.Element = {
+ focus: function(element) {
+ $(element).focus();
+ return element;
+ },
+
+ select: function(element) {
+ $(element).select();
+ return element;
+ }
+};
+
+Form.Element.Methods = {
+
+ serialize: function(element) {
+ element = $(element);
+ if (!element.disabled && element.name) {
+ var value = element.getValue();
+ if (value != undefined) {
+ var pair = { };
+ pair[element.name] = value;
+ return Object.toQueryString(pair);
+ }
+ }
+ return '';
+ },
+
+ getValue: function(element) {
+ element = $(element);
+ var method = element.tagName.toLowerCase();
+ return Form.Element.Serializers[method](element);
+ },
+
+ setValue: function(element, value) {
+ element = $(element);
+ var method = element.tagName.toLowerCase();
+ Form.Element.Serializers[method](element, value);
+ return element;
+ },
+
+ clear: function(element) {
+ $(element).value = '';
+ return element;
+ },
+
+ present: function(element) {
+ return $(element).value != '';
+ },
+
+ activate: function(element) {
+ element = $(element);
+ try {
+ element.focus();
+ if (element.select && (element.tagName.toLowerCase() != 'input' ||
+ !(/^(?:button|reset|submit)$/i.test(element.type))))
+ element.select();
+ } catch (e) { }
+ return element;
+ },
+
+ disable: function(element) {
+ element = $(element);
+ element.disabled = true;
+ return element;
+ },
+
+ enable: function(element) {
+ element = $(element);
+ element.disabled = false;
+ return element;
+ }
+};
+
+/*--------------------------------------------------------------------------*/
+
+var Field = Form.Element;
+
+var $F = Form.Element.Methods.getValue;
+
+/*--------------------------------------------------------------------------*/
+
+Form.Element.Serializers = (function() {
+ function input(element, value) {
+ switch (element.type.toLowerCase()) {
+ case 'checkbox':
+ case 'radio':
+ return inputSelector(element, value);
+ default:
+ return valueSelector(element, value);
+ }
+ }
+
+ function inputSelector(element, value) {
+ if (Object.isUndefined(value))
+ return element.checked ? element.value : null;
+ else element.checked = !!value;
+ }
+
+ function valueSelector(element, value) {
+ if (Object.isUndefined(value)) return element.value;
+ else element.value = value;
+ }
+
+ function select(element, value) {
+ if (Object.isUndefined(value))
+ return (element.type === 'select-one' ? selectOne : selectMany)(element);
+
+ var opt, currentValue, single = !Object.isArray(value);
+ for (var i = 0, length = element.length; i < length; i++) {
+ opt = element.options[i];
+ currentValue = this.optionValue(opt);
+ if (single) {
+ if (currentValue == value) {
+ opt.selected = true;
+ return;
+ }
+ }
+ else opt.selected = value.include(currentValue);
+ }
+ }
+
+ function selectOne(element) {
+ var index = element.selectedIndex;
+ return index >= 0 ? optionValue(element.options[index]) : null;
+ }
+
+ function selectMany(element) {
+ var values, length = element.length;
+ if (!length) return null;
+
+ for (var i = 0, values = []; i < length; i++) {
+ var opt = element.options[i];
+ if (opt.selected) values.push(optionValue(opt));
+ }
+ return values;
+ }
+
+ function optionValue(opt) {
+ return Element.hasAttribute(opt, 'value') ? opt.value : opt.text;
+ }
+
+ return {
+ input: input,
+ inputSelector: inputSelector,
+ textarea: valueSelector,
+ select: select,
+ selectOne: selectOne,
+ selectMany: selectMany,
+ optionValue: optionValue,
+ button: valueSelector
+ };
+})();
+
+/*--------------------------------------------------------------------------*/
+
+
+Abstract.TimedObserver = Class.create(PeriodicalExecuter, {
+ initialize: function($super, element, frequency, callback) {
+ $super(callback, frequency);
+ this.element = $(element);
+ this.lastValue = this.getValue();
+ },
+
+ execute: function() {
+ var value = this.getValue();
+ if (Object.isString(this.lastValue) && Object.isString(value) ?
+ this.lastValue != value : String(this.lastValue) != String(value)) {
+ this.callback(this.element, value);
+ this.lastValue = value;
+ }
+ }
+});
+
+Form.Element.Observer = Class.create(Abstract.TimedObserver, {
+ getValue: function() {
+ return Form.Element.getValue(this.element);
+ }
+});
+
+Form.Observer = Class.create(Abstract.TimedObserver, {
+ getValue: function() {
+ return Form.serialize(this.element);
+ }
+});
+
+/*--------------------------------------------------------------------------*/
+
+Abstract.EventObserver = Class.create({
+ initialize: function(element, callback) {
+ this.element = $(element);
+ this.callback = callback;
+
+ this.lastValue = this.getValue();
+ if (this.element.tagName.toLowerCase() == 'form')
+ this.registerFormCallbacks();
+ else
+ this.registerCallback(this.element);
+ },
+
+ onElementEvent: function() {
+ var value = this.getValue();
+ if (this.lastValue != value) {
+ this.callback(this.element, value);
+ this.lastValue = value;
+ }
+ },
+
+ registerFormCallbacks: function() {
+ Form.getElements(this.element).each(this.registerCallback, this);
+ },
+
+ registerCallback: function(element) {
+ if (element.type) {
+ switch (element.type.toLowerCase()) {
+ case 'checkbox':
+ case 'radio':
+ Event.observe(element, 'click', this.onElementEvent.bind(this));
+ break;
+ default:
+ Event.observe(element, 'change', this.onElementEvent.bind(this));
+ break;
+ }
+ }
+ }
+});
+
+Form.Element.EventObserver = Class.create(Abstract.EventObserver, {
+ getValue: function() {
+ return Form.Element.getValue(this.element);
+ }
+});
+
+Form.EventObserver = Class.create(Abstract.EventObserver, {
+ getValue: function() {
+ return Form.serialize(this.element);
+ }
+});
+(function() {
+
+ var Event = {
+ 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,
+ KEY_HOME: 36,
+ KEY_END: 35,
+ KEY_PAGEUP: 33,
+ KEY_PAGEDOWN: 34,
+ KEY_INSERT: 45,
+
+ cache: {}
+ };
+
+ var docEl = document.documentElement;
+ var MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED = 'onmouseenter' in docEl
+ && 'onmouseleave' in docEl;
+
+
+
+ var isIELegacyEvent = function(event) { return false; };
+
+ if (window.attachEvent) {
+ if (window.addEventListener) {
+ isIELegacyEvent = function(event) {
+ return !(event instanceof window.Event);
+ };
+ } else {
+ isIELegacyEvent = function(event) { return true; };
+ }
+ }
+
+ var _isButton;
+
+ function _isButtonForDOMEvents(event, code) {
+ return event.which ? (event.which === code + 1) : (event.button === code);
+ }
+
+ var legacyButtonMap = { 0: 1, 1: 4, 2: 2 };
+ function _isButtonForLegacyEvents(event, code) {
+ return event.button === legacyButtonMap[code];
+ }
+
+ function _isButtonForWebKit(event, code) {
+ switch (code) {
+ case 0: return event.which == 1 && !event.metaKey;
+ case 1: return event.which == 2 || (event.which == 1 && event.metaKey);
+ case 2: return event.which == 3;
+ default: return false;
+ }
+ }
+
+ if (window.attachEvent) {
+ if (!window.addEventListener) {
+ _isButton = _isButtonForLegacyEvents;
+ } else {
+ _isButton = function(event, code) {
+ return isIELegacyEvent(event) ? _isButtonForLegacyEvents(event, code) :
+ _isButtonForDOMEvents(event, code);
+ }
+ }
+ } else if (Prototype.Browser.WebKit) {
+ _isButton = _isButtonForWebKit;
+ } else {
+ _isButton = _isButtonForDOMEvents;
+ }
+
+ function isLeftClick(event) { return _isButton(event, 0) }
+
+ function isMiddleClick(event) { return _isButton(event, 1) }
+
+ function isRightClick(event) { return _isButton(event, 2) }
+
+ function element(event) {
+ event = Event.extend(event);
+
+ var node = event.target, type = event.type,
+ currentTarget = event.currentTarget;
+
+ if (currentTarget && currentTarget.tagName) {
+ if (type === 'load' || type === 'error' ||
+ (type === 'click' && currentTarget.tagName.toLowerCase() === 'input'
+ && currentTarget.type === 'radio'))
+ node = currentTarget;
+ }
+
+ if (node.nodeType == Node.TEXT_NODE)
+ node = node.parentNode;
+
+ return Element.extend(node);
+ }
+
+ function findElement(event, expression) {
+ var element = Event.element(event);
+
+ if (!expression) return element;
+ while (element) {
+ if (Object.isElement(element) && Prototype.Selector.match(element, expression)) {
+ return Element.extend(element);
+ }
+ element = element.parentNode;
+ }
+ }
+
+ function pointer(event) {
+ return { x: pointerX(event), y: pointerY(event) };
+ }
+
+ function pointerX(event) {
+ var docElement = document.documentElement,
+ body = document.body || { scrollLeft: 0 };
+
+ return event.pageX || (event.clientX +
+ (docElement.scrollLeft || body.scrollLeft) -
+ (docElement.clientLeft || 0));
+ }
+
+ function pointerY(event) {
+ var docElement = document.documentElement,
+ body = document.body || { scrollTop: 0 };
+
+ return event.pageY || (event.clientY +
+ (docElement.scrollTop || body.scrollTop) -
+ (docElement.clientTop || 0));
+ }
+
+
+ function stop(event) {
+ Event.extend(event);
+ event.preventDefault();
+ event.stopPropagation();
+
+ event.stopped = true;
+ }
+
+
+ Event.Methods = {
+ isLeftClick: isLeftClick,
+ isMiddleClick: isMiddleClick,
+ isRightClick: isRightClick,
+
+ element: element,
+ findElement: findElement,
+
+ pointer: pointer,
+ pointerX: pointerX,
+ pointerY: pointerY,
+
+ stop: stop
+ };
+
+ var methods = Object.keys(Event.Methods).inject({ }, function(m, name) {
+ m[name] = Event.Methods[name].methodize();
+ return m;
+ });
+
+ if (window.attachEvent) {
+ function _relatedTarget(event) {
+ var element;
+ switch (event.type) {
+ case 'mouseover':
+ case 'mouseenter':
+ element = event.fromElement;
+ break;
+ case 'mouseout':
+ case 'mouseleave':
+ element = event.toElement;
+ break;
+ default:
+ return null;
+ }
+ return Element.extend(element);
+ }
+
+ var additionalMethods = {
+ stopPropagation: function() { this.cancelBubble = true },
+ preventDefault: function() { this.returnValue = false },
+ inspect: function() { return '[object Event]' }
+ };
+
+ Event.extend = function(event, element) {
+ if (!event) return false;
+
+ if (!isIELegacyEvent(event)) return event;
+
+ if (event._extendedByPrototype) return event;
+ event._extendedByPrototype = Prototype.emptyFunction;
+
+ var pointer = Event.pointer(event);
+
+ Object.extend(event, {
+ target: event.srcElement || element,
+ relatedTarget: _relatedTarget(event),
+ pageX: pointer.x,
+ pageY: pointer.y
+ });
+
+ Object.extend(event, methods);
+ Object.extend(event, additionalMethods);
+
+ return event;
+ };
+ } else {
+ Event.extend = Prototype.K;
+ }
+
+ if (window.addEventListener) {
+ Event.prototype = window.Event.prototype || document.createEvent('HTMLEvents').__proto__;
+ Object.extend(Event.prototype, methods);
+ }
+
+ function _createResponder(element, eventName, handler) {
+ var registry = Element.retrieve(element, 'prototype_event_registry');
+
+ if (Object.isUndefined(registry)) {
+ CACHE.push(element);
+ registry = Element.retrieve(element, 'prototype_event_registry', $H());
+ }
+
+ var respondersForEvent = registry.get(eventName);
+ if (Object.isUndefined(respondersForEvent)) {
+ respondersForEvent = [];
+ registry.set(eventName, respondersForEvent);
+ }
+
+ if (respondersForEvent.pluck('handler').include(handler)) return false;
+
+ var responder;
+ if (eventName.include(":")) {
+ responder = function(event) {
+ if (Object.isUndefined(event.eventName))
+ return false;
+
+ if (event.eventName !== eventName)
+ return false;
+
+ Event.extend(event, element);
+ handler.call(element, event);
+ };
+ } else {
+ if (!MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED &&
+ (eventName === "mouseenter" || eventName === "mouseleave")) {
+ if (eventName === "mouseenter" || eventName === "mouseleave") {
+ responder = function(event) {
+ Event.extend(event, element);
+
+ var parent = event.relatedTarget;
+ while (parent && parent !== element) {
+ try { parent = parent.parentNode; }
+ catch(e) { parent = element; }
+ }
+
+ if (parent === element) return;
+
+ handler.call(element, event);
+ };
+ }
+ } else {
+ responder = function(event) {
+ Event.extend(event, element);
+ handler.call(element, event);
+ };
+ }
+ }
+
+ responder.handler = handler;
+ respondersForEvent.push(responder);
+ return responder;
+ }
+
+ function _destroyCache() {
+ for (var i = 0, length = CACHE.length; i < length; i++) {
+ Event.stopObserving(CACHE[i]);
+ CACHE[i] = null;
+ }
+ }
+
+ var CACHE = [];
+
+ if (Prototype.Browser.IE)
+ window.attachEvent('onunload', _destroyCache);
+
+ if (Prototype.Browser.WebKit)
+ window.addEventListener('unload', Prototype.emptyFunction, false);
+
+
+ var _getDOMEventName = Prototype.K,
+ translations = { mouseenter: "mouseover", mouseleave: "mouseout" };
+
+ if (!MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED) {
+ _getDOMEventName = function(eventName) {
+ return (translations[eventName] || eventName);
+ };
+ }
+
+ function observe(element, eventName, handler) {
+ element = $(element);
+
+ var responder = _createResponder(element, eventName, handler);
+
+ if (!responder) return element;
+
+ if (eventName.include(':')) {
+ if (element.addEventListener)
+ element.addEventListener("dataavailable", responder, false);
+ else {
+ element.attachEvent("ondataavailable", responder);
+ element.attachEvent("onlosecapture", responder);
+ }
+ } else {
+ var actualEventName = _getDOMEventName(eventName);
+
+ if (element.addEventListener)
+ element.addEventListener(actualEventName, responder, false);
+ else
+ element.attachEvent("on" + actualEventName, responder);
+ }
+
+ return element;
+ }
+
+ function stopObserving(element, eventName, handler) {
+ element = $(element);
+
+ var registry = Element.retrieve(element, 'prototype_event_registry');
+ if (!registry) return element;
+
+ if (!eventName) {
+ registry.each( function(pair) {
+ var eventName = pair.key;
+ stopObserving(element, eventName);
+ });
+ return element;
+ }
+
+ var responders = registry.get(eventName);
+ if (!responders) return element;
+
+ if (!handler) {
+ responders.each(function(r) {
+ stopObserving(element, eventName, r.handler);
+ });
+ return element;
+ }
+
+ var i = responders.length, responder;
+ while (i--) {
+ if (responders[i].handler === handler) {
+ responder = responders[i];
+ break;
+ }
+ }
+ if (!responder) return element;
+
+ if (eventName.include(':')) {
+ if (element.removeEventListener)
+ element.removeEventListener("dataavailable", responder, false);
+ else {
+ element.detachEvent("ondataavailable", responder);
+ element.detachEvent("onlosecapture", responder);
+ }
+ } else {
+ var actualEventName = _getDOMEventName(eventName);
+ if (element.removeEventListener)
+ element.removeEventListener(actualEventName, responder, false);
+ else
+ element.detachEvent('on' + actualEventName, responder);
+ }
+
+ registry.set(eventName, responders.without(responder));
+
+ return element;
+ }
+
+ function fire(element, eventName, memo, bubble) {
+ element = $(element);
+
+ if (Object.isUndefined(bubble))
+ bubble = true;
+
+ if (element == document && document.createEvent && !element.dispatchEvent)
+ element = document.documentElement;
+
+ var event;
+ if (document.createEvent) {
+ event = document.createEvent('HTMLEvents');
+ event.initEvent('dataavailable', bubble, true);
+ } else {
+ event = document.createEventObject();
+ event.eventType = bubble ? 'ondataavailable' : 'onlosecapture';
+ }
+
+ event.eventName = eventName;
+ event.memo = memo || { };
+
+ if (document.createEvent)
+ element.dispatchEvent(event);
+ else
+ element.fireEvent(event.eventType, event);
+
+ return Event.extend(event);
+ }
+
+ Event.Handler = Class.create({
+ initialize: function(element, eventName, selector, callback) {
+ this.element = $(element);
+ this.eventName = eventName;
+ this.selector = selector;
+ this.callback = callback;
+ this.handler = this.handleEvent.bind(this);
+ },
+
+ start: function() {
+ Event.observe(this.element, this.eventName, this.handler);
+ return this;
+ },
+
+ stop: function() {
+ Event.stopObserving(this.element, this.eventName, this.handler);
+ return this;
+ },
+
+ handleEvent: function(event) {
+ var element = Event.findElement(event, this.selector);
+ if (element) this.callback.call(this.element, event, element);
+ }
+ });
+
+ function on(element, eventName, selector, callback) {
+ element = $(element);
+ if (Object.isFunction(selector) && Object.isUndefined(callback)) {
+ callback = selector, selector = null;
+ }
+
+ return new Event.Handler(element, eventName, selector, callback).start();
+ }
+
+ Object.extend(Event, Event.Methods);
+
+ Object.extend(Event, {
+ fire: fire,
+ observe: observe,
+ stopObserving: stopObserving,
+ on: on
+ });
+
+ Element.addMethods({
+ fire: fire,
+
+ observe: observe,
+
+ stopObserving: stopObserving,
+
+ on: on
+ });
+
+ Object.extend(document, {
+ fire: fire.methodize(),
+
+ observe: observe.methodize(),
+
+ stopObserving: stopObserving.methodize(),
+
+ on: on.methodize(),
+
+ loaded: false
+ });
+
+ if (window.Event) Object.extend(window.Event, Event);
+ else window.Event = Event;
+})();
+
+(function() {
+ /* Support for the DOMContentLoaded event is based on work by Dan Webb,
+ Matthias Miller, Dean Edwards, John Resig, and Diego Perini. */
+
+ var timer;
+
+ function fireContentLoadedEvent() {
+ if (document.loaded) return;
+ if (timer) window.clearTimeout(timer);
+ document.loaded = true;
+ document.fire('dom:loaded');
+ }
+
+ function checkReadyState() {
+ if (document.readyState === 'complete') {
+ document.stopObserving('readystatechange', checkReadyState);
+ fireContentLoadedEvent();
+ }
+ }
+
+ function pollDoScroll() {
+ try { document.documentElement.doScroll('left'); }
+ catch(e) {
+ timer = pollDoScroll.defer();
+ return;
+ }
+ fireContentLoadedEvent();
+ }
+
+ if (document.addEventListener) {
+ document.addEventListener('DOMContentLoaded', fireContentLoadedEvent, false);
+ } else {
+ document.observe('readystatechange', checkReadyState);
+ if (window == top)
+ timer = pollDoScroll.defer();
+ }
+
+ Event.observe(window, 'load', fireContentLoadedEvent);
+})();
+
+
+Element.addMethods();
+/*------------------------------- DEPRECATED -------------------------------*/
+
+Hash.toQueryString = Object.toQueryString;
+
+var Toggle = { display: Element.toggle };
+
+Element.Methods.childOf = Element.Methods.descendantOf;
+
+var Insertion = {
+ Before: function(element, content) {
+ return Element.insert(element, {before:content});
+ },
+
+ Top: function(element, content) {
+ return Element.insert(element, {top:content});
+ },
+
+ Bottom: function(element, content) {
+ return Element.insert(element, {bottom:content});
+ },
+
+ After: function(element, content) {
+ return Element.insert(element, {after:content});
+ }
+};
+
+var $continue = new Error('"throw $continue" is deprecated, use "return" instead');
+
+var Position = {
+ includeScrollOffsets: false,
+
+ prepare: function() {
+ this.deltaX = window.pageXOffset
+ || document.documentElement.scrollLeft
+ || document.body.scrollLeft
+ || 0;
+ this.deltaY = window.pageYOffset
+ || document.documentElement.scrollTop
+ || document.body.scrollTop
+ || 0;
+ },
+
+ within: function(element, x, y) {
+ if (this.includeScrollOffsets)
+ return this.withinIncludingScrolloffsets(element, x, y);
+ this.xcomp = x;
+ this.ycomp = y;
+ this.offset = Element.cumulativeOffset(element);
+
+ return (y >= this.offset[1] &&
+ y < this.offset[1] + element.offsetHeight &&
+ x >= this.offset[0] &&
+ x < this.offset[0] + element.offsetWidth);
+ },
+
+ withinIncludingScrolloffsets: function(element, x, y) {
+ var offsetcache = Element.cumulativeScrollOffset(element);
+
+ this.xcomp = x + offsetcache[0] - this.deltaX;
+ this.ycomp = y + offsetcache[1] - this.deltaY;
+ this.offset = Element.cumulativeOffset(element);
+
+ return (this.ycomp >= this.offset[1] &&
+ this.ycomp < this.offset[1] + element.offsetHeight &&
+ this.xcomp >= this.offset[0] &&
+ this.xcomp < this.offset[0] + element.offsetWidth);
+ },
+
+ overlap: function(mode, element) {
+ if (!mode) return 0;
+ if (mode == 'vertical')
+ return ((this.offset[1] + element.offsetHeight) - this.ycomp) /
+ element.offsetHeight;
+ if (mode == 'horizontal')
+ return ((this.offset[0] + element.offsetWidth) - this.xcomp) /
+ element.offsetWidth;
+ },
+
+
+ cumulativeOffset: Element.Methods.cumulativeOffset,
+
+ positionedOffset: Element.Methods.positionedOffset,
+
+ absolutize: function(element) {
+ Position.prepare();
+ return Element.absolutize(element);
+ },
+
+ relativize: function(element) {
+ Position.prepare();
+ return Element.relativize(element);
+ },
+
+ realOffset: Element.Methods.cumulativeScrollOffset,
+
+ offsetParent: Element.Methods.getOffsetParent,
+
+ page: Element.Methods.viewportOffset,
+
+ clone: function(source, target, options) {
+ options = options || { };
+ return Element.clonePosition(target, source, options);
+ }
+};
+
+/*--------------------------------------------------------------------------*/
+
+if (!document.getElementsByClassName) document.getElementsByClassName = function(instanceMethods){
+ function iter(name) {
+ return name.blank() ? null : "[contains(concat(' ', @class, ' '), ' " + name + " ')]";
+ }
+
+ instanceMethods.getElementsByClassName = Prototype.BrowserFeatures.XPath ?
+ function(element, className) {
+ className = className.toString().strip();
+ var cond = /\s/.test(className) ? $w(className).map(iter).join('') : iter(className);
+ return cond ? document._getElementsByXPath('.//*' + cond, element) : [];
+ } : function(element, className) {
+ className = className.toString().strip();
+ var elements = [], classNames = (/\s/.test(className) ? $w(className) : null);
+ if (!classNames && !className) return elements;
+
+ var nodes = $(element).getElementsByTagName('*');
+ className = ' ' + className + ' ';
+
+ for (var i = 0, child, cn; child = nodes[i]; i++) {
+ if (child.className && (cn = ' ' + child.className + ' ') && (cn.include(className) ||
+ (classNames && classNames.all(function(name) {
+ return !name.toString().blank() && cn.include(' ' + name + ' ');
+ }))))
+ elements.push(Element.extend(child));
+ }
+ return elements;
+ };
+
+ return function(className, parentElement) {
+ return $(parentElement || document.body).getElementsByClassName(className);
+ };
+}(Element.Methods);
+
+/*--------------------------------------------------------------------------*/
+
+Element.ClassNames = Class.create();
+Element.ClassNames.prototype = {
+ initialize: function(element) {
+ this.element = $(element);
+ },
+
+ _each: function(iterator) {
+ this.element.className.split(/\s+/).select(function(name) {
+ return name.length > 0;
+ })._each(iterator);
+ },
+
+ set: function(className) {
+ this.element.className = className;
+ },
+
+ add: function(classNameToAdd) {
+ if (this.include(classNameToAdd)) return;
+ this.set($A(this).concat(classNameToAdd).join(' '));
+ },
+
+ remove: function(classNameToRemove) {
+ if (!this.include(classNameToRemove)) return;
+ this.set($A(this).without(classNameToRemove).join(' '));
+ },
+
+ toString: function() {
+ return $A(this).join(' ');
+ }
+};
+
+Object.extend(Element.ClassNames.prototype, Enumerable);
+
+/*--------------------------------------------------------------------------*/
+
+(function() {
+ window.Selector = Class.create({
+ initialize: function(expression) {
+ this.expression = expression.strip();
+ },
+
+ findElements: function(rootElement) {
+ return Prototype.Selector.select(this.expression, rootElement);
+ },
+
+ match: function(element) {
+ return Prototype.Selector.match(element, this.expression);
+ },
+
+ toString: function() {
+ return this.expression;
+ },
+
+ inspect: function() {
+ return "#<Selector: " + this.expression + ">";
+ }
+ });
+
+ Object.extend(Selector, {
+ matchElements: function(elements, expression) {
+ var match = Prototype.Selector.match,
+ results = [];
+
+ for (var i = 0, length = elements.length; i < length; i++) {
+ var element = elements[i];
+ if (match(element, expression)) {
+ results.push(Element.extend(element));
+ }
+ }
+ return results;
+ },
+
+ findElement: function(elements, expression, index) {
+ index = index || 0;
+ var matchIndex = 0, element;
+ for (var i = 0, length = elements.length; i < length; i++) {
+ element = elements[i];
+ if (Prototype.Selector.match(element, expression) && index === matchIndex++) {
+ return Element.extend(element);
+ }
+ }
+ },
+
+ findChildElements: function(element, expressions) {
+ var selector = expressions.toArray().join(', ');
+ return Prototype.Selector.select(selector, element || document);
+ }
+ });
+})();
diff --git a/js/script.aculo.us/builder.js b/js/script.aculo.us/builder.js
new file mode 100644
index 0000000..7325038
--- /dev/null
+++ b/js/script.aculo.us/builder.js
@@ -0,0 +1,136 @@
+// script.aculo.us builder.js v1.9.0, Thu Dec 23 16:54:48 -0500 2010
+
+// Copyright (c) 2005-2010 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+//
+// script.aculo.us is freely distributable under the terms of an MIT-style license.
+// For details, see the script.aculo.us web site: http://script.aculo.us/
+
+var Builder = {
+ NODEMAP: {
+ AREA: 'map',
+ CAPTION: 'table',
+ COL: 'table',
+ COLGROUP: 'table',
+ LEGEND: 'fieldset',
+ OPTGROUP: 'select',
+ OPTION: 'select',
+ PARAM: 'object',
+ TBODY: 'table',
+ TD: 'table',
+ TFOOT: 'table',
+ TH: 'table',
+ THEAD: 'table',
+ TR: 'table'
+ },
+ // note: For Firefox < 1.5, OPTION and OPTGROUP tags are currently broken,
+ // due to a Firefox bug
+ node: function(elementName) {
+ elementName = elementName.toUpperCase();
+
+ // try innerHTML approach
+ var parentTag = this.NODEMAP[elementName] || 'div';
+ var parentElement = document.createElement(parentTag);
+ try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
+ parentElement.innerHTML = "<" + elementName + "></" + elementName + ">";
+ } catch(e) {}
+ var element = parentElement.firstChild || null;
+
+ // see if browser added wrapping tags
+ if(element && (element.tagName.toUpperCase() != elementName))
+ element = element.getElementsByTagName(elementName)[0];
+
+ // fallback to createElement approach
+ if(!element) element = document.createElement(elementName);
+
+ // abort if nothing could be created
+ if(!element) return;
+
+ // attributes (or text)
+ if(arguments[1])
+ if(this._isStringOrNumber(arguments[1]) ||
+ (arguments[1] instanceof Array) ||
+ arguments[1].tagName) {
+ this._children(element, arguments[1]);
+ } else {
+ var attrs = this._attributes(arguments[1]);
+ if(attrs.length) {
+ try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
+ parentElement.innerHTML = "<" +elementName + " " +
+ attrs + "></" + elementName + ">";
+ } catch(e) {}
+ element = parentElement.firstChild || null;
+ // workaround firefox 1.0.X bug
+ if(!element) {
+ element = document.createElement(elementName);
+ for(attr in arguments[1])
+ element[attr == 'class' ? 'className' : attr] = arguments[1][attr];
+ }
+ if(element.tagName.toUpperCase() != elementName)
+ element = parentElement.getElementsByTagName(elementName)[0];
+ }
+ }
+
+ // text, or array of children
+ if(arguments[2])
+ this._children(element, arguments[2]);
+
+ return $(element);
+ },
+ _text: function(text) {
+ return document.createTextNode(text);
+ },
+
+ ATTR_MAP: {
+ 'className': 'class',
+ 'htmlFor': 'for'
+ },
+
+ _attributes: function(attributes) {
+ var attrs = [];
+ for(attribute in attributes)
+ attrs.push((attribute in this.ATTR_MAP ? this.ATTR_MAP[attribute] : attribute) +
+ '="' + attributes[attribute].toString().escapeHTML().gsub(/"/,'&quot;') + '"');
+ return attrs.join(" ");
+ },
+ _children: function(element, children) {
+ if(children.tagName) {
+ element.appendChild(children);
+ return;
+ }
+ if(typeof children=='object') { // array can hold nodes and text
+ children.flatten().each( function(e) {
+ if(typeof e=='object')
+ element.appendChild(e);
+ else
+ if(Builder._isStringOrNumber(e))
+ element.appendChild(Builder._text(e));
+ });
+ } else
+ if(Builder._isStringOrNumber(children))
+ element.appendChild(Builder._text(children));
+ },
+ _isStringOrNumber: function(param) {
+ return(typeof param=='string' || typeof param=='number');
+ },
+ build: function(html) {
+ var element = this.node('div');
+ $(element).update(html.strip());
+ return element.down();
+ },
+ dump: function(scope) {
+ if(typeof scope != 'object' && typeof scope != 'function') scope = window; //global scope
+
+ var tags = ("A ABBR ACRONYM ADDRESS APPLET AREA B BASE BASEFONT BDO BIG BLOCKQUOTE BODY " +
+ "BR BUTTON CAPTION CENTER CITE CODE COL COLGROUP DD DEL DFN DIR DIV DL DT EM FIELDSET " +
+ "FONT FORM FRAME FRAMESET H1 H2 H3 H4 H5 H6 HEAD HR HTML I IFRAME IMG INPUT INS ISINDEX "+
+ "KBD LABEL LEGEND LI LINK MAP MENU META NOFRAMES NOSCRIPT OBJECT OL OPTGROUP OPTION P "+
+ "PARAM PRE Q S SAMP SCRIPT SELECT SMALL SPAN STRIKE STRONG STYLE SUB SUP TABLE TBODY TD "+
+ "TEXTAREA TFOOT TH THEAD TITLE TR TT U UL VAR").split(/\s+/);
+
+ tags.each( function(tag){
+ scope[tag] = function() {
+ return Builder.node.apply(Builder, [tag].concat($A(arguments)));
+ };
+ });
+ }
+}; \ No newline at end of file
diff --git a/js/script.aculo.us/controls.js b/js/script.aculo.us/controls.js
new file mode 100644
index 0000000..5137ab5
--- /dev/null
+++ b/js/script.aculo.us/controls.js
@@ -0,0 +1,965 @@
+// script.aculo.us controls.js v1.9.0, Thu Dec 23 16:54:48 -0500 2010
+
+// Copyright (c) 2005-2010 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+// (c) 2005-2010 Ivan Krstic (http://blogs.law.harvard.edu/ivan)
+// (c) 2005-2010 Jon Tirsen (http://www.tirsen.com)
+// Contributors:
+// Richard Livsey
+// Rahul Bhargava
+// Rob Wills
+//
+// script.aculo.us is freely distributable under the terms of an MIT-style license.
+// For details, see the script.aculo.us web site: http://script.aculo.us/
+
+// Autocompleter.Base handles all the autocompletion functionality
+// that's independent of the data source for autocompletion. This
+// includes drawing the autocompletion menu, observing keyboard
+// and mouse events, and similar.
+//
+// Specific autocompleters need to provide, at the very least,
+// a getUpdatedChoices function that will be invoked every time
+// the text inside the monitored textbox changes. This method
+// should get the text for which to provide autocompletion by
+// invoking this.getToken(), NOT by directly accessing
+// this.element.value. This is to allow incremental tokenized
+// autocompletion. Specific auto-completion logic (AJAX, etc)
+// belongs in getUpdatedChoices.
+//
+// Tokenized incremental autocompletion is enabled automatically
+// when an autocompleter is instantiated with the 'tokens' option
+// in the options parameter, e.g.:
+// new Ajax.Autocompleter('id','upd', '/url/', { tokens: ',' });
+// will incrementally autocomplete with a comma as the token.
+// Additionally, ',' in the above example can be replaced with
+// a token array, e.g. { tokens: [',', '\n'] } which
+// enables autocompletion on multiple tokens. This is most
+// useful when one of the tokens is \n (a newline), as it
+// allows smart autocompletion after linebreaks.
+
+if(typeof Effect == 'undefined')
+ throw("controls.js requires including script.aculo.us' effects.js library");
+
+var Autocompleter = { };
+Autocompleter.Base = Class.create({
+ baseInitialize: function(element, update, options) {
+ element = $(element);
+ this.element = element;
+ this.update = $(update);
+ this.hasFocus = false;
+ this.changed = false;
+ this.active = false;
+ this.index = 0;
+ this.entryCount = 0;
+ this.oldElementValue = this.element.value;
+
+ if(this.setOptions)
+ this.setOptions(options);
+ else
+ this.options = options || { };
+
+ this.options.paramName = this.options.paramName || this.element.name;
+ this.options.tokens = this.options.tokens || [];
+ this.options.frequency = this.options.frequency || 0.4;
+ this.options.minChars = this.options.minChars || 1;
+ this.options.onShow = this.options.onShow ||
+ function(element, update){
+ if(!update.style.position || update.style.position=='absolute') {
+ update.style.position = 'absolute';
+ Position.clone(element, update, {
+ setHeight: false,
+ offsetTop: element.offsetHeight
+ });
+ }
+ Effect.Appear(update,{duration:0.15});
+ };
+ this.options.onHide = this.options.onHide ||
+ function(element, update){ new Effect.Fade(update,{duration:0.15}) };
+
+ if(typeof(this.options.tokens) == 'string')
+ this.options.tokens = new Array(this.options.tokens);
+ // Force carriage returns as token delimiters anyway
+ if (!this.options.tokens.include('\n'))
+ this.options.tokens.push('\n');
+
+ this.observer = null;
+
+ this.element.setAttribute('autocomplete','off');
+
+ Element.hide(this.update);
+
+ Event.observe(this.element, 'blur', this.onBlur.bindAsEventListener(this));
+ Event.observe(this.element, 'keydown', this.onKeyPress.bindAsEventListener(this));
+ },
+
+ show: function() {
+ if(Element.getStyle(this.update, 'display')=='none') this.options.onShow(this.element, this.update);
+ if(!this.iefix &&
+ (Prototype.Browser.IE) &&
+ (Element.getStyle(this.update, 'position')=='absolute')) {
+ new Insertion.After(this.update,
+ '<iframe id="' + this.update.id + '_iefix" '+
+ 'style="display:none;position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);" ' +
+ 'src="javascript:false;" frameborder="0" scrolling="no"></iframe>');
+ this.iefix = $(this.update.id+'_iefix');
+ }
+ if(this.iefix) setTimeout(this.fixIEOverlapping.bind(this), 50);
+ },
+
+ fixIEOverlapping: function() {
+ Position.clone(this.update, this.iefix, {setTop:(!this.update.style.height)});
+ this.iefix.style.zIndex = 1;
+ this.update.style.zIndex = 2;
+ Element.show(this.iefix);
+ },
+
+ hide: function() {
+ this.stopIndicator();
+ if(Element.getStyle(this.update, 'display')!='none') this.options.onHide(this.element, this.update);
+ if(this.iefix) Element.hide(this.iefix);
+ },
+
+ startIndicator: function() {
+ if(this.options.indicator) Element.show(this.options.indicator);
+ },
+
+ stopIndicator: function() {
+ if(this.options.indicator) Element.hide(this.options.indicator);
+ },
+
+ onKeyPress: function(event) {
+ if(this.active)
+ switch(event.keyCode) {
+ case Event.KEY_TAB:
+ case Event.KEY_RETURN:
+ this.selectEntry();
+ Event.stop(event);
+ case Event.KEY_ESC:
+ this.hide();
+ this.active = false;
+ Event.stop(event);
+ return;
+ case Event.KEY_LEFT:
+ case Event.KEY_RIGHT:
+ return;
+ case Event.KEY_UP:
+ this.markPrevious();
+ this.render();
+ Event.stop(event);
+ return;
+ case Event.KEY_DOWN:
+ this.markNext();
+ this.render();
+ Event.stop(event);
+ return;
+ }
+ else
+ if(event.keyCode==Event.KEY_TAB || event.keyCode==Event.KEY_RETURN ||
+ (Prototype.Browser.WebKit > 0 && event.keyCode == 0)) return;
+
+ this.changed = true;
+ this.hasFocus = true;
+
+ if(this.observer) clearTimeout(this.observer);
+ this.observer =
+ setTimeout(this.onObserverEvent.bind(this), this.options.frequency*1000);
+ },
+
+ activate: function() {
+ this.changed = false;
+ this.hasFocus = true;
+ this.getUpdatedChoices();
+ },
+
+ onHover: function(event) {
+ var element = Event.findElement(event, 'LI');
+ if(this.index != element.autocompleteIndex)
+ {
+ this.index = element.autocompleteIndex;
+ this.render();
+ }
+ Event.stop(event);
+ },
+
+ onClick: function(event) {
+ var element = Event.findElement(event, 'LI');
+ this.index = element.autocompleteIndex;
+ this.selectEntry();
+ this.hide();
+ },
+
+ onBlur: function(event) {
+ // needed to make click events working
+ setTimeout(this.hide.bind(this), 250);
+ this.hasFocus = false;
+ this.active = false;
+ },
+
+ render: function() {
+ if(this.entryCount > 0) {
+ for (var i = 0; i < this.entryCount; i++)
+ this.index==i ?
+ Element.addClassName(this.getEntry(i),"selected") :
+ Element.removeClassName(this.getEntry(i),"selected");
+ if(this.hasFocus) {
+ this.show();
+ this.active = true;
+ }
+ } else {
+ this.active = false;
+ this.hide();
+ }
+ },
+
+ markPrevious: function() {
+ if(this.index > 0) this.index--;
+ else this.index = this.entryCount-1;
+ this.getEntry(this.index).scrollIntoView(true);
+ },
+
+ markNext: function() {
+ if(this.index < this.entryCount-1) this.index++;
+ else this.index = 0;
+ this.getEntry(this.index).scrollIntoView(false);
+ },
+
+ getEntry: function(index) {
+ return this.update.firstChild.childNodes[index];
+ },
+
+ getCurrentEntry: function() {
+ return this.getEntry(this.index);
+ },
+
+ selectEntry: function() {
+ this.active = false;
+ this.updateElement(this.getCurrentEntry());
+ },
+
+ updateElement: function(selectedElement) {
+ if (this.options.updateElement) {
+ this.options.updateElement(selectedElement);
+ return;
+ }
+ var value = '';
+ if (this.options.select) {
+ var nodes = $(selectedElement).select('.' + this.options.select) || [];
+ if(nodes.length>0) value = Element.collectTextNodes(nodes[0], this.options.select);
+ } else
+ value = Element.collectTextNodesIgnoreClass(selectedElement, 'informal');
+
+ var bounds = this.getTokenBounds();
+ if (bounds[0] != -1) {
+ var newValue = this.element.value.substr(0, bounds[0]);
+ var whitespace = this.element.value.substr(bounds[0]).match(/^\s+/);
+ if (whitespace)
+ newValue += whitespace[0];
+ this.element.value = newValue + value + this.element.value.substr(bounds[1]);
+ } else {
+ this.element.value = value;
+ }
+ this.oldElementValue = this.element.value;
+ this.element.focus();
+
+ if (this.options.afterUpdateElement)
+ this.options.afterUpdateElement(this.element, selectedElement);
+ },
+
+ updateChoices: function(choices) {
+ if(!this.changed && this.hasFocus) {
+ this.update.innerHTML = choices;
+ Element.cleanWhitespace(this.update);
+ Element.cleanWhitespace(this.update.down());
+
+ if(this.update.firstChild && this.update.down().childNodes) {
+ this.entryCount =
+ this.update.down().childNodes.length;
+ for (var i = 0; i < this.entryCount; i++) {
+ var entry = this.getEntry(i);
+ entry.autocompleteIndex = i;
+ this.addObservers(entry);
+ }
+ } else {
+ this.entryCount = 0;
+ }
+
+ this.stopIndicator();
+ this.index = 0;
+
+ if(this.entryCount==1 && this.options.autoSelect) {
+ this.selectEntry();
+ this.hide();
+ } else {
+ this.render();
+ }
+ }
+ },
+
+ addObservers: function(element) {
+ Event.observe(element, "mouseover", this.onHover.bindAsEventListener(this));
+ Event.observe(element, "click", this.onClick.bindAsEventListener(this));
+ },
+
+ onObserverEvent: function() {
+ this.changed = false;
+ this.tokenBounds = null;
+ if(this.getToken().length>=this.options.minChars) {
+ this.getUpdatedChoices();
+ } else {
+ this.active = false;
+ this.hide();
+ }
+ this.oldElementValue = this.element.value;
+ },
+
+ getToken: function() {
+ var bounds = this.getTokenBounds();
+ return this.element.value.substring(bounds[0], bounds[1]).strip();
+ },
+
+ getTokenBounds: function() {
+ if (null != this.tokenBounds) return this.tokenBounds;
+ var value = this.element.value;
+ if (value.strip().empty()) return [-1, 0];
+ var diff = arguments.callee.getFirstDifferencePos(value, this.oldElementValue);
+ var offset = (diff == this.oldElementValue.length ? 1 : 0);
+ var prevTokenPos = -1, nextTokenPos = value.length;
+ var tp;
+ for (var index = 0, l = this.options.tokens.length; index < l; ++index) {
+ tp = value.lastIndexOf(this.options.tokens[index], diff + offset - 1);
+ if (tp > prevTokenPos) prevTokenPos = tp;
+ tp = value.indexOf(this.options.tokens[index], diff + offset);
+ if (-1 != tp && tp < nextTokenPos) nextTokenPos = tp;
+ }
+ return (this.tokenBounds = [prevTokenPos + 1, nextTokenPos]);
+ }
+});
+
+Autocompleter.Base.prototype.getTokenBounds.getFirstDifferencePos = function(newS, oldS) {
+ var boundary = Math.min(newS.length, oldS.length);
+ for (var index = 0; index < boundary; ++index)
+ if (newS[index] != oldS[index])
+ return index;
+ return boundary;
+};
+
+Ajax.Autocompleter = Class.create(Autocompleter.Base, {
+ initialize: function(element, update, url, options) {
+ this.baseInitialize(element, update, options);
+ this.options.asynchronous = true;
+ this.options.onComplete = this.onComplete.bind(this);
+ this.options.defaultParams = this.options.parameters || null;
+ this.url = url;
+ },
+
+ getUpdatedChoices: function() {
+ this.startIndicator();
+
+ var entry = encodeURIComponent(this.options.paramName) + '=' +
+ encodeURIComponent(this.getToken());
+
+ this.options.parameters = this.options.callback ?
+ this.options.callback(this.element, entry) : entry;
+
+ if(this.options.defaultParams)
+ this.options.parameters += '&' + this.options.defaultParams;
+
+ new Ajax.Request(this.url, this.options);
+ },
+
+ onComplete: function(request) {
+ this.updateChoices(request.responseText);
+ }
+});
+
+// The local array autocompleter. Used when you'd prefer to
+// inject an array of autocompletion options into the page, rather
+// than sending out Ajax queries, which can be quite slow sometimes.
+//
+// The constructor takes four parameters. The first two are, as usual,
+// the id of the monitored textbox, and id of the autocompletion menu.
+// The third is the array you want to autocomplete from, and the fourth
+// is the options block.
+//
+// Extra local autocompletion options:
+// - choices - How many autocompletion choices to offer
+//
+// - partialSearch - If false, the autocompleter will match entered
+// text only at the beginning of strings in the
+// autocomplete array. Defaults to true, which will
+// match text at the beginning of any *word* in the
+// strings in the autocomplete array. If you want to
+// search anywhere in the string, additionally set
+// the option fullSearch to true (default: off).
+//
+// - fullSsearch - Search anywhere in autocomplete array strings.
+//
+// - partialChars - How many characters to enter before triggering
+// a partial match (unlike minChars, which defines
+// how many characters are required to do any match
+// at all). Defaults to 2.
+//
+// - ignoreCase - Whether to ignore case when autocompleting.
+// Defaults to true.
+//
+// It's possible to pass in a custom function as the 'selector'
+// option, if you prefer to write your own autocompletion logic.
+// In that case, the other options above will not apply unless
+// you support them.
+
+Autocompleter.Local = Class.create(Autocompleter.Base, {
+ initialize: function(element, update, array, options) {
+ this.baseInitialize(element, update, options);
+ this.options.array = array;
+ },
+
+ getUpdatedChoices: function() {
+ this.updateChoices(this.options.selector(this));
+ },
+
+ setOptions: function(options) {
+ this.options = Object.extend({
+ choices: 10,
+ partialSearch: true,
+ partialChars: 2,
+ ignoreCase: true,
+ fullSearch: false,
+ selector: function(instance) {
+ var ret = []; // Beginning matches
+ var partial = []; // Inside matches
+ var entry = instance.getToken();
+ var count = 0;
+
+ for (var i = 0; i < instance.options.array.length &&
+ ret.length < instance.options.choices ; i++) {
+
+ var elem = instance.options.array[i];
+ var foundPos = instance.options.ignoreCase ?
+ elem.toLowerCase().indexOf(entry.toLowerCase()) :
+ elem.indexOf(entry);
+
+ while (foundPos != -1) {
+ if (foundPos == 0 && elem.length != entry.length) {
+ ret.push("<li><strong>" + elem.substr(0, entry.length) + "</strong>" +
+ elem.substr(entry.length) + "</li>");
+ break;
+ } else if (entry.length >= instance.options.partialChars &&
+ instance.options.partialSearch && foundPos != -1) {
+ if (instance.options.fullSearch || /\s/.test(elem.substr(foundPos-1,1))) {
+ partial.push("<li>" + elem.substr(0, foundPos) + "<strong>" +
+ elem.substr(foundPos, entry.length) + "</strong>" + elem.substr(
+ foundPos + entry.length) + "</li>");
+ break;
+ }
+ }
+
+ foundPos = instance.options.ignoreCase ?
+ elem.toLowerCase().indexOf(entry.toLowerCase(), foundPos + 1) :
+ elem.indexOf(entry, foundPos + 1);
+
+ }
+ }
+ if (partial.length)
+ ret = ret.concat(partial.slice(0, instance.options.choices - ret.length));
+ return "<ul>" + ret.join('') + "</ul>";
+ }
+ }, options || { });
+ }
+});
+
+// AJAX in-place editor and collection editor
+// Full rewrite by Christophe Porteneuve <tdd@tddsworld.com> (April 2007).
+
+// Use this if you notice weird scrolling problems on some browsers,
+// the DOM might be a bit confused when this gets called so do this
+// waits 1 ms (with setTimeout) until it does the activation
+Field.scrollFreeActivate = function(field) {
+ setTimeout(function() {
+ Field.activate(field);
+ }, 1);
+};
+
+Ajax.InPlaceEditor = Class.create({
+ initialize: function(element, url, options) {
+ this.url = url;
+ this.element = element = $(element);
+ this.prepareOptions();
+ this._controls = { };
+ arguments.callee.dealWithDeprecatedOptions(options); // DEPRECATION LAYER!!!
+ Object.extend(this.options, options || { });
+ if (!this.options.formId && this.element.id) {
+ this.options.formId = this.element.id + '-inplaceeditor';
+ if ($(this.options.formId))
+ this.options.formId = '';
+ }
+ if (this.options.externalControl)
+ this.options.externalControl = $(this.options.externalControl);
+ if (!this.options.externalControl)
+ this.options.externalControlOnly = false;
+ this._originalBackground = this.element.getStyle('background-color') || 'transparent';
+ this.element.title = this.options.clickToEditText;
+ this._boundCancelHandler = this.handleFormCancellation.bind(this);
+ this._boundComplete = (this.options.onComplete || Prototype.emptyFunction).bind(this);
+ this._boundFailureHandler = this.handleAJAXFailure.bind(this);
+ this._boundSubmitHandler = this.handleFormSubmission.bind(this);
+ this._boundWrapperHandler = this.wrapUp.bind(this);
+ this.registerListeners();
+ },
+ checkForEscapeOrReturn: function(e) {
+ if (!this._editing || e.ctrlKey || e.altKey || e.shiftKey) return;
+ if (Event.KEY_ESC == e.keyCode)
+ this.handleFormCancellation(e);
+ else if (Event.KEY_RETURN == e.keyCode)
+ this.handleFormSubmission(e);
+ },
+ createControl: function(mode, handler, extraClasses) {
+ var control = this.options[mode + 'Control'];
+ var text = this.options[mode + 'Text'];
+ if ('button' == control) {
+ var btn = document.createElement('input');
+ btn.type = 'submit';
+ btn.value = text;
+ btn.className = 'editor_' + mode + '_button';
+ if ('cancel' == mode)
+ btn.onclick = this._boundCancelHandler;
+ this._form.appendChild(btn);
+ this._controls[mode] = btn;
+ } else if ('link' == control) {
+ var link = document.createElement('a');
+ link.href = '#';
+ link.appendChild(document.createTextNode(text));
+ link.onclick = 'cancel' == mode ? this._boundCancelHandler : this._boundSubmitHandler;
+ link.className = 'editor_' + mode + '_link';
+ if (extraClasses)
+ link.className += ' ' + extraClasses;
+ this._form.appendChild(link);
+ this._controls[mode] = link;
+ }
+ },
+ createEditField: function() {
+ var text = (this.options.loadTextURL ? this.options.loadingText : this.getText());
+ var fld;
+ if (1 >= this.options.rows && !/\r|\n/.test(this.getText())) {
+ fld = document.createElement('input');
+ fld.type = 'text';
+ var size = this.options.size || this.options.cols || 0;
+ if (0 < size) fld.size = size;
+ } else {
+ fld = document.createElement('textarea');
+ fld.rows = (1 >= this.options.rows ? this.options.autoRows : this.options.rows);
+ fld.cols = this.options.cols || 40;
+ }
+ fld.name = this.options.paramName;
+ fld.value = text; // No HTML breaks conversion anymore
+ fld.className = 'editor_field';
+ if (this.options.submitOnBlur)
+ fld.onblur = this._boundSubmitHandler;
+ this._controls.editor = fld;
+ if (this.options.loadTextURL)
+ this.loadExternalText();
+ this._form.appendChild(this._controls.editor);
+ },
+ createForm: function() {
+ var ipe = this;
+ function addText(mode, condition) {
+ var text = ipe.options['text' + mode + 'Controls'];
+ if (!text || condition === false) return;
+ ipe._form.appendChild(document.createTextNode(text));
+ };
+ this._form = $(document.createElement('form'));
+ this._form.id = this.options.formId;
+ this._form.addClassName(this.options.formClassName);
+ this._form.onsubmit = this._boundSubmitHandler;
+ this.createEditField();
+ if ('textarea' == this._controls.editor.tagName.toLowerCase())
+ this._form.appendChild(document.createElement('br'));
+ if (this.options.onFormCustomization)
+ this.options.onFormCustomization(this, this._form);
+ addText('Before', this.options.okControl || this.options.cancelControl);
+ this.createControl('ok', this._boundSubmitHandler);
+ addText('Between', this.options.okControl && this.options.cancelControl);
+ this.createControl('cancel', this._boundCancelHandler, 'editor_cancel');
+ addText('After', this.options.okControl || this.options.cancelControl);
+ },
+ destroy: function() {
+ if (this._oldInnerHTML)
+ this.element.innerHTML = this._oldInnerHTML;
+ this.leaveEditMode();
+ this.unregisterListeners();
+ },
+ enterEditMode: function(e) {
+ if (this._saving || this._editing) return;
+ this._editing = true;
+ this.triggerCallback('onEnterEditMode');
+ if (this.options.externalControl)
+ this.options.externalControl.hide();
+ this.element.hide();
+ this.createForm();
+ this.element.parentNode.insertBefore(this._form, this.element);
+ if (!this.options.loadTextURL)
+ this.postProcessEditField();
+ if (e) Event.stop(e);
+ },
+ enterHover: function(e) {
+ if (this.options.hoverClassName)
+ this.element.addClassName(this.options.hoverClassName);
+ if (this._saving) return;
+ this.triggerCallback('onEnterHover');
+ },
+ getText: function() {
+ return this.element.innerHTML.unescapeHTML();
+ },
+ handleAJAXFailure: function(transport) {
+ this.triggerCallback('onFailure', transport);
+ if (this._oldInnerHTML) {
+ this.element.innerHTML = this._oldInnerHTML;
+ this._oldInnerHTML = null;
+ }
+ },
+ handleFormCancellation: function(e) {
+ this.wrapUp();
+ if (e) Event.stop(e);
+ },
+ handleFormSubmission: function(e) {
+ var form = this._form;
+ var value = $F(this._controls.editor);
+ this.prepareSubmission();
+ var params = this.options.callback(form, value) || '';
+ if (Object.isString(params))
+ params = params.toQueryParams();
+ params.editorId = this.element.id;
+ if (this.options.htmlResponse) {
+ var options = Object.extend({ evalScripts: true }, this.options.ajaxOptions);
+ Object.extend(options, {
+ parameters: params,
+ onComplete: this._boundWrapperHandler,
+ onFailure: this._boundFailureHandler
+ });
+ new Ajax.Updater({ success: this.element }, this.url, options);
+ } else {
+ var options = Object.extend({ method: 'get' }, this.options.ajaxOptions);
+ Object.extend(options, {
+ parameters: params,
+ onComplete: this._boundWrapperHandler,
+ onFailure: this._boundFailureHandler
+ });
+ new Ajax.Request(this.url, options);
+ }
+ if (e) Event.stop(e);
+ },
+ leaveEditMode: function() {
+ this.element.removeClassName(this.options.savingClassName);
+ this.removeForm();
+ this.leaveHover();
+ this.element.style.backgroundColor = this._originalBackground;
+ this.element.show();
+ if (this.options.externalControl)
+ this.options.externalControl.show();
+ this._saving = false;
+ this._editing = false;
+ this._oldInnerHTML = null;
+ this.triggerCallback('onLeaveEditMode');
+ },
+ leaveHover: function(e) {
+ if (this.options.hoverClassName)
+ this.element.removeClassName(this.options.hoverClassName);
+ if (this._saving) return;
+ this.triggerCallback('onLeaveHover');
+ },
+ loadExternalText: function() {
+ this._form.addClassName(this.options.loadingClassName);
+ this._controls.editor.disabled = true;
+ var options = Object.extend({ method: 'get' }, this.options.ajaxOptions);
+ Object.extend(options, {
+ parameters: 'editorId=' + encodeURIComponent(this.element.id),
+ onComplete: Prototype.emptyFunction,
+ onSuccess: function(transport) {
+ this._form.removeClassName(this.options.loadingClassName);
+ var text = transport.responseText;
+ if (this.options.stripLoadedTextTags)
+ text = text.stripTags();
+ this._controls.editor.value = text;
+ this._controls.editor.disabled = false;
+ this.postProcessEditField();
+ }.bind(this),
+ onFailure: this._boundFailureHandler
+ });
+ new Ajax.Request(this.options.loadTextURL, options);
+ },
+ postProcessEditField: function() {
+ var fpc = this.options.fieldPostCreation;
+ if (fpc)
+ $(this._controls.editor)['focus' == fpc ? 'focus' : 'activate']();
+ },
+ prepareOptions: function() {
+ this.options = Object.clone(Ajax.InPlaceEditor.DefaultOptions);
+ Object.extend(this.options, Ajax.InPlaceEditor.DefaultCallbacks);
+ [this._extraDefaultOptions].flatten().compact().each(function(defs) {
+ Object.extend(this.options, defs);
+ }.bind(this));
+ },
+ prepareSubmission: function() {
+ this._saving = true;
+ this.removeForm();
+ this.leaveHover();
+ this.showSaving();
+ },
+ registerListeners: function() {
+ this._listeners = { };
+ var listener;
+ $H(Ajax.InPlaceEditor.Listeners).each(function(pair) {
+ listener = this[pair.value].bind(this);
+ this._listeners[pair.key] = listener;
+ if (!this.options.externalControlOnly)
+ this.element.observe(pair.key, listener);
+ if (this.options.externalControl)
+ this.options.externalControl.observe(pair.key, listener);
+ }.bind(this));
+ },
+ removeForm: function() {
+ if (!this._form) return;
+ this._form.remove();
+ this._form = null;
+ this._controls = { };
+ },
+ showSaving: function() {
+ this._oldInnerHTML = this.element.innerHTML;
+ this.element.innerHTML = this.options.savingText;
+ this.element.addClassName(this.options.savingClassName);
+ this.element.style.backgroundColor = this._originalBackground;
+ this.element.show();
+ },
+ triggerCallback: function(cbName, arg) {
+ if ('function' == typeof this.options[cbName]) {
+ this.options[cbName](this, arg);
+ }
+ },
+ unregisterListeners: function() {
+ $H(this._listeners).each(function(pair) {
+ if (!this.options.externalControlOnly)
+ this.element.stopObserving(pair.key, pair.value);
+ if (this.options.externalControl)
+ this.options.externalControl.stopObserving(pair.key, pair.value);
+ }.bind(this));
+ },
+ wrapUp: function(transport) {
+ this.leaveEditMode();
+ // Can't use triggerCallback due to backward compatibility: requires
+ // binding + direct element
+ this._boundComplete(transport, this.element);
+ }
+});
+
+Object.extend(Ajax.InPlaceEditor.prototype, {
+ dispose: Ajax.InPlaceEditor.prototype.destroy
+});
+
+Ajax.InPlaceCollectionEditor = Class.create(Ajax.InPlaceEditor, {
+ initialize: function($super, element, url, options) {
+ this._extraDefaultOptions = Ajax.InPlaceCollectionEditor.DefaultOptions;
+ $super(element, url, options);
+ },
+
+ createEditField: function() {
+ var list = document.createElement('select');
+ list.name = this.options.paramName;
+ list.size = 1;
+ this._controls.editor = list;
+ this._collection = this.options.collection || [];
+ if (this.options.loadCollectionURL)
+ this.loadCollection();
+ else
+ this.checkForExternalText();
+ this._form.appendChild(this._controls.editor);
+ },
+
+ loadCollection: function() {
+ this._form.addClassName(this.options.loadingClassName);
+ this.showLoadingText(this.options.loadingCollectionText);
+ var options = Object.extend({ method: 'get' }, this.options.ajaxOptions);
+ Object.extend(options, {
+ parameters: 'editorId=' + encodeURIComponent(this.element.id),
+ onComplete: Prototype.emptyFunction,
+ onSuccess: function(transport) {
+ var js = transport.responseText.strip();
+ if (!/^\[.*\]$/.test(js)) // TODO: improve sanity check
+ throw('Server returned an invalid collection representation.');
+ this._collection = eval(js);
+ this.checkForExternalText();
+ }.bind(this),
+ onFailure: this.onFailure
+ });
+ new Ajax.Request(this.options.loadCollectionURL, options);
+ },
+
+ showLoadingText: function(text) {
+ this._controls.editor.disabled = true;
+ var tempOption = this._controls.editor.firstChild;
+ if (!tempOption) {
+ tempOption = document.createElement('option');
+ tempOption.value = '';
+ this._controls.editor.appendChild(tempOption);
+ tempOption.selected = true;
+ }
+ tempOption.update((text || '').stripScripts().stripTags());
+ },
+
+ checkForExternalText: function() {
+ this._text = this.getText();
+ if (this.options.loadTextURL)
+ this.loadExternalText();
+ else
+ this.buildOptionList();
+ },
+
+ loadExternalText: function() {
+ this.showLoadingText(this.options.loadingText);
+ var options = Object.extend({ method: 'get' }, this.options.ajaxOptions);
+ Object.extend(options, {
+ parameters: 'editorId=' + encodeURIComponent(this.element.id),
+ onComplete: Prototype.emptyFunction,
+ onSuccess: function(transport) {
+ this._text = transport.responseText.strip();
+ this.buildOptionList();
+ }.bind(this),
+ onFailure: this.onFailure
+ });
+ new Ajax.Request(this.options.loadTextURL, options);
+ },
+
+ buildOptionList: function() {
+ this._form.removeClassName(this.options.loadingClassName);
+ this._collection = this._collection.map(function(entry) {
+ return 2 === entry.length ? entry : [entry, entry].flatten();
+ });
+ var marker = ('value' in this.options) ? this.options.value : this._text;
+ var textFound = this._collection.any(function(entry) {
+ return entry[0] == marker;
+ }.bind(this));
+ this._controls.editor.update('');
+ var option;
+ this._collection.each(function(entry, index) {
+ option = document.createElement('option');
+ option.value = entry[0];
+ option.selected = textFound ? entry[0] == marker : 0 == index;
+ option.appendChild(document.createTextNode(entry[1]));
+ this._controls.editor.appendChild(option);
+ }.bind(this));
+ this._controls.editor.disabled = false;
+ Field.scrollFreeActivate(this._controls.editor);
+ }
+});
+
+//**** DEPRECATION LAYER FOR InPlace[Collection]Editor! ****
+//**** This only exists for a while, in order to let ****
+//**** users adapt to the new API. Read up on the new ****
+//**** API and convert your code to it ASAP! ****
+
+Ajax.InPlaceEditor.prototype.initialize.dealWithDeprecatedOptions = function(options) {
+ if (!options) return;
+ function fallback(name, expr) {
+ if (name in options || expr === undefined) return;
+ options[name] = expr;
+ };
+ fallback('cancelControl', (options.cancelLink ? 'link' : (options.cancelButton ? 'button' :
+ options.cancelLink == options.cancelButton == false ? false : undefined)));
+ fallback('okControl', (options.okLink ? 'link' : (options.okButton ? 'button' :
+ options.okLink == options.okButton == false ? false : undefined)));
+ fallback('highlightColor', options.highlightcolor);
+ fallback('highlightEndColor', options.highlightendcolor);
+};
+
+Object.extend(Ajax.InPlaceEditor, {
+ DefaultOptions: {
+ ajaxOptions: { },
+ autoRows: 3, // Use when multi-line w/ rows == 1
+ cancelControl: 'link', // 'link'|'button'|false
+ cancelText: 'cancel',
+ clickToEditText: 'Click to edit',
+ externalControl: null, // id|elt
+ externalControlOnly: false,
+ fieldPostCreation: 'activate', // 'activate'|'focus'|false
+ formClassName: 'inplaceeditor-form',
+ formId: null, // id|elt
+ highlightColor: '#ffff99',
+ highlightEndColor: '#ffffff',
+ hoverClassName: '',
+ htmlResponse: true,
+ loadingClassName: 'inplaceeditor-loading',
+ loadingText: 'Loading...',
+ okControl: 'button', // 'link'|'button'|false
+ okText: 'ok',
+ paramName: 'value',
+ rows: 1, // If 1 and multi-line, uses autoRows
+ savingClassName: 'inplaceeditor-saving',
+ savingText: 'Saving...',
+ size: 0,
+ stripLoadedTextTags: false,
+ submitOnBlur: false,
+ textAfterControls: '',
+ textBeforeControls: '',
+ textBetweenControls: ''
+ },
+ DefaultCallbacks: {
+ callback: function(form) {
+ return Form.serialize(form);
+ },
+ onComplete: function(transport, element) {
+ // For backward compatibility, this one is bound to the IPE, and passes
+ // the element directly. It was too often customized, so we don't break it.
+ new Effect.Highlight(element, {
+ startcolor: this.options.highlightColor, keepBackgroundImage: true });
+ },
+ onEnterEditMode: null,
+ onEnterHover: function(ipe) {
+ ipe.element.style.backgroundColor = ipe.options.highlightColor;
+ if (ipe._effect)
+ ipe._effect.cancel();
+ },
+ onFailure: function(transport, ipe) {
+ alert('Error communication with the server: ' + transport.responseText.stripTags());
+ },
+ onFormCustomization: null, // Takes the IPE and its generated form, after editor, before controls.
+ onLeaveEditMode: null,
+ onLeaveHover: function(ipe) {
+ ipe._effect = new Effect.Highlight(ipe.element, {
+ startcolor: ipe.options.highlightColor, endcolor: ipe.options.highlightEndColor,
+ restorecolor: ipe._originalBackground, keepBackgroundImage: true
+ });
+ }
+ },
+ Listeners: {
+ click: 'enterEditMode',
+ keydown: 'checkForEscapeOrReturn',
+ mouseover: 'enterHover',
+ mouseout: 'leaveHover'
+ }
+});
+
+Ajax.InPlaceCollectionEditor.DefaultOptions = {
+ loadingCollectionText: 'Loading options...'
+};
+
+// Delayed observer, like Form.Element.Observer,
+// but waits for delay after last key input
+// Ideal for live-search fields
+
+Form.Element.DelayedObserver = Class.create({
+ initialize: function(element, delay, callback) {
+ this.delay = delay || 0.5;
+ this.element = $(element);
+ this.callback = callback;
+ this.timer = null;
+ this.lastValue = $F(this.element);
+ Event.observe(this.element,'keyup',this.delayedListener.bindAsEventListener(this));
+ },
+ delayedListener: function(event) {
+ if(this.lastValue == $F(this.element)) return;
+ if(this.timer) clearTimeout(this.timer);
+ this.timer = setTimeout(this.onTimerEvent.bind(this), this.delay * 1000);
+ this.lastValue = $F(this.element);
+ },
+ onTimerEvent: function() {
+ this.timer = null;
+ this.callback(this.element, $F(this.element));
+ }
+}); \ No newline at end of file
diff --git a/js/script.aculo.us/dragdrop.js b/js/script.aculo.us/dragdrop.js
new file mode 100644
index 0000000..9ebfe24
--- /dev/null
+++ b/js/script.aculo.us/dragdrop.js
@@ -0,0 +1,974 @@
+// script.aculo.us dragdrop.js v1.9.0, Thu Dec 23 16:54:48 -0500 2010
+
+// Copyright (c) 2005-2010 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+//
+// script.aculo.us is freely distributable under the terms of an MIT-style license.
+// For details, see the script.aculo.us web site: http://script.aculo.us/
+
+if(Object.isUndefined(Effect))
+ throw("dragdrop.js requires including script.aculo.us' effects.js library");
+
+var Droppables = {
+ drops: [],
+
+ remove: function(element) {
+ this.drops = this.drops.reject(function(d) { return d.element==$(element) });
+ },
+
+ add: function(element) {
+ element = $(element);
+ var options = Object.extend({
+ greedy: true,
+ hoverclass: null,
+ tree: false
+ }, arguments[1] || { });
+
+ // cache containers
+ if(options.containment) {
+ options._containers = [];
+ var containment = options.containment;
+ if(Object.isArray(containment)) {
+ containment.each( function(c) { options._containers.push($(c)) });
+ } else {
+ options._containers.push($(containment));
+ }
+ }
+
+ if(options.accept) options.accept = [options.accept].flatten();
+
+ Element.makePositioned(element); // fix IE
+ options.element = element;
+
+ this.drops.push(options);
+ },
+
+ findDeepestChild: function(drops) {
+ deepest = drops[0];
+
+ for (i = 1; i < drops.length; ++i)
+ if (Element.isParent(drops[i].element, deepest.element))
+ deepest = drops[i];
+
+ return deepest;
+ },
+
+ isContained: function(element, drop) {
+ var containmentNode;
+ if(drop.tree) {
+ containmentNode = element.treeNode;
+ } else {
+ containmentNode = element.parentNode;
+ }
+ return drop._containers.detect(function(c) { return containmentNode == c });
+ },
+
+ isAffected: function(point, element, drop) {
+ return (
+ (drop.element!=element) &&
+ ((!drop._containers) ||
+ this.isContained(element, drop)) &&
+ ((!drop.accept) ||
+ (Element.classNames(element).detect(
+ function(v) { return drop.accept.include(v) } ) )) &&
+ Position.within(drop.element, point[0], point[1]) );
+ },
+
+ deactivate: function(drop) {
+ if(drop.hoverclass)
+ Element.removeClassName(drop.element, drop.hoverclass);
+ this.last_active = null;
+ },
+
+ activate: function(drop) {
+ if(drop.hoverclass)
+ Element.addClassName(drop.element, drop.hoverclass);
+ this.last_active = drop;
+ },
+
+ show: function(point, element) {
+ if(!this.drops.length) return;
+ var drop, affected = [];
+
+ this.drops.each( function(drop) {
+ if(Droppables.isAffected(point, element, drop))
+ affected.push(drop);
+ });
+
+ if(affected.length>0)
+ drop = Droppables.findDeepestChild(affected);
+
+ if(this.last_active && this.last_active != drop) this.deactivate(this.last_active);
+ if (drop) {
+ Position.within(drop.element, point[0], point[1]);
+ if(drop.onHover)
+ drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element));
+
+ if (drop != this.last_active) Droppables.activate(drop);
+ }
+ },
+
+ fire: function(event, element) {
+ if(!this.last_active) return;
+ Position.prepare();
+
+ if (this.isAffected([Event.pointerX(event), Event.pointerY(event)], element, this.last_active))
+ if (this.last_active.onDrop) {
+ this.last_active.onDrop(element, this.last_active.element, event);
+ return true;
+ }
+ },
+
+ reset: function() {
+ if(this.last_active)
+ this.deactivate(this.last_active);
+ }
+};
+
+var Draggables = {
+ drags: [],
+ observers: [],
+
+ register: function(draggable) {
+ if(this.drags.length == 0) {
+ this.eventMouseUp = this.endDrag.bindAsEventListener(this);
+ this.eventMouseMove = this.updateDrag.bindAsEventListener(this);
+ this.eventKeypress = this.keyPress.bindAsEventListener(this);
+
+ Event.observe(document, "mouseup", this.eventMouseUp);
+ Event.observe(document, "mousemove", this.eventMouseMove);
+ Event.observe(document, "keypress", this.eventKeypress);
+ }
+ this.drags.push(draggable);
+ },
+
+ unregister: function(draggable) {
+ this.drags = this.drags.reject(function(d) { return d==draggable });
+ if(this.drags.length == 0) {
+ Event.stopObserving(document, "mouseup", this.eventMouseUp);
+ Event.stopObserving(document, "mousemove", this.eventMouseMove);
+ Event.stopObserving(document, "keypress", this.eventKeypress);
+ }
+ },
+
+ activate: function(draggable) {
+ if(draggable.options.delay) {
+ this._timeout = setTimeout(function() {
+ Draggables._timeout = null;
+ window.focus();
+ Draggables.activeDraggable = draggable;
+ }.bind(this), draggable.options.delay);
+ } else {
+ window.focus(); // allows keypress events if window isn't currently focused, fails for Safari
+ this.activeDraggable = draggable;
+ }
+ },
+
+ deactivate: function() {
+ this.activeDraggable = null;
+ },
+
+ updateDrag: function(event) {
+ if(!this.activeDraggable) return;
+ var pointer = [Event.pointerX(event), Event.pointerY(event)];
+ // Mozilla-based browsers fire successive mousemove events with
+ // the same coordinates, prevent needless redrawing (moz bug?)
+ if(this._lastPointer && (this._lastPointer.inspect() == pointer.inspect())) return;
+ this._lastPointer = pointer;
+
+ this.activeDraggable.updateDrag(event, pointer);
+ },
+
+ endDrag: function(event) {
+ if(this._timeout) {
+ clearTimeout(this._timeout);
+ this._timeout = null;
+ }
+ if(!this.activeDraggable) return;
+ this._lastPointer = null;
+ this.activeDraggable.endDrag(event);
+ this.activeDraggable = null;
+ },
+
+ keyPress: function(event) {
+ if(this.activeDraggable)
+ this.activeDraggable.keyPress(event);
+ },
+
+ addObserver: function(observer) {
+ this.observers.push(observer);
+ this._cacheObserverCallbacks();
+ },
+
+ removeObserver: function(element) { // element instead of observer fixes mem leaks
+ this.observers = this.observers.reject( function(o) { return o.element==element });
+ this._cacheObserverCallbacks();
+ },
+
+ notify: function(eventName, draggable, event) { // 'onStart', 'onEnd', 'onDrag'
+ if(this[eventName+'Count'] > 0)
+ this.observers.each( function(o) {
+ if(o[eventName]) o[eventName](eventName, draggable, event);
+ });
+ if(draggable.options[eventName]) draggable.options[eventName](draggable, event);
+ },
+
+ _cacheObserverCallbacks: function() {
+ ['onStart','onEnd','onDrag'].each( function(eventName) {
+ Draggables[eventName+'Count'] = Draggables.observers.select(
+ function(o) { return o[eventName]; }
+ ).length;
+ });
+ }
+};
+
+/*--------------------------------------------------------------------------*/
+
+var Draggable = Class.create({
+ initialize: function(element) {
+ var defaults = {
+ handle: false,
+ reverteffect: function(element, top_offset, left_offset) {
+ var dur = Math.sqrt(Math.abs(top_offset^2)+Math.abs(left_offset^2))*0.02;
+ new Effect.Move(element, { x: -left_offset, y: -top_offset, duration: dur,
+ queue: {scope:'_draggable', position:'end'}
+ });
+ },
+ endeffect: function(element) {
+ var toOpacity = Object.isNumber(element._opacity) ? element._opacity : 1.0;
+ new Effect.Opacity(element, {duration:0.2, from:0.7, to:toOpacity,
+ queue: {scope:'_draggable', position:'end'},
+ afterFinish: function(){
+ Draggable._dragging[element] = false
+ }
+ });
+ },
+ zindex: 1000,
+ revert: false,
+ quiet: false,
+ scroll: false,
+ scrollSensitivity: 20,
+ scrollSpeed: 15,
+ snap: false, // false, or xy or [x,y] or function(x,y){ return [x,y] }
+ delay: 0
+ };
+
+ if(!arguments[1] || Object.isUndefined(arguments[1].endeffect))
+ Object.extend(defaults, {
+ starteffect: function(element) {
+ element._opacity = Element.getOpacity(element);
+ Draggable._dragging[element] = true;
+ new Effect.Opacity(element, {duration:0.2, from:element._opacity, to:0.7});
+ }
+ });
+
+ var options = Object.extend(defaults, arguments[1] || { });
+
+ this.element = $(element);
+
+ if(options.handle && Object.isString(options.handle))
+ this.handle = this.element.down('.'+options.handle, 0);
+
+ if(!this.handle) this.handle = $(options.handle);
+ if(!this.handle) this.handle = this.element;
+
+ if(options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML) {
+ options.scroll = $(options.scroll);
+ this._isScrollChild = Element.childOf(this.element, options.scroll);
+ }
+
+ Element.makePositioned(this.element); // fix IE
+
+ this.options = options;
+ this.dragging = false;
+
+ this.eventMouseDown = this.initDrag.bindAsEventListener(this);
+ Event.observe(this.handle, "mousedown", this.eventMouseDown);
+
+ Draggables.register(this);
+ },
+
+ destroy: function() {
+ Event.stopObserving(this.handle, "mousedown", this.eventMouseDown);
+ Draggables.unregister(this);
+ },
+
+ currentDelta: function() {
+ return([
+ parseInt(Element.getStyle(this.element,'left') || '0'),
+ parseInt(Element.getStyle(this.element,'top') || '0')]);
+ },
+
+ initDrag: function(event) {
+ if(!Object.isUndefined(Draggable._dragging[this.element]) &&
+ Draggable._dragging[this.element]) return;
+ if(Event.isLeftClick(event)) {
+ // abort on form elements, fixes a Firefox issue
+ var src = Event.element(event);
+ if((tag_name = src.tagName.toUpperCase()) && (
+ tag_name=='INPUT' ||
+ tag_name=='SELECT' ||
+ tag_name=='OPTION' ||
+ tag_name=='BUTTON' ||
+ tag_name=='TEXTAREA')) return;
+
+ var pointer = [Event.pointerX(event), Event.pointerY(event)];
+ var pos = this.element.cumulativeOffset();
+ this.offset = [0,1].map( function(i) { return (pointer[i] - pos[i]) });
+
+ Draggables.activate(this);
+ Event.stop(event);
+ }
+ },
+
+ startDrag: function(event) {
+ this.dragging = true;
+ if(!this.delta)
+ this.delta = this.currentDelta();
+
+ if(this.options.zindex) {
+ this.originalZ = parseInt(Element.getStyle(this.element,'z-index') || 0);
+ this.element.style.zIndex = this.options.zindex;
+ }
+
+ if(this.options.ghosting) {
+ this._clone = this.element.cloneNode(true);
+ this._originallyAbsolute = (this.element.getStyle('position') == 'absolute');
+ if (!this._originallyAbsolute)
+ Position.absolutize(this.element);
+ this.element.parentNode.insertBefore(this._clone, this.element);
+ }
+
+ if(this.options.scroll) {
+ if (this.options.scroll == window) {
+ var where = this._getWindowScroll(this.options.scroll);
+ this.originalScrollLeft = where.left;
+ this.originalScrollTop = where.top;
+ } else {
+ this.originalScrollLeft = this.options.scroll.scrollLeft;
+ this.originalScrollTop = this.options.scroll.scrollTop;
+ }
+ }
+
+ Draggables.notify('onStart', this, event);
+
+ if(this.options.starteffect) this.options.starteffect(this.element);
+ },
+
+ updateDrag: function(event, pointer) {
+ if(!this.dragging) this.startDrag(event);
+
+ if(!this.options.quiet){
+ Position.prepare();
+ Droppables.show(pointer, this.element);
+ }
+
+ Draggables.notify('onDrag', this, event);
+
+ this.draw(pointer);
+ if(this.options.change) this.options.change(this);
+
+ if(this.options.scroll) {
+ this.stopScrolling();
+
+ var p;
+ if (this.options.scroll == window) {
+ with(this._getWindowScroll(this.options.scroll)) { p = [ left, top, left+width, top+height ]; }
+ } else {
+ p = Position.page(this.options.scroll).toArray();
+ p[0] += this.options.scroll.scrollLeft + Position.deltaX;
+ p[1] += this.options.scroll.scrollTop + Position.deltaY;
+ p.push(p[0]+this.options.scroll.offsetWidth);
+ p.push(p[1]+this.options.scroll.offsetHeight);
+ }
+ var speed = [0,0];
+ if(pointer[0] < (p[0]+this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[0]+this.options.scrollSensitivity);
+ if(pointer[1] < (p[1]+this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[1]+this.options.scrollSensitivity);
+ if(pointer[0] > (p[2]-this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[2]-this.options.scrollSensitivity);
+ if(pointer[1] > (p[3]-this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[3]-this.options.scrollSensitivity);
+ this.startScrolling(speed);
+ }
+
+ // fix AppleWebKit rendering
+ if(Prototype.Browser.WebKit) window.scrollBy(0,0);
+
+ Event.stop(event);
+ },
+
+ finishDrag: function(event, success) {
+ this.dragging = false;
+
+ if(this.options.quiet){
+ Position.prepare();
+ var pointer = [Event.pointerX(event), Event.pointerY(event)];
+ Droppables.show(pointer, this.element);
+ }
+
+ if(this.options.ghosting) {
+ if (!this._originallyAbsolute)
+ Position.relativize(this.element);
+ delete this._originallyAbsolute;
+ Element.remove(this._clone);
+ this._clone = null;
+ }
+
+ var dropped = false;
+ if(success) {
+ dropped = Droppables.fire(event, this.element);
+ if (!dropped) dropped = false;
+ }
+ if(dropped && this.options.onDropped) this.options.onDropped(this.element);
+ Draggables.notify('onEnd', this, event);
+
+ var revert = this.options.revert;
+ if(revert && Object.isFunction(revert)) revert = revert(this.element);
+
+ var d = this.currentDelta();
+ if(revert && this.options.reverteffect) {
+ if (dropped == 0 || revert != 'failure')
+ this.options.reverteffect(this.element,
+ d[1]-this.delta[1], d[0]-this.delta[0]);
+ } else {
+ this.delta = d;
+ }
+
+ if(this.options.zindex)
+ this.element.style.zIndex = this.originalZ;
+
+ if(this.options.endeffect)
+ this.options.endeffect(this.element);
+
+ Draggables.deactivate(this);
+ Droppables.reset();
+ },
+
+ keyPress: function(event) {
+ if(event.keyCode!=Event.KEY_ESC) return;
+ this.finishDrag(event, false);
+ Event.stop(event);
+ },
+
+ endDrag: function(event) {
+ if(!this.dragging) return;
+ this.stopScrolling();
+ this.finishDrag(event, true);
+ Event.stop(event);
+ },
+
+ draw: function(point) {
+ var pos = this.element.cumulativeOffset();
+ if(this.options.ghosting) {
+ var r = Position.realOffset(this.element);
+ pos[0] += r[0] - Position.deltaX; pos[1] += r[1] - Position.deltaY;
+ }
+
+ var d = this.currentDelta();
+ pos[0] -= d[0]; pos[1] -= d[1];
+
+ if(this.options.scroll && (this.options.scroll != window && this._isScrollChild)) {
+ pos[0] -= this.options.scroll.scrollLeft-this.originalScrollLeft;
+ pos[1] -= this.options.scroll.scrollTop-this.originalScrollTop;
+ }
+
+ var p = [0,1].map(function(i){
+ return (point[i]-pos[i]-this.offset[i])
+ }.bind(this));
+
+ if(this.options.snap) {
+ if(Object.isFunction(this.options.snap)) {
+ p = this.options.snap(p[0],p[1],this);
+ } else {
+ if(Object.isArray(this.options.snap)) {
+ p = p.map( function(v, i) {
+ return (v/this.options.snap[i]).round()*this.options.snap[i] }.bind(this));
+ } else {
+ p = p.map( function(v) {
+ return (v/this.options.snap).round()*this.options.snap }.bind(this));
+ }
+ }}
+
+ var style = this.element.style;
+ if((!this.options.constraint) || (this.options.constraint=='horizontal'))
+ style.left = p[0] + "px";
+ if((!this.options.constraint) || (this.options.constraint=='vertical'))
+ style.top = p[1] + "px";
+
+ if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering
+ },
+
+ stopScrolling: function() {
+ if(this.scrollInterval) {
+ clearInterval(this.scrollInterval);
+ this.scrollInterval = null;
+ Draggables._lastScrollPointer = null;
+ }
+ },
+
+ startScrolling: function(speed) {
+ if(!(speed[0] || speed[1])) return;
+ this.scrollSpeed = [speed[0]*this.options.scrollSpeed,speed[1]*this.options.scrollSpeed];
+ this.lastScrolled = new Date();
+ this.scrollInterval = setInterval(this.scroll.bind(this), 10);
+ },
+
+ scroll: function() {
+ var current = new Date();
+ var delta = current - this.lastScrolled;
+ this.lastScrolled = current;
+ if(this.options.scroll == window) {
+ with (this._getWindowScroll(this.options.scroll)) {
+ if (this.scrollSpeed[0] || this.scrollSpeed[1]) {
+ var d = delta / 1000;
+ this.options.scroll.scrollTo( left + d*this.scrollSpeed[0], top + d*this.scrollSpeed[1] );
+ }
+ }
+ } else {
+ this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000;
+ this.options.scroll.scrollTop += this.scrollSpeed[1] * delta / 1000;
+ }
+
+ Position.prepare();
+ Droppables.show(Draggables._lastPointer, this.element);
+ Draggables.notify('onDrag', this);
+ if (this._isScrollChild) {
+ Draggables._lastScrollPointer = Draggables._lastScrollPointer || $A(Draggables._lastPointer);
+ Draggables._lastScrollPointer[0] += this.scrollSpeed[0] * delta / 1000;
+ Draggables._lastScrollPointer[1] += this.scrollSpeed[1] * delta / 1000;
+ if (Draggables._lastScrollPointer[0] < 0)
+ Draggables._lastScrollPointer[0] = 0;
+ if (Draggables._lastScrollPointer[1] < 0)
+ Draggables._lastScrollPointer[1] = 0;
+ this.draw(Draggables._lastScrollPointer);
+ }
+
+ if(this.options.change) this.options.change(this);
+ },
+
+ _getWindowScroll: function(w) {
+ var T, L, W, H;
+ with (w.document) {
+ if (w.document.documentElement && documentElement.scrollTop) {
+ T = documentElement.scrollTop;
+ L = documentElement.scrollLeft;
+ } else if (w.document.body) {
+ T = body.scrollTop;
+ L = body.scrollLeft;
+ }
+ if (w.innerWidth) {
+ W = w.innerWidth;
+ H = w.innerHeight;
+ } else if (w.document.documentElement && documentElement.clientWidth) {
+ W = documentElement.clientWidth;
+ H = documentElement.clientHeight;
+ } else {
+ W = body.offsetWidth;
+ H = body.offsetHeight;
+ }
+ }
+ return { top: T, left: L, width: W, height: H };
+ }
+});
+
+Draggable._dragging = { };
+
+/*--------------------------------------------------------------------------*/
+
+var SortableObserver = Class.create({
+ initialize: function(element, observer) {
+ this.element = $(element);
+ this.observer = observer;
+ this.lastValue = Sortable.serialize(this.element);
+ },
+
+ onStart: function() {
+ this.lastValue = Sortable.serialize(this.element);
+ },
+
+ onEnd: function() {
+ Sortable.unmark();
+ if(this.lastValue != Sortable.serialize(this.element))
+ this.observer(this.element)
+ }
+});
+
+var Sortable = {
+ SERIALIZE_RULE: /^[^_\-](?:[A-Za-z0-9\-\_]*)[_](.*)$/,
+
+ sortables: { },
+
+ _findRootElement: function(element) {
+ while (element.tagName.toUpperCase() != "BODY") {
+ if(element.id && Sortable.sortables[element.id]) return element;
+ element = element.parentNode;
+ }
+ },
+
+ options: function(element) {
+ element = Sortable._findRootElement($(element));
+ if(!element) return;
+ return Sortable.sortables[element.id];
+ },
+
+ destroy: function(element){
+ element = $(element);
+ var s = Sortable.sortables[element.id];
+
+ if(s) {
+ Draggables.removeObserver(s.element);
+ s.droppables.each(function(d){ Droppables.remove(d) });
+ s.draggables.invoke('destroy');
+
+ delete Sortable.sortables[s.element.id];
+ }
+ },
+
+ create: function(element) {
+ element = $(element);
+ var options = Object.extend({
+ element: element,
+ tag: 'li', // assumes li children, override with tag: 'tagname'
+ dropOnEmpty: false,
+ tree: false,
+ treeTag: 'ul',
+ overlap: 'vertical', // one of 'vertical', 'horizontal'
+ constraint: 'vertical', // one of 'vertical', 'horizontal', false
+ containment: element, // also takes array of elements (or id's); or false
+ handle: false, // or a CSS class
+ only: false,
+ delay: 0,
+ hoverclass: null,
+ ghosting: false,
+ quiet: false,
+ scroll: false,
+ scrollSensitivity: 20,
+ scrollSpeed: 15,
+ format: this.SERIALIZE_RULE,
+
+ // these take arrays of elements or ids and can be
+ // used for better initialization performance
+ elements: false,
+ handles: false,
+
+ onChange: Prototype.emptyFunction,
+ onUpdate: Prototype.emptyFunction
+ }, arguments[1] || { });
+
+ // clear any old sortable with same element
+ this.destroy(element);
+
+ // build options for the draggables
+ var options_for_draggable = {
+ revert: true,
+ quiet: options.quiet,
+ scroll: options.scroll,
+ scrollSpeed: options.scrollSpeed,
+ scrollSensitivity: options.scrollSensitivity,
+ delay: options.delay,
+ ghosting: options.ghosting,
+ constraint: options.constraint,
+ handle: options.handle };
+
+ if(options.starteffect)
+ options_for_draggable.starteffect = options.starteffect;
+
+ if(options.reverteffect)
+ options_for_draggable.reverteffect = options.reverteffect;
+ else
+ if(options.ghosting) options_for_draggable.reverteffect = function(element) {
+ element.style.top = 0;
+ element.style.left = 0;
+ };
+
+ if(options.endeffect)
+ options_for_draggable.endeffect = options.endeffect;
+
+ if(options.zindex)
+ options_for_draggable.zindex = options.zindex;
+
+ // build options for the droppables
+ var options_for_droppable = {
+ overlap: options.overlap,
+ containment: options.containment,
+ tree: options.tree,
+ hoverclass: options.hoverclass,
+ onHover: Sortable.onHover
+ };
+
+ var options_for_tree = {
+ onHover: Sortable.onEmptyHover,
+ overlap: options.overlap,
+ containment: options.containment,
+ hoverclass: options.hoverclass
+ };
+
+ // fix for gecko engine
+ Element.cleanWhitespace(element);
+
+ options.draggables = [];
+ options.droppables = [];
+
+ // drop on empty handling
+ if(options.dropOnEmpty || options.tree) {
+ Droppables.add(element, options_for_tree);
+ options.droppables.push(element);
+ }
+
+ (options.elements || this.findElements(element, options) || []).each( function(e,i) {
+ var handle = options.handles ? $(options.handles[i]) :
+ (options.handle ? $(e).select('.' + options.handle)[0] : e);
+ options.draggables.push(
+ new Draggable(e, Object.extend(options_for_draggable, { handle: handle })));
+ Droppables.add(e, options_for_droppable);
+ if(options.tree) e.treeNode = element;
+ options.droppables.push(e);
+ });
+
+ if(options.tree) {
+ (Sortable.findTreeElements(element, options) || []).each( function(e) {
+ Droppables.add(e, options_for_tree);
+ e.treeNode = element;
+ options.droppables.push(e);
+ });
+ }
+
+ // keep reference
+ this.sortables[element.identify()] = options;
+
+ // for onupdate
+ Draggables.addObserver(new SortableObserver(element, options.onUpdate));
+
+ },
+
+ // return all suitable-for-sortable elements in a guaranteed order
+ findElements: function(element, options) {
+ return Element.findChildren(
+ element, options.only, options.tree ? true : false, options.tag);
+ },
+
+ findTreeElements: function(element, options) {
+ return Element.findChildren(
+ element, options.only, options.tree ? true : false, options.treeTag);
+ },
+
+ onHover: function(element, dropon, overlap) {
+ if(Element.isParent(dropon, element)) return;
+
+ if(overlap > .33 && overlap < .66 && Sortable.options(dropon).tree) {
+ return;
+ } else if(overlap>0.5) {
+ Sortable.mark(dropon, 'before');
+ if(dropon.previousSibling != element) {
+ var oldParentNode = element.parentNode;
+ element.style.visibility = "hidden"; // fix gecko rendering
+ dropon.parentNode.insertBefore(element, dropon);
+ if(dropon.parentNode!=oldParentNode)
+ Sortable.options(oldParentNode).onChange(element);
+ Sortable.options(dropon.parentNode).onChange(element);
+ }
+ } else {
+ Sortable.mark(dropon, 'after');
+ var nextElement = dropon.nextSibling || null;
+ if(nextElement != element) {
+ var oldParentNode = element.parentNode;
+ element.style.visibility = "hidden"; // fix gecko rendering
+ dropon.parentNode.insertBefore(element, nextElement);
+ if(dropon.parentNode!=oldParentNode)
+ Sortable.options(oldParentNode).onChange(element);
+ Sortable.options(dropon.parentNode).onChange(element);
+ }
+ }
+ },
+
+ onEmptyHover: function(element, dropon, overlap) {
+ var oldParentNode = element.parentNode;
+ var droponOptions = Sortable.options(dropon);
+
+ if(!Element.isParent(dropon, element)) {
+ var index;
+
+ var children = Sortable.findElements(dropon, {tag: droponOptions.tag, only: droponOptions.only});
+ var child = null;
+
+ if(children) {
+ var offset = Element.offsetSize(dropon, droponOptions.overlap) * (1.0 - overlap);
+
+ for (index = 0; index < children.length; index += 1) {
+ if (offset - Element.offsetSize (children[index], droponOptions.overlap) >= 0) {
+ offset -= Element.offsetSize (children[index], droponOptions.overlap);
+ } else if (offset - (Element.offsetSize (children[index], droponOptions.overlap) / 2) >= 0) {
+ child = index + 1 < children.length ? children[index + 1] : null;
+ break;
+ } else {
+ child = children[index];
+ break;
+ }
+ }
+ }
+
+ dropon.insertBefore(element, child);
+
+ Sortable.options(oldParentNode).onChange(element);
+ droponOptions.onChange(element);
+ }
+ },
+
+ unmark: function() {
+ if(Sortable._marker) Sortable._marker.hide();
+ },
+
+ mark: function(dropon, position) {
+ // mark on ghosting only
+ var sortable = Sortable.options(dropon.parentNode);
+ if(sortable && !sortable.ghosting) return;
+
+ if(!Sortable._marker) {
+ Sortable._marker =
+ ($('dropmarker') || Element.extend(document.createElement('DIV'))).
+ hide().addClassName('dropmarker').setStyle({position:'absolute'});
+ document.getElementsByTagName("body").item(0).appendChild(Sortable._marker);
+ }
+ var offsets = dropon.cumulativeOffset();
+ Sortable._marker.setStyle({left: offsets[0]+'px', top: offsets[1] + 'px'});
+
+ if(position=='after')
+ if(sortable.overlap == 'horizontal')
+ Sortable._marker.setStyle({left: (offsets[0]+dropon.clientWidth) + 'px'});
+ else
+ Sortable._marker.setStyle({top: (offsets[1]+dropon.clientHeight) + 'px'});
+
+ Sortable._marker.show();
+ },
+
+ _tree: function(element, options, parent) {
+ var children = Sortable.findElements(element, options) || [];
+
+ for (var i = 0; i < children.length; ++i) {
+ var match = children[i].id.match(options.format);
+
+ if (!match) continue;
+
+ var child = {
+ id: encodeURIComponent(match ? match[1] : null),
+ element: element,
+ parent: parent,
+ children: [],
+ position: parent.children.length,
+ container: $(children[i]).down(options.treeTag)
+ };
+
+ /* Get the element containing the children and recurse over it */
+ if (child.container)
+ this._tree(child.container, options, child);
+
+ parent.children.push (child);
+ }
+
+ return parent;
+ },
+
+ tree: function(element) {
+ element = $(element);
+ var sortableOptions = this.options(element);
+ var options = Object.extend({
+ tag: sortableOptions.tag,
+ treeTag: sortableOptions.treeTag,
+ only: sortableOptions.only,
+ name: element.id,
+ format: sortableOptions.format
+ }, arguments[1] || { });
+
+ var root = {
+ id: null,
+ parent: null,
+ children: [],
+ container: element,
+ position: 0
+ };
+
+ return Sortable._tree(element, options, root);
+ },
+
+ /* Construct a [i] index for a particular node */
+ _constructIndex: function(node) {
+ var index = '';
+ do {
+ if (node.id) index = '[' + node.position + ']' + index;
+ } while ((node = node.parent) != null);
+ return index;
+ },
+
+ sequence: function(element) {
+ element = $(element);
+ var options = Object.extend(this.options(element), arguments[1] || { });
+
+ return $(this.findElements(element, options) || []).map( function(item) {
+ return item.id.match(options.format) ? item.id.match(options.format)[1] : '';
+ });
+ },
+
+ setSequence: function(element, new_sequence) {
+ element = $(element);
+ var options = Object.extend(this.options(element), arguments[2] || { });
+
+ var nodeMap = { };
+ this.findElements(element, options).each( function(n) {
+ if (n.id.match(options.format))
+ nodeMap[n.id.match(options.format)[1]] = [n, n.parentNode];
+ n.parentNode.removeChild(n);
+ });
+
+ new_sequence.each(function(ident) {
+ var n = nodeMap[ident];
+ if (n) {
+ n[1].appendChild(n[0]);
+ delete nodeMap[ident];
+ }
+ });
+ },
+
+ serialize: function(element) {
+ element = $(element);
+ var options = Object.extend(Sortable.options(element), arguments[1] || { });
+ var name = encodeURIComponent(
+ (arguments[1] && arguments[1].name) ? arguments[1].name : element.id);
+
+ if (options.tree) {
+ return Sortable.tree(element, arguments[1]).children.map( function (item) {
+ return [name + Sortable._constructIndex(item) + "[id]=" +
+ encodeURIComponent(item.id)].concat(item.children.map(arguments.callee));
+ }).flatten().join('&');
+ } else {
+ return Sortable.sequence(element, arguments[1]).map( function(item) {
+ return name + "[]=" + encodeURIComponent(item);
+ }).join('&');
+ }
+ }
+};
+
+// Returns true if child is contained within element
+Element.isParent = function(child, element) {
+ if (!child.parentNode || child == element) return false;
+ if (child.parentNode == element) return true;
+ return Element.isParent(child.parentNode, element);
+};
+
+Element.findChildren = function(element, only, recursive, tagName) {
+ if(!element.hasChildNodes()) return null;
+ tagName = tagName.toUpperCase();
+ if(only) only = [only].flatten();
+ var elements = [];
+ $A(element.childNodes).each( function(e) {
+ if(e.tagName && e.tagName.toUpperCase()==tagName &&
+ (!only || (Element.classNames(e).detect(function(v) { return only.include(v) }))))
+ elements.push(e);
+ if(recursive) {
+ var grandchildren = Element.findChildren(e, only, recursive, tagName);
+ if(grandchildren) elements.push(grandchildren);
+ }
+ });
+
+ return (elements.length>0 ? elements.flatten() : []);
+};
+
+Element.offsetSize = function (element, type) {
+ return element['offset' + ((type=='vertical' || type=='height') ? 'Height' : 'Width')];
+}; \ No newline at end of file
diff --git a/js/script.aculo.us/effects.js b/js/script.aculo.us/effects.js
new file mode 100644
index 0000000..860ddc0
--- /dev/null
+++ b/js/script.aculo.us/effects.js
@@ -0,0 +1,1123 @@
+// script.aculo.us effects.js v1.9.0, Thu Dec 23 16:54:48 -0500 2010
+
+// Copyright (c) 2005-2010 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+// Contributors:
+// Justin Palmer (http://encytemedia.com/)
+// Mark Pilgrim (http://diveintomark.org/)
+// Martin Bialasinki
+//
+// script.aculo.us is freely distributable under the terms of an MIT-style license.
+// For details, see the script.aculo.us web site: http://script.aculo.us/
+
+// converts rgb() and #xxx to #xxxxxx format,
+// returns self (or first argument) if not convertable
+String.prototype.parseColor = function() {
+ var color = '#';
+ if (this.slice(0,4) == 'rgb(') {
+ var cols = this.slice(4,this.length-1).split(',');
+ var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3);
+ } else {
+ if (this.slice(0,1) == '#') {
+ if (this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase();
+ if (this.length==7) color = this.toLowerCase();
+ }
+ }
+ return (color.length==7 ? color : (arguments[0] || this));
+};
+
+/*--------------------------------------------------------------------------*/
+
+Element.collectTextNodes = function(element) {
+ return $A($(element).childNodes).collect( function(node) {
+ return (node.nodeType==3 ? node.nodeValue :
+ (node.hasChildNodes() ? Element.collectTextNodes(node) : ''));
+ }).flatten().join('');
+};
+
+Element.collectTextNodesIgnoreClass = function(element, className) {
+ return $A($(element).childNodes).collect( function(node) {
+ return (node.nodeType==3 ? node.nodeValue :
+ ((node.hasChildNodes() && !Element.hasClassName(node,className)) ?
+ Element.collectTextNodesIgnoreClass(node, className) : ''));
+ }).flatten().join('');
+};
+
+Element.setContentZoom = function(element, percent) {
+ element = $(element);
+ element.setStyle({fontSize: (percent/100) + 'em'});
+ if (Prototype.Browser.WebKit) window.scrollBy(0,0);
+ return element;
+};
+
+Element.getInlineOpacity = function(element){
+ return $(element).style.opacity || '';
+};
+
+Element.forceRerendering = function(element) {
+ try {
+ element = $(element);
+ var n = document.createTextNode(' ');
+ element.appendChild(n);
+ element.removeChild(n);
+ } catch(e) { }
+};
+
+/*--------------------------------------------------------------------------*/
+
+var Effect = {
+ _elementDoesNotExistError: {
+ name: 'ElementDoesNotExistError',
+ message: 'The specified DOM element does not exist, but is required for this effect to operate'
+ },
+ Transitions: {
+ linear: Prototype.K,
+ sinoidal: function(pos) {
+ return (-Math.cos(pos*Math.PI)/2) + .5;
+ },
+ reverse: function(pos) {
+ return 1-pos;
+ },
+ flicker: function(pos) {
+ var pos = ((-Math.cos(pos*Math.PI)/4) + .75) + Math.random()/4;
+ return pos > 1 ? 1 : pos;
+ },
+ wobble: function(pos) {
+ return (-Math.cos(pos*Math.PI*(9*pos))/2) + .5;
+ },
+ pulse: function(pos, pulses) {
+ return (-Math.cos((pos*((pulses||5)-.5)*2)*Math.PI)/2) + .5;
+ },
+ spring: function(pos) {
+ return 1 - (Math.cos(pos * 4.5 * Math.PI) * Math.exp(-pos * 6));
+ },
+ none: function(pos) {
+ return 0;
+ },
+ full: function(pos) {
+ return 1;
+ }
+ },
+ DefaultOptions: {
+ duration: 1.0, // seconds
+ fps: 100, // 100= assume 66fps max.
+ sync: false, // true for combining
+ from: 0.0,
+ to: 1.0,
+ delay: 0.0,
+ queue: 'parallel'
+ },
+ tagifyText: function(element) {
+ var tagifyStyle = 'position:relative';
+ if (Prototype.Browser.IE) tagifyStyle += ';zoom:1';
+
+ element = $(element);
+ $A(element.childNodes).each( function(child) {
+ if (child.nodeType==3) {
+ child.nodeValue.toArray().each( function(character) {
+ element.insertBefore(
+ new Element('span', {style: tagifyStyle}).update(
+ character == ' ' ? String.fromCharCode(160) : character),
+ child);
+ });
+ Element.remove(child);
+ }
+ });
+ },
+ multiple: function(element, effect) {
+ var elements;
+ if (((typeof element == 'object') ||
+ Object.isFunction(element)) &&
+ (element.length))
+ elements = element;
+ else
+ elements = $(element).childNodes;
+
+ var options = Object.extend({
+ speed: 0.1,
+ delay: 0.0
+ }, arguments[2] || { });
+ var masterDelay = options.delay;
+
+ $A(elements).each( function(element, index) {
+ new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay }));
+ });
+ },
+ PAIRS: {
+ 'slide': ['SlideDown','SlideUp'],
+ 'blind': ['BlindDown','BlindUp'],
+ 'appear': ['Appear','Fade']
+ },
+ toggle: function(element, effect, options) {
+ element = $(element);
+ effect = (effect || 'appear').toLowerCase();
+
+ return Effect[ Effect.PAIRS[ effect ][ element.visible() ? 1 : 0 ] ](element, Object.extend({
+ queue: { position:'end', scope:(element.id || 'global'), limit: 1 }
+ }, options || {}));
+ }
+};
+
+Effect.DefaultOptions.transition = Effect.Transitions.sinoidal;
+
+/* ------------- core effects ------------- */
+
+Effect.ScopedQueue = Class.create(Enumerable, {
+ initialize: function() {
+ this.effects = [];
+ this.interval = null;
+ },
+ _each: function(iterator) {
+ this.effects._each(iterator);
+ },
+ add: function(effect) {
+ var timestamp = new Date().getTime();
+
+ var position = Object.isString(effect.options.queue) ?
+ effect.options.queue : effect.options.queue.position;
+
+ switch(position) {
+ case 'front':
+ // move unstarted effects after this effect
+ this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) {
+ e.startOn += effect.finishOn;
+ e.finishOn += effect.finishOn;
+ });
+ break;
+ case 'with-last':
+ timestamp = this.effects.pluck('startOn').max() || timestamp;
+ break;
+ case 'end':
+ // start effect after last queued effect has finished
+ timestamp = this.effects.pluck('finishOn').max() || timestamp;
+ break;
+ }
+
+ effect.startOn += timestamp;
+ effect.finishOn += timestamp;
+
+ if (!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit))
+ this.effects.push(effect);
+
+ if (!this.interval)
+ this.interval = setInterval(this.loop.bind(this), 15);
+ },
+ remove: function(effect) {
+ this.effects = this.effects.reject(function(e) { return e==effect });
+ if (this.effects.length == 0) {
+ clearInterval(this.interval);
+ this.interval = null;
+ }
+ },
+ loop: function() {
+ var timePos = new Date().getTime();
+ for(var i=0, len=this.effects.length;i<len;i++)
+ this.effects[i] && this.effects[i].loop(timePos);
+ }
+});
+
+Effect.Queues = {
+ instances: $H(),
+ get: function(queueName) {
+ if (!Object.isString(queueName)) return queueName;
+
+ return this.instances.get(queueName) ||
+ this.instances.set(queueName, new Effect.ScopedQueue());
+ }
+};
+Effect.Queue = Effect.Queues.get('global');
+
+Effect.Base = Class.create({
+ position: null,
+ start: function(options) {
+ if (options && options.transition === false) options.transition = Effect.Transitions.linear;
+ this.options = Object.extend(Object.extend({ },Effect.DefaultOptions), options || { });
+ this.currentFrame = 0;
+ this.state = 'idle';
+ this.startOn = this.options.delay*1000;
+ this.finishOn = this.startOn+(this.options.duration*1000);
+ this.fromToDelta = this.options.to-this.options.from;
+ this.totalTime = this.finishOn-this.startOn;
+ this.totalFrames = this.options.fps*this.options.duration;
+
+ this.render = (function() {
+ function dispatch(effect, eventName) {
+ if (effect.options[eventName + 'Internal'])
+ effect.options[eventName + 'Internal'](effect);
+ if (effect.options[eventName])
+ effect.options[eventName](effect);
+ }
+
+ return function(pos) {
+ if (this.state === "idle") {
+ this.state = "running";
+ dispatch(this, 'beforeSetup');
+ if (this.setup) this.setup();
+ dispatch(this, 'afterSetup');
+ }
+ if (this.state === "running") {
+ pos = (this.options.transition(pos) * this.fromToDelta) + this.options.from;
+ this.position = pos;
+ dispatch(this, 'beforeUpdate');
+ if (this.update) this.update(pos);
+ dispatch(this, 'afterUpdate');
+ }
+ };
+ })();
+
+ this.event('beforeStart');
+ if (!this.options.sync)
+ Effect.Queues.get(Object.isString(this.options.queue) ?
+ 'global' : this.options.queue.scope).add(this);
+ },
+ loop: function(timePos) {
+ if (timePos >= this.startOn) {
+ if (timePos >= this.finishOn) {
+ this.render(1.0);
+ this.cancel();
+ this.event('beforeFinish');
+ if (this.finish) this.finish();
+ this.event('afterFinish');
+ return;
+ }
+ var pos = (timePos - this.startOn) / this.totalTime,
+ frame = (pos * this.totalFrames).round();
+ if (frame > this.currentFrame) {
+ this.render(pos);
+ this.currentFrame = frame;
+ }
+ }
+ },
+ cancel: function() {
+ if (!this.options.sync)
+ Effect.Queues.get(Object.isString(this.options.queue) ?
+ 'global' : this.options.queue.scope).remove(this);
+ this.state = 'finished';
+ },
+ event: function(eventName) {
+ if (this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this);
+ if (this.options[eventName]) this.options[eventName](this);
+ },
+ inspect: function() {
+ var data = $H();
+ for(property in this)
+ if (!Object.isFunction(this[property])) data.set(property, this[property]);
+ return '#<Effect:' + data.inspect() + ',options:' + $H(this.options).inspect() + '>';
+ }
+});
+
+Effect.Parallel = Class.create(Effect.Base, {
+ initialize: function(effects) {
+ this.effects = effects || [];
+ this.start(arguments[1]);
+ },
+ update: function(position) {
+ this.effects.invoke('render', position);
+ },
+ finish: function(position) {
+ this.effects.each( function(effect) {
+ effect.render(1.0);
+ effect.cancel();
+ effect.event('beforeFinish');
+ if (effect.finish) effect.finish(position);
+ effect.event('afterFinish');
+ });
+ }
+});
+
+Effect.Tween = Class.create(Effect.Base, {
+ initialize: function(object, from, to) {
+ object = Object.isString(object) ? $(object) : object;
+ var args = $A(arguments), method = args.last(),
+ options = args.length == 5 ? args[3] : null;
+ this.method = Object.isFunction(method) ? method.bind(object) :
+ Object.isFunction(object[method]) ? object[method].bind(object) :
+ function(value) { object[method] = value };
+ this.start(Object.extend({ from: from, to: to }, options || { }));
+ },
+ update: function(position) {
+ this.method(position);
+ }
+});
+
+Effect.Event = Class.create(Effect.Base, {
+ initialize: function() {
+ this.start(Object.extend({ duration: 0 }, arguments[0] || { }));
+ },
+ update: Prototype.emptyFunction
+});
+
+Effect.Opacity = Class.create(Effect.Base, {
+ initialize: function(element) {
+ this.element = $(element);
+ if (!this.element) throw(Effect._elementDoesNotExistError);
+ // make this work on IE on elements without 'layout'
+ if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout))
+ this.element.setStyle({zoom: 1});
+ var options = Object.extend({
+ from: this.element.getOpacity() || 0.0,
+ to: 1.0
+ }, arguments[1] || { });
+ this.start(options);
+ },
+ update: function(position) {
+ this.element.setOpacity(position);
+ }
+});
+
+Effect.Move = Class.create(Effect.Base, {
+ initialize: function(element) {
+ this.element = $(element);
+ if (!this.element) throw(Effect._elementDoesNotExistError);
+ var options = Object.extend({
+ x: 0,
+ y: 0,
+ mode: 'relative'
+ }, arguments[1] || { });
+ this.start(options);
+ },
+ setup: function() {
+ this.element.makePositioned();
+ this.originalLeft = parseFloat(this.element.getStyle('left') || '0');
+ this.originalTop = parseFloat(this.element.getStyle('top') || '0');
+ if (this.options.mode == 'absolute') {
+ this.options.x = this.options.x - this.originalLeft;
+ this.options.y = this.options.y - this.originalTop;
+ }
+ },
+ update: function(position) {
+ this.element.setStyle({
+ left: (this.options.x * position + this.originalLeft).round() + 'px',
+ top: (this.options.y * position + this.originalTop).round() + 'px'
+ });
+ }
+});
+
+// for backwards compatibility
+Effect.MoveBy = function(element, toTop, toLeft) {
+ return new Effect.Move(element,
+ Object.extend({ x: toLeft, y: toTop }, arguments[3] || { }));
+};
+
+Effect.Scale = Class.create(Effect.Base, {
+ initialize: function(element, percent) {
+ this.element = $(element);
+ if (!this.element) throw(Effect._elementDoesNotExistError);
+ var options = Object.extend({
+ scaleX: true,
+ scaleY: true,
+ scaleContent: true,
+ scaleFromCenter: false,
+ scaleMode: 'box', // 'box' or 'contents' or { } with provided values
+ scaleFrom: 100.0,
+ scaleTo: percent
+ }, arguments[2] || { });
+ this.start(options);
+ },
+ setup: function() {
+ this.restoreAfterFinish = this.options.restoreAfterFinish || false;
+ this.elementPositioning = this.element.getStyle('position');
+
+ this.originalStyle = { };
+ ['top','left','width','height','fontSize'].each( function(k) {
+ this.originalStyle[k] = this.element.style[k];
+ }.bind(this));
+
+ this.originalTop = this.element.offsetTop;
+ this.originalLeft = this.element.offsetLeft;
+
+ var fontSize = this.element.getStyle('font-size') || '100%';
+ ['em','px','%','pt'].each( function(fontSizeType) {
+ if (fontSize.indexOf(fontSizeType)>0) {
+ this.fontSize = parseFloat(fontSize);
+ this.fontSizeType = fontSizeType;
+ }
+ }.bind(this));
+
+ this.factor = (this.options.scaleTo - this.options.scaleFrom)/100;
+
+ this.dims = null;
+ if (this.options.scaleMode=='box')
+ this.dims = [this.element.offsetHeight, this.element.offsetWidth];
+ if (/^content/.test(this.options.scaleMode))
+ this.dims = [this.element.scrollHeight, this.element.scrollWidth];
+ if (!this.dims)
+ this.dims = [this.options.scaleMode.originalHeight,
+ this.options.scaleMode.originalWidth];
+ },
+ update: function(position) {
+ var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position);
+ if (this.options.scaleContent && this.fontSize)
+ this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType });
+ this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale);
+ },
+ finish: function(position) {
+ if (this.restoreAfterFinish) this.element.setStyle(this.originalStyle);
+ },
+ setDimensions: function(height, width) {
+ var d = { };
+ if (this.options.scaleX) d.width = width.round() + 'px';
+ if (this.options.scaleY) d.height = height.round() + 'px';
+ if (this.options.scaleFromCenter) {
+ var topd = (height - this.dims[0])/2;
+ var leftd = (width - this.dims[1])/2;
+ if (this.elementPositioning == 'absolute') {
+ if (this.options.scaleY) d.top = this.originalTop-topd + 'px';
+ if (this.options.scaleX) d.left = this.originalLeft-leftd + 'px';
+ } else {
+ if (this.options.scaleY) d.top = -topd + 'px';
+ if (this.options.scaleX) d.left = -leftd + 'px';
+ }
+ }
+ this.element.setStyle(d);
+ }
+});
+
+Effect.Highlight = Class.create(Effect.Base, {
+ initialize: function(element) {
+ this.element = $(element);
+ if (!this.element) throw(Effect._elementDoesNotExistError);
+ var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || { });
+ this.start(options);
+ },
+ setup: function() {
+ // Prevent executing on elements not in the layout flow
+ if (this.element.getStyle('display')=='none') { this.cancel(); return; }
+ // Disable background image during the effect
+ this.oldStyle = { };
+ if (!this.options.keepBackgroundImage) {
+ this.oldStyle.backgroundImage = this.element.getStyle('background-image');
+ this.element.setStyle({backgroundImage: 'none'});
+ }
+ if (!this.options.endcolor)
+ this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff');
+ if (!this.options.restorecolor)
+ this.options.restorecolor = this.element.getStyle('background-color');
+ // init color calculations
+ this._base = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this));
+ this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this));
+ },
+ update: function(position) {
+ this.element.setStyle({backgroundColor: $R(0,2).inject('#',function(m,v,i){
+ return m+((this._base[i]+(this._delta[i]*position)).round().toColorPart()); }.bind(this)) });
+ },
+ finish: function() {
+ this.element.setStyle(Object.extend(this.oldStyle, {
+ backgroundColor: this.options.restorecolor
+ }));
+ }
+});
+
+Effect.ScrollTo = function(element) {
+ var options = arguments[1] || { },
+ scrollOffsets = document.viewport.getScrollOffsets(),
+ elementOffsets = $(element).cumulativeOffset();
+
+ if (options.offset) elementOffsets[1] += options.offset;
+
+ return new Effect.Tween(null,
+ scrollOffsets.top,
+ elementOffsets[1],
+ options,
+ function(p){ scrollTo(scrollOffsets.left, p.round()); }
+ );
+};
+
+/* ------------- combination effects ------------- */
+
+Effect.Fade = function(element) {
+ element = $(element);
+ var oldOpacity = element.getInlineOpacity();
+ var options = Object.extend({
+ from: element.getOpacity() || 1.0,
+ to: 0.0,
+ afterFinishInternal: function(effect) {
+ if (effect.options.to!=0) return;
+ effect.element.hide().setStyle({opacity: oldOpacity});
+ }
+ }, arguments[1] || { });
+ return new Effect.Opacity(element,options);
+};
+
+Effect.Appear = function(element) {
+ element = $(element);
+ var options = Object.extend({
+ from: (element.getStyle('display') == 'none' ? 0.0 : element.getOpacity() || 0.0),
+ to: 1.0,
+ // force Safari to render floated elements properly
+ afterFinishInternal: function(effect) {
+ effect.element.forceRerendering();
+ },
+ beforeSetup: function(effect) {
+ effect.element.setOpacity(effect.options.from).show();
+ }}, arguments[1] || { });
+ return new Effect.Opacity(element,options);
+};
+
+Effect.Puff = function(element) {
+ element = $(element);
+ var oldStyle = {
+ opacity: element.getInlineOpacity(),
+ position: element.getStyle('position'),
+ top: element.style.top,
+ left: element.style.left,
+ width: element.style.width,
+ height: element.style.height
+ };
+ return new Effect.Parallel(
+ [ new Effect.Scale(element, 200,
+ { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }),
+ new Effect.Opacity(element, { sync: true, to: 0.0 } ) ],
+ Object.extend({ duration: 1.0,
+ beforeSetupInternal: function(effect) {
+ Position.absolutize(effect.effects[0].element);
+ },
+ afterFinishInternal: function(effect) {
+ effect.effects[0].element.hide().setStyle(oldStyle); }
+ }, arguments[1] || { })
+ );
+};
+
+Effect.BlindUp = function(element) {
+ element = $(element);
+ element.makeClipping();
+ return new Effect.Scale(element, 0,
+ Object.extend({ scaleContent: false,
+ scaleX: false,
+ restoreAfterFinish: true,
+ afterFinishInternal: function(effect) {
+ effect.element.hide().undoClipping();
+ }
+ }, arguments[1] || { })
+ );
+};
+
+Effect.BlindDown = function(element) {
+ element = $(element);
+ var elementDimensions = element.getDimensions();
+ return new Effect.Scale(element, 100, Object.extend({
+ scaleContent: false,
+ scaleX: false,
+ scaleFrom: 0,
+ scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
+ restoreAfterFinish: true,
+ afterSetup: function(effect) {
+ effect.element.makeClipping().setStyle({height: '0px'}).show();
+ },
+ afterFinishInternal: function(effect) {
+ effect.element.undoClipping();
+ }
+ }, arguments[1] || { }));
+};
+
+Effect.SwitchOff = function(element) {
+ element = $(element);
+ var oldOpacity = element.getInlineOpacity();
+ return new Effect.Appear(element, Object.extend({
+ duration: 0.4,
+ from: 0,
+ transition: Effect.Transitions.flicker,
+ afterFinishInternal: function(effect) {
+ new Effect.Scale(effect.element, 1, {
+ duration: 0.3, scaleFromCenter: true,
+ scaleX: false, scaleContent: false, restoreAfterFinish: true,
+ beforeSetup: function(effect) {
+ effect.element.makePositioned().makeClipping();
+ },
+ afterFinishInternal: function(effect) {
+ effect.element.hide().undoClipping().undoPositioned().setStyle({opacity: oldOpacity});
+ }
+ });
+ }
+ }, arguments[1] || { }));
+};
+
+Effect.DropOut = function(element) {
+ element = $(element);
+ var oldStyle = {
+ top: element.getStyle('top'),
+ left: element.getStyle('left'),
+ opacity: element.getInlineOpacity() };
+ return new Effect.Parallel(
+ [ new Effect.Move(element, {x: 0, y: 100, sync: true }),
+ new Effect.Opacity(element, { sync: true, to: 0.0 }) ],
+ Object.extend(
+ { duration: 0.5,
+ beforeSetup: function(effect) {
+ effect.effects[0].element.makePositioned();
+ },
+ afterFinishInternal: function(effect) {
+ effect.effects[0].element.hide().undoPositioned().setStyle(oldStyle);
+ }
+ }, arguments[1] || { }));
+};
+
+Effect.Shake = function(element) {
+ element = $(element);
+ var options = Object.extend({
+ distance: 20,
+ duration: 0.5
+ }, arguments[1] || {});
+ var distance = parseFloat(options.distance);
+ var split = parseFloat(options.duration) / 10.0;
+ var oldStyle = {
+ top: element.getStyle('top'),
+ left: element.getStyle('left') };
+ return new Effect.Move(element,
+ { x: distance, y: 0, duration: split, afterFinishInternal: function(effect) {
+ new Effect.Move(effect.element,
+ { x: -distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) {
+ new Effect.Move(effect.element,
+ { x: distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) {
+ new Effect.Move(effect.element,
+ { x: -distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) {
+ new Effect.Move(effect.element,
+ { x: distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) {
+ new Effect.Move(effect.element,
+ { x: -distance, y: 0, duration: split, afterFinishInternal: function(effect) {
+ effect.element.undoPositioned().setStyle(oldStyle);
+ }}); }}); }}); }}); }}); }});
+};
+
+Effect.SlideDown = function(element) {
+ element = $(element).cleanWhitespace();
+ // SlideDown need to have the content of the element wrapped in a container element with fixed height!
+ var oldInnerBottom = element.down().getStyle('bottom');
+ var elementDimensions = element.getDimensions();
+ return new Effect.Scale(element, 100, Object.extend({
+ scaleContent: false,
+ scaleX: false,
+ scaleFrom: window.opera ? 0 : 1,
+ scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
+ restoreAfterFinish: true,
+ afterSetup: function(effect) {
+ effect.element.makePositioned();
+ effect.element.down().makePositioned();
+ if (window.opera) effect.element.setStyle({top: ''});
+ effect.element.makeClipping().setStyle({height: '0px'}).show();
+ },
+ afterUpdateInternal: function(effect) {
+ effect.element.down().setStyle({bottom:
+ (effect.dims[0] - effect.element.clientHeight) + 'px' });
+ },
+ afterFinishInternal: function(effect) {
+ effect.element.undoClipping().undoPositioned();
+ effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); }
+ }, arguments[1] || { })
+ );
+};
+
+Effect.SlideUp = function(element) {
+ element = $(element).cleanWhitespace();
+ var oldInnerBottom = element.down().getStyle('bottom');
+ var elementDimensions = element.getDimensions();
+ return new Effect.Scale(element, window.opera ? 0 : 1,
+ Object.extend({ scaleContent: false,
+ scaleX: false,
+ scaleMode: 'box',
+ scaleFrom: 100,
+ scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
+ restoreAfterFinish: true,
+ afterSetup: function(effect) {
+ effect.element.makePositioned();
+ effect.element.down().makePositioned();
+ if (window.opera) effect.element.setStyle({top: ''});
+ effect.element.makeClipping().show();
+ },
+ afterUpdateInternal: function(effect) {
+ effect.element.down().setStyle({bottom:
+ (effect.dims[0] - effect.element.clientHeight) + 'px' });
+ },
+ afterFinishInternal: function(effect) {
+ effect.element.hide().undoClipping().undoPositioned();
+ effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom});
+ }
+ }, arguments[1] || { })
+ );
+};
+
+// Bug in opera makes the TD containing this element expand for a instance after finish
+Effect.Squish = function(element) {
+ return new Effect.Scale(element, window.opera ? 1 : 0, {
+ restoreAfterFinish: true,
+ beforeSetup: function(effect) {
+ effect.element.makeClipping();
+ },
+ afterFinishInternal: function(effect) {
+ effect.element.hide().undoClipping();
+ }
+ });
+};
+
+Effect.Grow = function(element) {
+ element = $(element);
+ var options = Object.extend({
+ direction: 'center',
+ moveTransition: Effect.Transitions.sinoidal,
+ scaleTransition: Effect.Transitions.sinoidal,
+ opacityTransition: Effect.Transitions.full
+ }, arguments[1] || { });
+ var oldStyle = {
+ top: element.style.top,
+ left: element.style.left,
+ height: element.style.height,
+ width: element.style.width,
+ opacity: element.getInlineOpacity() };
+
+ var dims = element.getDimensions();
+ var initialMoveX, initialMoveY;
+ var moveX, moveY;
+
+ switch (options.direction) {
+ case 'top-left':
+ initialMoveX = initialMoveY = moveX = moveY = 0;
+ break;
+ case 'top-right':
+ initialMoveX = dims.width;
+ initialMoveY = moveY = 0;
+ moveX = -dims.width;
+ break;
+ case 'bottom-left':
+ initialMoveX = moveX = 0;
+ initialMoveY = dims.height;
+ moveY = -dims.height;
+ break;
+ case 'bottom-right':
+ initialMoveX = dims.width;
+ initialMoveY = dims.height;
+ moveX = -dims.width;
+ moveY = -dims.height;
+ break;
+ case 'center':
+ initialMoveX = dims.width / 2;
+ initialMoveY = dims.height / 2;
+ moveX = -dims.width / 2;
+ moveY = -dims.height / 2;
+ break;
+ }
+
+ return new Effect.Move(element, {
+ x: initialMoveX,
+ y: initialMoveY,
+ duration: 0.01,
+ beforeSetup: function(effect) {
+ effect.element.hide().makeClipping().makePositioned();
+ },
+ afterFinishInternal: function(effect) {
+ new Effect.Parallel(
+ [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }),
+ new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }),
+ new Effect.Scale(effect.element, 100, {
+ scaleMode: { originalHeight: dims.height, originalWidth: dims.width },
+ sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true})
+ ], Object.extend({
+ beforeSetup: function(effect) {
+ effect.effects[0].element.setStyle({height: '0px'}).show();
+ },
+ afterFinishInternal: function(effect) {
+ effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldStyle);
+ }
+ }, options)
+ );
+ }
+ });
+};
+
+Effect.Shrink = function(element) {
+ element = $(element);
+ var options = Object.extend({
+ direction: 'center',
+ moveTransition: Effect.Transitions.sinoidal,
+ scaleTransition: Effect.Transitions.sinoidal,
+ opacityTransition: Effect.Transitions.none
+ }, arguments[1] || { });
+ var oldStyle = {
+ top: element.style.top,
+ left: element.style.left,
+ height: element.style.height,
+ width: element.style.width,
+ opacity: element.getInlineOpacity() };
+
+ var dims = element.getDimensions();
+ var moveX, moveY;
+
+ switch (options.direction) {
+ case 'top-left':
+ moveX = moveY = 0;
+ break;
+ case 'top-right':
+ moveX = dims.width;
+ moveY = 0;
+ break;
+ case 'bottom-left':
+ moveX = 0;
+ moveY = dims.height;
+ break;
+ case 'bottom-right':
+ moveX = dims.width;
+ moveY = dims.height;
+ break;
+ case 'center':
+ moveX = dims.width / 2;
+ moveY = dims.height / 2;
+ break;
+ }
+
+ return new Effect.Parallel(
+ [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }),
+ new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}),
+ new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition })
+ ], Object.extend({
+ beforeStartInternal: function(effect) {
+ effect.effects[0].element.makePositioned().makeClipping();
+ },
+ afterFinishInternal: function(effect) {
+ effect.effects[0].element.hide().undoClipping().undoPositioned().setStyle(oldStyle); }
+ }, options)
+ );
+};
+
+Effect.Pulsate = function(element) {
+ element = $(element);
+ var options = arguments[1] || { },
+ oldOpacity = element.getInlineOpacity(),
+ transition = options.transition || Effect.Transitions.linear,
+ reverser = function(pos){
+ return 1 - transition((-Math.cos((pos*(options.pulses||5)*2)*Math.PI)/2) + .5);
+ };
+
+ return new Effect.Opacity(element,
+ Object.extend(Object.extend({ duration: 2.0, from: 0,
+ afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); }
+ }, options), {transition: reverser}));
+};
+
+Effect.Fold = function(element) {
+ element = $(element);
+ var oldStyle = {
+ top: element.style.top,
+ left: element.style.left,
+ width: element.style.width,
+ height: element.style.height };
+ element.makeClipping();
+ return new Effect.Scale(element, 5, Object.extend({
+ scaleContent: false,
+ scaleX: false,
+ afterFinishInternal: function(effect) {
+ new Effect.Scale(element, 1, {
+ scaleContent: false,
+ scaleY: false,
+ afterFinishInternal: function(effect) {
+ effect.element.hide().undoClipping().setStyle(oldStyle);
+ } });
+ }}, arguments[1] || { }));
+};
+
+Effect.Morph = Class.create(Effect.Base, {
+ initialize: function(element) {
+ this.element = $(element);
+ if (!this.element) throw(Effect._elementDoesNotExistError);
+ var options = Object.extend({
+ style: { }
+ }, arguments[1] || { });
+
+ if (!Object.isString(options.style)) this.style = $H(options.style);
+ else {
+ if (options.style.include(':'))
+ this.style = options.style.parseStyle();
+ else {
+ this.element.addClassName(options.style);
+ this.style = $H(this.element.getStyles());
+ this.element.removeClassName(options.style);
+ var css = this.element.getStyles();
+ this.style = this.style.reject(function(style) {
+ return style.value == css[style.key];
+ });
+ options.afterFinishInternal = function(effect) {
+ effect.element.addClassName(effect.options.style);
+ effect.transforms.each(function(transform) {
+ effect.element.style[transform.style] = '';
+ });
+ };
+ }
+ }
+ this.start(options);
+ },
+
+ setup: function(){
+ function parseColor(color){
+ if (!color || ['rgba(0, 0, 0, 0)','transparent'].include(color)) color = '#ffffff';
+ color = color.parseColor();
+ return $R(0,2).map(function(i){
+ return parseInt( color.slice(i*2+1,i*2+3), 16 );
+ });
+ }
+ this.transforms = this.style.map(function(pair){
+ var property = pair[0], value = pair[1], unit = null;
+
+ if (value.parseColor('#zzzzzz') != '#zzzzzz') {
+ value = value.parseColor();
+ unit = 'color';
+ } else if (property == 'opacity') {
+ value = parseFloat(value);
+ if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout))
+ this.element.setStyle({zoom: 1});
+ } else if (Element.CSS_LENGTH.test(value)) {
+ var components = value.match(/^([\+\-]?[0-9\.]+)(.*)$/);
+ value = parseFloat(components[1]);
+ unit = (components.length == 3) ? components[2] : null;
+ }
+
+ var originalValue = this.element.getStyle(property);
+ return {
+ style: property.camelize(),
+ originalValue: unit=='color' ? parseColor(originalValue) : parseFloat(originalValue || 0),
+ targetValue: unit=='color' ? parseColor(value) : value,
+ unit: unit
+ };
+ }.bind(this)).reject(function(transform){
+ return (
+ (transform.originalValue == transform.targetValue) ||
+ (
+ transform.unit != 'color' &&
+ (isNaN(transform.originalValue) || isNaN(transform.targetValue))
+ )
+ );
+ });
+ },
+ update: function(position) {
+ var style = { }, transform, i = this.transforms.length;
+ while(i--)
+ style[(transform = this.transforms[i]).style] =
+ transform.unit=='color' ? '#'+
+ (Math.round(transform.originalValue[0]+
+ (transform.targetValue[0]-transform.originalValue[0])*position)).toColorPart() +
+ (Math.round(transform.originalValue[1]+
+ (transform.targetValue[1]-transform.originalValue[1])*position)).toColorPart() +
+ (Math.round(transform.originalValue[2]+
+ (transform.targetValue[2]-transform.originalValue[2])*position)).toColorPart() :
+ (transform.originalValue +
+ (transform.targetValue - transform.originalValue) * position).toFixed(3) +
+ (transform.unit === null ? '' : transform.unit);
+ this.element.setStyle(style, true);
+ }
+});
+
+Effect.Transform = Class.create({
+ initialize: function(tracks){
+ this.tracks = [];
+ this.options = arguments[1] || { };
+ this.addTracks(tracks);
+ },
+ addTracks: function(tracks){
+ tracks.each(function(track){
+ track = $H(track);
+ var data = track.values().first();
+ this.tracks.push($H({
+ ids: track.keys().first(),
+ effect: Effect.Morph,
+ options: { style: data }
+ }));
+ }.bind(this));
+ return this;
+ },
+ play: function(){
+ return new Effect.Parallel(
+ this.tracks.map(function(track){
+ var ids = track.get('ids'), effect = track.get('effect'), options = track.get('options');
+ var elements = [$(ids) || $$(ids)].flatten();
+ return elements.map(function(e){ return new effect(e, Object.extend({ sync:true }, options)) });
+ }).flatten(),
+ this.options
+ );
+ }
+});
+
+Element.CSS_PROPERTIES = $w(
+ 'backgroundColor backgroundPosition borderBottomColor borderBottomStyle ' +
+ 'borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth ' +
+ 'borderRightColor borderRightStyle borderRightWidth borderSpacing ' +
+ 'borderTopColor borderTopStyle borderTopWidth bottom clip color ' +
+ 'fontSize fontWeight height left letterSpacing lineHeight ' +
+ 'marginBottom marginLeft marginRight marginTop markerOffset maxHeight '+
+ 'maxWidth minHeight minWidth opacity outlineColor outlineOffset ' +
+ 'outlineWidth paddingBottom paddingLeft paddingRight paddingTop ' +
+ 'right textIndent top width wordSpacing zIndex');
+
+Element.CSS_LENGTH = /^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/;
+
+String.__parseStyleElement = document.createElement('div');
+String.prototype.parseStyle = function(){
+ var style, styleRules = $H();
+ if (Prototype.Browser.WebKit)
+ style = new Element('div',{style:this}).style;
+ else {
+ String.__parseStyleElement.innerHTML = '<div style="' + this + '"></div>';
+ style = String.__parseStyleElement.childNodes[0].style;
+ }
+
+ Element.CSS_PROPERTIES.each(function(property){
+ if (style[property]) styleRules.set(property, style[property]);
+ });
+
+ if (Prototype.Browser.IE && this.include('opacity'))
+ styleRules.set('opacity', this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1]);
+
+ return styleRules;
+};
+
+if (document.defaultView && document.defaultView.getComputedStyle) {
+ Element.getStyles = function(element) {
+ var css = document.defaultView.getComputedStyle($(element), null);
+ return Element.CSS_PROPERTIES.inject({ }, function(styles, property) {
+ styles[property] = css[property];
+ return styles;
+ });
+ };
+} else {
+ Element.getStyles = function(element) {
+ element = $(element);
+ var css = element.currentStyle, styles;
+ styles = Element.CSS_PROPERTIES.inject({ }, function(results, property) {
+ results[property] = css[property];
+ return results;
+ });
+ if (!styles.opacity) styles.opacity = element.getOpacity();
+ return styles;
+ };
+}
+
+Effect.Methods = {
+ morph: function(element, style) {
+ element = $(element);
+ new Effect.Morph(element, Object.extend({ style: style }, arguments[2] || { }));
+ return element;
+ },
+ visualEffect: function(element, effect, options) {
+ element = $(element);
+ var s = effect.dasherize().camelize(), klass = s.charAt(0).toUpperCase() + s.substring(1);
+ new Effect[klass](element, options);
+ return element;
+ },
+ highlight: function(element, options) {
+ element = $(element);
+ new Effect.Highlight(element, options);
+ return element;
+ }
+};
+
+$w('fade appear grow shrink fold blindUp blindDown slideUp slideDown '+
+ 'pulsate shake puff squish switchOff dropOut').each(
+ function(effect) {
+ Effect.Methods[effect] = function(element, options){
+ element = $(element);
+ Effect[effect.charAt(0).toUpperCase() + effect.substring(1)](element, options);
+ return element;
+ };
+ }
+);
+
+$w('getInlineOpacity forceRerendering setContentZoom collectTextNodes collectTextNodesIgnoreClass getStyles').each(
+ function(f) { Effect.Methods[f] = Element[f]; }
+);
+
+Element.addMethods(Effect.Methods); \ No newline at end of file
diff --git a/js/script.aculo.us/scriptaculous.js b/js/script.aculo.us/scriptaculous.js
new file mode 100644
index 0000000..0ea5c44
--- /dev/null
+++ b/js/script.aculo.us/scriptaculous.js
@@ -0,0 +1,68 @@
+// script.aculo.us scriptaculous.js v1.9.0, Thu Dec 23 16:54:48 -0500 2010
+
+// Copyright (c) 2005-2010 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+//
+// 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.
+//
+// For details, see the script.aculo.us web site: http://script.aculo.us/
+
+var Scriptaculous = {
+ Version: '1.9.0',
+ require: function(libraryName) {
+ try{
+ // inserting via DOM fails in Safari 2.0, so brute force approach
+ document.write('<script type="text/javascript" src="'+libraryName+'"><\/script>');
+ } catch(e) {
+ // for xhtml+xml served content, fall back to DOM methods
+ var script = document.createElement('script');
+ script.type = 'text/javascript';
+ script.src = libraryName;
+ document.getElementsByTagName('head')[0].appendChild(script);
+ }
+ },
+ REQUIRED_PROTOTYPE: '1.6.0.3',
+ load: function() {
+ function convertVersionString(versionString) {
+ var v = versionString.replace(/_.*|\./g, '');
+ v = parseInt(v + '0'.times(4-v.length));
+ return versionString.indexOf('_') > -1 ? v-1 : v;
+ }
+
+ if((typeof Prototype=='undefined') ||
+ (typeof Element == 'undefined') ||
+ (typeof Element.Methods=='undefined') ||
+ (convertVersionString(Prototype.Version) <
+ convertVersionString(Scriptaculous.REQUIRED_PROTOTYPE)))
+ throw("script.aculo.us requires the Prototype JavaScript framework >= " +
+ Scriptaculous.REQUIRED_PROTOTYPE);
+
+ var js = /scriptaculous\.js(\?.*)?$/;
+ $$('script[src]').findAll(function(s) {
+ return s.src.match(js);
+ }).each(function(s) {
+ var path = s.src.replace(js, ''),
+ includes = s.src.match(/\?.*load=([a-z,]*)/);
+ (includes ? includes[1] : 'builder,effects,dragdrop,controls,slider,sound').split(',').each(
+ function(include) { Scriptaculous.require(path+include+'.js') });
+ });
+ }
+};
+
+Scriptaculous.load(); \ No newline at end of file
diff --git a/js/script.aculo.us/slider.js b/js/script.aculo.us/slider.js
new file mode 100644
index 0000000..438e689
--- /dev/null
+++ b/js/script.aculo.us/slider.js
@@ -0,0 +1,275 @@
+// script.aculo.us slider.js v1.9.0, Thu Dec 23 16:54:48 -0500 2010
+
+// Copyright (c) 2005-2010 Marty Haught, Thomas Fuchs
+//
+// script.aculo.us is freely distributable under the terms of an MIT-style license.
+// For details, see the script.aculo.us web site: http://script.aculo.us/
+
+if (!Control) var Control = { };
+
+// options:
+// axis: 'vertical', or 'horizontal' (default)
+//
+// callbacks:
+// onChange(value)
+// onSlide(value)
+Control.Slider = Class.create({
+ initialize: function(handle, track, options) {
+ var slider = this;
+
+ if (Object.isArray(handle)) {
+ this.handles = handle.collect( function(e) { return $(e) });
+ } else {
+ this.handles = [$(handle)];
+ }
+
+ this.track = $(track);
+ this.options = options || { };
+
+ this.axis = this.options.axis || 'horizontal';
+ this.increment = this.options.increment || 1;
+ this.step = parseInt(this.options.step || '1');
+ this.range = this.options.range || $R(0,1);
+
+ this.value = 0; // assure backwards compat
+ this.values = this.handles.map( function() { return 0 });
+ this.spans = this.options.spans ? this.options.spans.map(function(s){ return $(s) }) : false;
+ this.options.startSpan = $(this.options.startSpan || null);
+ this.options.endSpan = $(this.options.endSpan || null);
+
+ this.restricted = this.options.restricted || false;
+
+ this.maximum = this.options.maximum || this.range.end;
+ this.minimum = this.options.minimum || this.range.start;
+
+ // Will be used to align the handle onto the track, if necessary
+ this.alignX = parseInt(this.options.alignX || '0');
+ this.alignY = parseInt(this.options.alignY || '0');
+
+ this.trackLength = this.maximumOffset() - this.minimumOffset();
+
+ this.handleLength = this.isVertical() ?
+ (this.handles[0].offsetHeight != 0 ?
+ this.handles[0].offsetHeight : this.handles[0].style.height.replace(/px$/,"")) :
+ (this.handles[0].offsetWidth != 0 ? this.handles[0].offsetWidth :
+ this.handles[0].style.width.replace(/px$/,""));
+
+ this.active = false;
+ this.dragging = false;
+ this.disabled = false;
+
+ if (this.options.disabled) this.setDisabled();
+
+ // Allowed values array
+ this.allowedValues = this.options.values ? this.options.values.sortBy(Prototype.K) : false;
+ if (this.allowedValues) {
+ this.minimum = this.allowedValues.min();
+ this.maximum = this.allowedValues.max();
+ }
+
+ this.eventMouseDown = this.startDrag.bindAsEventListener(this);
+ this.eventMouseUp = this.endDrag.bindAsEventListener(this);
+ this.eventMouseMove = this.update.bindAsEventListener(this);
+
+ // Initialize handles in reverse (make sure first handle is active)
+ this.handles.each( function(h,i) {
+ i = slider.handles.length-1-i;
+ slider.setValue(parseFloat(
+ (Object.isArray(slider.options.sliderValue) ?
+ slider.options.sliderValue[i] : slider.options.sliderValue) ||
+ slider.range.start), i);
+ h.makePositioned().observe("mousedown", slider.eventMouseDown);
+ });
+
+ this.track.observe("mousedown", this.eventMouseDown);
+ document.observe("mouseup", this.eventMouseUp);
+ document.observe("mousemove", this.eventMouseMove);
+
+ this.initialized = true;
+ },
+ dispose: function() {
+ var slider = this;
+ Event.stopObserving(this.track, "mousedown", this.eventMouseDown);
+ Event.stopObserving(document, "mouseup", this.eventMouseUp);
+ Event.stopObserving(document, "mousemove", this.eventMouseMove);
+ this.handles.each( function(h) {
+ Event.stopObserving(h, "mousedown", slider.eventMouseDown);
+ });
+ },
+ setDisabled: function(){
+ this.disabled = true;
+ },
+ setEnabled: function(){
+ this.disabled = false;
+ },
+ getNearestValue: function(value){
+ if (this.allowedValues){
+ if (value >= this.allowedValues.max()) return(this.allowedValues.max());
+ if (value <= this.allowedValues.min()) return(this.allowedValues.min());
+
+ var offset = Math.abs(this.allowedValues[0] - value);
+ var newValue = this.allowedValues[0];
+ this.allowedValues.each( function(v) {
+ var currentOffset = Math.abs(v - value);
+ if (currentOffset <= offset){
+ newValue = v;
+ offset = currentOffset;
+ }
+ });
+ return newValue;
+ }
+ if (value > this.range.end) return this.range.end;
+ if (value < this.range.start) return this.range.start;
+ return value;
+ },
+ setValue: function(sliderValue, handleIdx){
+ if (!this.active) {
+ this.activeHandleIdx = handleIdx || 0;
+ this.activeHandle = this.handles[this.activeHandleIdx];
+ this.updateStyles();
+ }
+ handleIdx = handleIdx || this.activeHandleIdx || 0;
+ if (this.initialized && this.restricted) {
+ if ((handleIdx>0) && (sliderValue<this.values[handleIdx-1]))
+ sliderValue = this.values[handleIdx-1];
+ if ((handleIdx < (this.handles.length-1)) && (sliderValue>this.values[handleIdx+1]))
+ sliderValue = this.values[handleIdx+1];
+ }
+ sliderValue = this.getNearestValue(sliderValue);
+ this.values[handleIdx] = sliderValue;
+ this.value = this.values[0]; // assure backwards compat
+
+ this.handles[handleIdx].style[this.isVertical() ? 'top' : 'left'] =
+ this.translateToPx(sliderValue);
+
+ this.drawSpans();
+ if (!this.dragging || !this.event) this.updateFinished();
+ },
+ setValueBy: function(delta, handleIdx) {
+ this.setValue(this.values[handleIdx || this.activeHandleIdx || 0] + delta,
+ handleIdx || this.activeHandleIdx || 0);
+ },
+ translateToPx: function(value) {
+ return Math.round(
+ ((this.trackLength-this.handleLength)/(this.range.end-this.range.start)) *
+ (value - this.range.start)) + "px";
+ },
+ translateToValue: function(offset) {
+ return ((offset/(this.trackLength-this.handleLength) *
+ (this.range.end-this.range.start)) + this.range.start);
+ },
+ getRange: function(range) {
+ var v = this.values.sortBy(Prototype.K);
+ range = range || 0;
+ return $R(v[range],v[range+1]);
+ },
+ minimumOffset: function(){
+ return(this.isVertical() ? this.alignY : this.alignX);
+ },
+ maximumOffset: function(){
+ return(this.isVertical() ?
+ (this.track.offsetHeight != 0 ? this.track.offsetHeight :
+ this.track.style.height.replace(/px$/,"")) - this.alignY :
+ (this.track.offsetWidth != 0 ? this.track.offsetWidth :
+ this.track.style.width.replace(/px$/,"")) - this.alignX);
+ },
+ isVertical: function(){
+ return (this.axis == 'vertical');
+ },
+ drawSpans: function() {
+ var slider = this;
+ if (this.spans)
+ $R(0, this.spans.length-1).each(function(r) { slider.setSpan(slider.spans[r], slider.getRange(r)) });
+ if (this.options.startSpan)
+ this.setSpan(this.options.startSpan,
+ $R(0, this.values.length>1 ? this.getRange(0).min() : this.value ));
+ if (this.options.endSpan)
+ this.setSpan(this.options.endSpan,
+ $R(this.values.length>1 ? this.getRange(this.spans.length-1).max() : this.value, this.maximum));
+ },
+ setSpan: function(span, range) {
+ if (this.isVertical()) {
+ span.style.top = this.translateToPx(range.start);
+ span.style.height = this.translateToPx(range.end - range.start + this.range.start);
+ } else {
+ span.style.left = this.translateToPx(range.start);
+ span.style.width = this.translateToPx(range.end - range.start + this.range.start);
+ }
+ },
+ updateStyles: function() {
+ this.handles.each( function(h){ Element.removeClassName(h, 'selected') });
+ Element.addClassName(this.activeHandle, 'selected');
+ },
+ startDrag: function(event) {
+ if (Event.isLeftClick(event)) {
+ if (!this.disabled){
+ this.active = true;
+
+ var handle = Event.element(event);
+ var pointer = [Event.pointerX(event), Event.pointerY(event)];
+ var track = handle;
+ if (track==this.track) {
+ var offsets = this.track.cumulativeOffset();
+ this.event = event;
+ this.setValue(this.translateToValue(
+ (this.isVertical() ? pointer[1]-offsets[1] : pointer[0]-offsets[0])-(this.handleLength/2)
+ ));
+ var offsets = this.activeHandle.cumulativeOffset();
+ this.offsetX = (pointer[0] - offsets[0]);
+ this.offsetY = (pointer[1] - offsets[1]);
+ } else {
+ // find the handle (prevents issues with Safari)
+ while((this.handles.indexOf(handle) == -1) && handle.parentNode)
+ handle = handle.parentNode;
+
+ if (this.handles.indexOf(handle)!=-1) {
+ this.activeHandle = handle;
+ this.activeHandleIdx = this.handles.indexOf(this.activeHandle);
+ this.updateStyles();
+
+ var offsets = this.activeHandle.cumulativeOffset();
+ this.offsetX = (pointer[0] - offsets[0]);
+ this.offsetY = (pointer[1] - offsets[1]);
+ }
+ }
+ }
+ Event.stop(event);
+ }
+ },
+ update: function(event) {
+ if (this.active) {
+ if (!this.dragging) this.dragging = true;
+ this.draw(event);
+ if (Prototype.Browser.WebKit) window.scrollBy(0,0);
+ Event.stop(event);
+ }
+ },
+ draw: function(event) {
+ var pointer = [Event.pointerX(event), Event.pointerY(event)];
+ var offsets = this.track.cumulativeOffset();
+ pointer[0] -= this.offsetX + offsets[0];
+ pointer[1] -= this.offsetY + offsets[1];
+ this.event = event;
+ this.setValue(this.translateToValue( this.isVertical() ? pointer[1] : pointer[0] ));
+ if (this.initialized && this.options.onSlide)
+ this.options.onSlide(this.values.length>1 ? this.values : this.value, this);
+ },
+ endDrag: function(event) {
+ if (this.active && this.dragging) {
+ this.finishDrag(event, true);
+ Event.stop(event);
+ }
+ this.active = false;
+ this.dragging = false;
+ },
+ finishDrag: function(event, success) {
+ this.active = false;
+ this.dragging = false;
+ this.updateFinished();
+ },
+ updateFinished: function() {
+ if (this.initialized && this.options.onChange)
+ this.options.onChange(this.values.length>1 ? this.values : this.value, this);
+ this.event = null;
+ }
+}); \ No newline at end of file
diff --git a/js/script.aculo.us/sound.js b/js/script.aculo.us/sound.js
new file mode 100644
index 0000000..d3f8464
--- /dev/null
+++ b/js/script.aculo.us/sound.js
@@ -0,0 +1,59 @@
+// script.aculo.us sound.js v1.9.0, Thu Dec 23 16:54:48 -0500 2010
+
+// Copyright (c) 2005-2010 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+//
+// Based on code created by Jules Gravinese (http://www.webveteran.com/)
+//
+// script.aculo.us is freely distributable under the terms of an MIT-style license.
+// For details, see the script.aculo.us web site: http://script.aculo.us/
+
+Sound = {
+ tracks: {},
+ _enabled: true,
+ template:
+ new Template('<embed style="height:0" id="sound_#{track}_#{id}" src="#{url}" loop="false" autostart="true" hidden="true"/>'),
+ enable: function(){
+ Sound._enabled = true;
+ },
+ disable: function(){
+ Sound._enabled = false;
+ },
+ play: function(url){
+ if(!Sound._enabled) return;
+ var options = Object.extend({
+ track: 'global', url: url, replace: false
+ }, arguments[1] || {});
+
+ if(options.replace && this.tracks[options.track]) {
+ $R(0, this.tracks[options.track].id).each(function(id){
+ var sound = $('sound_'+options.track+'_'+id);
+ sound.Stop && sound.Stop();
+ sound.remove();
+ });
+ this.tracks[options.track] = null;
+ }
+
+ if(!this.tracks[options.track])
+ this.tracks[options.track] = { id: 0 };
+ else
+ this.tracks[options.track].id++;
+
+ options.id = this.tracks[options.track].id;
+ $$('body')[0].insert(
+ Prototype.Browser.IE ? new Element('bgsound',{
+ id: 'sound_'+options.track+'_'+options.id,
+ src: options.url, loop: 1, autostart: true
+ }) : Sound.template.evaluate(options));
+ }
+};
+
+if(Prototype.Browser.Gecko && navigator.userAgent.indexOf("Win") > 0){
+ if(navigator.plugins && $A(navigator.plugins).detect(function(p){ return p.name.indexOf('QuickTime') != -1 }))
+ Sound.template = new Template('<object id="sound_#{track}_#{id}" width="0" height="0" type="audio/mpeg" data="#{url}"/>');
+ else if(navigator.plugins && $A(navigator.plugins).detect(function(p){ return p.name.indexOf('Windows Media') != -1 }))
+ Sound.template = new Template('<object id="sound_#{track}_#{id}" type="application/x-mplayer2" data="#{url}"></object>');
+ else if(navigator.plugins && $A(navigator.plugins).detect(function(p){ return p.name.indexOf('RealPlayer') != -1 }))
+ Sound.template = new Template('<embed type="audio/x-pn-realaudio-plugin" style="height:0" id="sound_#{track}_#{id}" src="#{url}" loop="false" autostart="true" hidden="true"/>');
+ else
+ Sound.play = function(){};
+} \ No newline at end of file
diff --git a/js/script.aculo.us/unittest.js b/js/script.aculo.us/unittest.js
new file mode 100644
index 0000000..9555c22
--- /dev/null
+++ b/js/script.aculo.us/unittest.js
@@ -0,0 +1,568 @@
+// script.aculo.us unittest.js v1.9.0, Thu Dec 23 16:54:48 -0500 2010
+
+// Copyright (c) 2005-2010 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+// (c) 2005-2010 Jon Tirsen (http://www.tirsen.com)
+// (c) 2005-2010 Michael Schuerig (http://www.schuerig.de/michael/)
+//
+// script.aculo.us is freely distributable under the terms of an MIT-style license.
+// For details, see the script.aculo.us web site: http://script.aculo.us/
+
+// experimental, Firefox-only
+Event.simulateMouse = function(element, eventName) {
+ var options = Object.extend({
+ pointerX: 0,
+ pointerY: 0,
+ buttons: 0,
+ ctrlKey: false,
+ altKey: false,
+ shiftKey: false,
+ metaKey: false
+ }, arguments[2] || {});
+ var oEvent = document.createEvent("MouseEvents");
+ oEvent.initMouseEvent(eventName, true, true, document.defaultView,
+ options.buttons, options.pointerX, options.pointerY, options.pointerX, options.pointerY,
+ options.ctrlKey, options.altKey, options.shiftKey, options.metaKey, 0, $(element));
+
+ if(this.mark) Element.remove(this.mark);
+ this.mark = document.createElement('div');
+ this.mark.appendChild(document.createTextNode(" "));
+ document.body.appendChild(this.mark);
+ this.mark.style.position = 'absolute';
+ this.mark.style.top = options.pointerY + "px";
+ this.mark.style.left = options.pointerX + "px";
+ this.mark.style.width = "5px";
+ this.mark.style.height = "5px;";
+ this.mark.style.borderTop = "1px solid red;";
+ this.mark.style.borderLeft = "1px solid red;";
+
+ if(this.step)
+ alert('['+new Date().getTime().toString()+'] '+eventName+'/'+Test.Unit.inspect(options));
+
+ $(element).dispatchEvent(oEvent);
+};
+
+// Note: Due to a fix in Firefox 1.0.5/6 that probably fixed "too much", this doesn't work in 1.0.6 or DP2.
+// You need to downgrade to 1.0.4 for now to get this working
+// See https://bugzilla.mozilla.org/show_bug.cgi?id=289940 for the fix that fixed too much
+Event.simulateKey = function(element, eventName) {
+ var options = Object.extend({
+ ctrlKey: false,
+ altKey: false,
+ shiftKey: false,
+ metaKey: false,
+ keyCode: 0,
+ charCode: 0
+ }, arguments[2] || {});
+
+ var oEvent = document.createEvent("KeyEvents");
+ oEvent.initKeyEvent(eventName, true, true, window,
+ options.ctrlKey, options.altKey, options.shiftKey, options.metaKey,
+ options.keyCode, options.charCode );
+ $(element).dispatchEvent(oEvent);
+};
+
+Event.simulateKeys = function(element, command) {
+ for(var i=0; i<command.length; i++) {
+ Event.simulateKey(element,'keypress',{charCode:command.charCodeAt(i)});
+ }
+};
+
+var Test = {};
+Test.Unit = {};
+
+// security exception workaround
+Test.Unit.inspect = Object.inspect;
+
+Test.Unit.Logger = Class.create();
+Test.Unit.Logger.prototype = {
+ initialize: function(log) {
+ this.log = $(log);
+ if (this.log) {
+ this._createLogTable();
+ }
+ },
+ start: function(testName) {
+ if (!this.log) return;
+ this.testName = testName;
+ this.lastLogLine = document.createElement('tr');
+ this.statusCell = document.createElement('td');
+ this.nameCell = document.createElement('td');
+ this.nameCell.className = "nameCell";
+ this.nameCell.appendChild(document.createTextNode(testName));
+ this.messageCell = document.createElement('td');
+ this.lastLogLine.appendChild(this.statusCell);
+ this.lastLogLine.appendChild(this.nameCell);
+ this.lastLogLine.appendChild(this.messageCell);
+ this.loglines.appendChild(this.lastLogLine);
+ },
+ finish: function(status, summary) {
+ if (!this.log) return;
+ this.lastLogLine.className = status;
+ this.statusCell.innerHTML = status;
+ this.messageCell.innerHTML = this._toHTML(summary);
+ this.addLinksToResults();
+ },
+ message: function(message) {
+ if (!this.log) return;
+ this.messageCell.innerHTML = this._toHTML(message);
+ },
+ summary: function(summary) {
+ if (!this.log) return;
+ this.logsummary.innerHTML = this._toHTML(summary);
+ },
+ _createLogTable: function() {
+ this.log.innerHTML =
+ '<div id="logsummary"></div>' +
+ '<table id="logtable">' +
+ '<thead><tr><th>Status</th><th>Test</th><th>Message</th></tr></thead>' +
+ '<tbody id="loglines"></tbody>' +
+ '</table>';
+ this.logsummary = $('logsummary');
+ this.loglines = $('loglines');
+ },
+ _toHTML: function(txt) {
+ return txt.escapeHTML().replace(/\n/g,"<br/>");
+ },
+ addLinksToResults: function(){
+ $$("tr.failed .nameCell").each( function(td){ // todo: limit to children of this.log
+ td.title = "Run only this test";
+ Event.observe(td, 'click', function(){ window.location.search = "?tests=" + td.innerHTML;});
+ });
+ $$("tr.passed .nameCell").each( function(td){ // todo: limit to children of this.log
+ td.title = "Run all tests";
+ Event.observe(td, 'click', function(){ window.location.search = "";});
+ });
+ }
+};
+
+Test.Unit.Runner = Class.create();
+Test.Unit.Runner.prototype = {
+ initialize: function(testcases) {
+ this.options = Object.extend({
+ testLog: 'testlog'
+ }, arguments[1] || {});
+ this.options.resultsURL = this.parseResultsURLQueryParameter();
+ this.options.tests = this.parseTestsQueryParameter();
+ if (this.options.testLog) {
+ this.options.testLog = $(this.options.testLog) || null;
+ }
+ if(this.options.tests) {
+ this.tests = [];
+ for(var i = 0; i < this.options.tests.length; i++) {
+ if(/^test/.test(this.options.tests[i])) {
+ this.tests.push(new Test.Unit.Testcase(this.options.tests[i], testcases[this.options.tests[i]], testcases["setup"], testcases["teardown"]));
+ }
+ }
+ } else {
+ if (this.options.test) {
+ this.tests = [new Test.Unit.Testcase(this.options.test, testcases[this.options.test], testcases["setup"], testcases["teardown"])];
+ } else {
+ this.tests = [];
+ for(var testcase in testcases) {
+ if(/^test/.test(testcase)) {
+ this.tests.push(
+ new Test.Unit.Testcase(
+ this.options.context ? ' -> ' + this.options.titles[testcase] : testcase,
+ testcases[testcase], testcases["setup"], testcases["teardown"]
+ ));
+ }
+ }
+ }
+ }
+ this.currentTest = 0;
+ this.logger = new Test.Unit.Logger(this.options.testLog);
+ setTimeout(this.runTests.bind(this), 1000);
+ },
+ parseResultsURLQueryParameter: function() {
+ return window.location.search.parseQuery()["resultsURL"];
+ },
+ parseTestsQueryParameter: function(){
+ if (window.location.search.parseQuery()["tests"]){
+ return window.location.search.parseQuery()["tests"].split(',');
+ };
+ },
+ // Returns:
+ // "ERROR" if there was an error,
+ // "FAILURE" if there was a failure, or
+ // "SUCCESS" if there was neither
+ getResult: function() {
+ var hasFailure = false;
+ for(var i=0;i<this.tests.length;i++) {
+ if (this.tests[i].errors > 0) {
+ return "ERROR";
+ }
+ if (this.tests[i].failures > 0) {
+ hasFailure = true;
+ }
+ }
+ if (hasFailure) {
+ return "FAILURE";
+ } else {
+ return "SUCCESS";
+ }
+ },
+ postResults: function() {
+ if (this.options.resultsURL) {
+ new Ajax.Request(this.options.resultsURL,
+ { method: 'get', parameters: 'result=' + this.getResult(), asynchronous: false });
+ }
+ },
+ runTests: function() {
+ var test = this.tests[this.currentTest];
+ if (!test) {
+ // finished!
+ this.postResults();
+ this.logger.summary(this.summary());
+ return;
+ }
+ if(!test.isWaiting) {
+ this.logger.start(test.name);
+ }
+ test.run();
+ if(test.isWaiting) {
+ this.logger.message("Waiting for " + test.timeToWait + "ms");
+ setTimeout(this.runTests.bind(this), test.timeToWait || 1000);
+ } else {
+ this.logger.finish(test.status(), test.summary());
+ this.currentTest++;
+ // tail recursive, hopefully the browser will skip the stackframe
+ this.runTests();
+ }
+ },
+ summary: function() {
+ var assertions = 0;
+ var failures = 0;
+ var errors = 0;
+ var messages = [];
+ for(var i=0;i<this.tests.length;i++) {
+ assertions += this.tests[i].assertions;
+ failures += this.tests[i].failures;
+ errors += this.tests[i].errors;
+ }
+ return (
+ (this.options.context ? this.options.context + ': ': '') +
+ this.tests.length + " tests, " +
+ assertions + " assertions, " +
+ failures + " failures, " +
+ errors + " errors");
+ }
+};
+
+Test.Unit.Assertions = Class.create();
+Test.Unit.Assertions.prototype = {
+ initialize: function() {
+ this.assertions = 0;
+ this.failures = 0;
+ this.errors = 0;
+ this.messages = [];
+ },
+ summary: function() {
+ return (
+ this.assertions + " assertions, " +
+ this.failures + " failures, " +
+ this.errors + " errors" + "\n" +
+ this.messages.join("\n"));
+ },
+ pass: function() {
+ this.assertions++;
+ },
+ fail: function(message) {
+ this.failures++;
+ this.messages.push("Failure: " + message);
+ },
+ info: function(message) {
+ this.messages.push("Info: " + message);
+ },
+ error: function(error) {
+ this.errors++;
+ this.messages.push(error.name + ": "+ error.message + "(" + Test.Unit.inspect(error) +")");
+ },
+ status: function() {
+ if (this.failures > 0) return 'failed';
+ if (this.errors > 0) return 'error';
+ return 'passed';
+ },
+ assert: function(expression) {
+ var message = arguments[1] || 'assert: got "' + Test.Unit.inspect(expression) + '"';
+ try { expression ? this.pass() :
+ this.fail(message); }
+ catch(e) { this.error(e); }
+ },
+ assertEqual: function(expected, actual) {
+ var message = arguments[2] || "assertEqual";
+ try { (expected == actual) ? this.pass() :
+ this.fail(message + ': expected "' + Test.Unit.inspect(expected) +
+ '", actual "' + Test.Unit.inspect(actual) + '"'); }
+ catch(e) { this.error(e); }
+ },
+ assertInspect: function(expected, actual) {
+ var message = arguments[2] || "assertInspect";
+ try { (expected == actual.inspect()) ? this.pass() :
+ this.fail(message + ': expected "' + Test.Unit.inspect(expected) +
+ '", actual "' + Test.Unit.inspect(actual) + '"'); }
+ catch(e) { this.error(e); }
+ },
+ assertEnumEqual: function(expected, actual) {
+ var message = arguments[2] || "assertEnumEqual";
+ try { $A(expected).length == $A(actual).length &&
+ expected.zip(actual).all(function(pair) { return pair[0] == pair[1] }) ?
+ this.pass() : this.fail(message + ': expected ' + Test.Unit.inspect(expected) +
+ ', actual ' + Test.Unit.inspect(actual)); }
+ catch(e) { this.error(e); }
+ },
+ assertNotEqual: function(expected, actual) {
+ var message = arguments[2] || "assertNotEqual";
+ try { (expected != actual) ? this.pass() :
+ this.fail(message + ': got "' + Test.Unit.inspect(actual) + '"'); }
+ catch(e) { this.error(e); }
+ },
+ assertIdentical: function(expected, actual) {
+ var message = arguments[2] || "assertIdentical";
+ try { (expected === actual) ? this.pass() :
+ this.fail(message + ': expected "' + Test.Unit.inspect(expected) +
+ '", actual "' + Test.Unit.inspect(actual) + '"'); }
+ catch(e) { this.error(e); }
+ },
+ assertNotIdentical: function(expected, actual) {
+ var message = arguments[2] || "assertNotIdentical";
+ try { !(expected === actual) ? this.pass() :
+ this.fail(message + ': expected "' + Test.Unit.inspect(expected) +
+ '", actual "' + Test.Unit.inspect(actual) + '"'); }
+ catch(e) { this.error(e); }
+ },
+ assertNull: function(obj) {
+ var message = arguments[1] || 'assertNull';
+ try { (obj==null) ? this.pass() :
+ this.fail(message + ': got "' + Test.Unit.inspect(obj) + '"'); }
+ catch(e) { this.error(e); }
+ },
+ assertMatch: function(expected, actual) {
+ var message = arguments[2] || 'assertMatch';
+ var regex = new RegExp(expected);
+ try { (regex.exec(actual)) ? this.pass() :
+ this.fail(message + ' : regex: "' + Test.Unit.inspect(expected) + ' did not match: ' + Test.Unit.inspect(actual) + '"'); }
+ catch(e) { this.error(e); }
+ },
+ assertHidden: function(element) {
+ var message = arguments[1] || 'assertHidden';
+ this.assertEqual("none", element.style.display, message);
+ },
+ assertNotNull: function(object) {
+ var message = arguments[1] || 'assertNotNull';
+ this.assert(object != null, message);
+ },
+ assertType: function(expected, actual) {
+ var message = arguments[2] || 'assertType';
+ try {
+ (actual.constructor == expected) ? this.pass() :
+ this.fail(message + ': expected "' + Test.Unit.inspect(expected) +
+ '", actual "' + (actual.constructor) + '"'); }
+ catch(e) { this.error(e); }
+ },
+ assertNotOfType: function(expected, actual) {
+ var message = arguments[2] || 'assertNotOfType';
+ try {
+ (actual.constructor != expected) ? this.pass() :
+ this.fail(message + ': expected "' + Test.Unit.inspect(expected) +
+ '", actual "' + (actual.constructor) + '"'); }
+ catch(e) { this.error(e); }
+ },
+ assertInstanceOf: function(expected, actual) {
+ var message = arguments[2] || 'assertInstanceOf';
+ try {
+ (actual instanceof expected) ? this.pass() :
+ this.fail(message + ": object was not an instance of the expected type"); }
+ catch(e) { this.error(e); }
+ },
+ assertNotInstanceOf: function(expected, actual) {
+ var message = arguments[2] || 'assertNotInstanceOf';
+ try {
+ !(actual instanceof expected) ? this.pass() :
+ this.fail(message + ": object was an instance of the not expected type"); }
+ catch(e) { this.error(e); }
+ },
+ assertRespondsTo: function(method, obj) {
+ var message = arguments[2] || 'assertRespondsTo';
+ try {
+ (obj[method] && typeof obj[method] == 'function') ? this.pass() :
+ this.fail(message + ": object doesn't respond to [" + method + "]"); }
+ catch(e) { this.error(e); }
+ },
+ assertReturnsTrue: function(method, obj) {
+ var message = arguments[2] || 'assertReturnsTrue';
+ try {
+ var m = obj[method];
+ if(!m) m = obj['is'+method.charAt(0).toUpperCase()+method.slice(1)];
+ m() ? this.pass() :
+ this.fail(message + ": method returned false"); }
+ catch(e) { this.error(e); }
+ },
+ assertReturnsFalse: function(method, obj) {
+ var message = arguments[2] || 'assertReturnsFalse';
+ try {
+ var m = obj[method];
+ if(!m) m = obj['is'+method.charAt(0).toUpperCase()+method.slice(1)];
+ !m() ? this.pass() :
+ this.fail(message + ": method returned true"); }
+ catch(e) { this.error(e); }
+ },
+ assertRaise: function(exceptionName, method) {
+ var message = arguments[2] || 'assertRaise';
+ try {
+ method();
+ this.fail(message + ": exception expected but none was raised"); }
+ catch(e) {
+ ((exceptionName == null) || (e.name==exceptionName)) ? this.pass() : this.error(e);
+ }
+ },
+ assertElementsMatch: function() {
+ var expressions = $A(arguments), elements = $A(expressions.shift());
+ if (elements.length != expressions.length) {
+ this.fail('assertElementsMatch: size mismatch: ' + elements.length + ' elements, ' + expressions.length + ' expressions');
+ return false;
+ }
+ elements.zip(expressions).all(function(pair, index) {
+ var element = $(pair.first()), expression = pair.last();
+ if (element.match(expression)) return true;
+ this.fail('assertElementsMatch: (in index ' + index + ') expected ' + expression.inspect() + ' but got ' + element.inspect());
+ }.bind(this)) && this.pass();
+ },
+ assertElementMatches: function(element, expression) {
+ this.assertElementsMatch([element], expression);
+ },
+ benchmark: function(operation, iterations) {
+ var startAt = new Date();
+ (iterations || 1).times(operation);
+ var timeTaken = ((new Date())-startAt);
+ this.info((arguments[2] || 'Operation') + ' finished ' +
+ iterations + ' iterations in ' + (timeTaken/1000)+'s' );
+ return timeTaken;
+ },
+ _isVisible: function(element) {
+ element = $(element);
+ if(!element.parentNode) return true;
+ this.assertNotNull(element);
+ if(element.style && Element.getStyle(element, 'display') == 'none')
+ return false;
+
+ return this._isVisible(element.parentNode);
+ },
+ assertNotVisible: function(element) {
+ this.assert(!this._isVisible(element), Test.Unit.inspect(element) + " was not hidden and didn't have a hidden parent either. " + ("" || arguments[1]));
+ },
+ assertVisible: function(element) {
+ this.assert(this._isVisible(element), Test.Unit.inspect(element) + " was not visible. " + ("" || arguments[1]));
+ },
+ benchmark: function(operation, iterations) {
+ var startAt = new Date();
+ (iterations || 1).times(operation);
+ var timeTaken = ((new Date())-startAt);
+ this.info((arguments[2] || 'Operation') + ' finished ' +
+ iterations + ' iterations in ' + (timeTaken/1000)+'s' );
+ return timeTaken;
+ }
+};
+
+Test.Unit.Testcase = Class.create();
+Object.extend(Object.extend(Test.Unit.Testcase.prototype, Test.Unit.Assertions.prototype), {
+ initialize: function(name, test, setup, teardown) {
+ Test.Unit.Assertions.prototype.initialize.bind(this)();
+ this.name = name;
+
+ if(typeof test == 'string') {
+ test = test.gsub(/(\.should[^\(]+\()/,'#{0}this,');
+ test = test.gsub(/(\.should[^\(]+)\(this,\)/,'#{1}(this)');
+ this.test = function() {
+ eval('with(this){'+test+'}');
+ }
+ } else {
+ this.test = test || function() {};
+ }
+
+ this.setup = setup || function() {};
+ this.teardown = teardown || function() {};
+ this.isWaiting = false;
+ this.timeToWait = 1000;
+ },
+ wait: function(time, nextPart) {
+ this.isWaiting = true;
+ this.test = nextPart;
+ this.timeToWait = time;
+ },
+ run: function() {
+ try {
+ try {
+ if (!this.isWaiting) this.setup.bind(this)();
+ this.isWaiting = false;
+ this.test.bind(this)();
+ } finally {
+ if(!this.isWaiting) {
+ this.teardown.bind(this)();
+ }
+ }
+ }
+ catch(e) { this.error(e); }
+ }
+});
+
+// *EXPERIMENTAL* BDD-style testing to please non-technical folk
+// This draws many ideas from RSpec http://rspec.rubyforge.org/
+
+Test.setupBDDExtensionMethods = function(){
+ var METHODMAP = {
+ shouldEqual: 'assertEqual',
+ shouldNotEqual: 'assertNotEqual',
+ shouldEqualEnum: 'assertEnumEqual',
+ shouldBeA: 'assertType',
+ shouldNotBeA: 'assertNotOfType',
+ shouldBeAn: 'assertType',
+ shouldNotBeAn: 'assertNotOfType',
+ shouldBeNull: 'assertNull',
+ shouldNotBeNull: 'assertNotNull',
+
+ shouldBe: 'assertReturnsTrue',
+ shouldNotBe: 'assertReturnsFalse',
+ shouldRespondTo: 'assertRespondsTo'
+ };
+ var makeAssertion = function(assertion, args, object) {
+ this[assertion].apply(this,(args || []).concat([object]));
+ };
+
+ Test.BDDMethods = {};
+ $H(METHODMAP).each(function(pair) {
+ Test.BDDMethods[pair.key] = function() {
+ var args = $A(arguments);
+ var scope = args.shift();
+ makeAssertion.apply(scope, [pair.value, args, this]); };
+ });
+
+ [Array.prototype, String.prototype, Number.prototype, Boolean.prototype].each(
+ function(p){ Object.extend(p, Test.BDDMethods) }
+ );
+};
+
+Test.context = function(name, spec, log){
+ Test.setupBDDExtensionMethods();
+
+ var compiledSpec = {};
+ var titles = {};
+ for(specName in spec) {
+ switch(specName){
+ case "setup":
+ case "teardown":
+ compiledSpec[specName] = spec[specName];
+ break;
+ default:
+ var testName = 'test'+specName.gsub(/\s+/,'-').camelize();
+ var body = spec[specName].toString().split('\n').slice(1);
+ if(/^\{/.test(body[0])) body = body.slice(1);
+ body.pop();
+ body = body.map(function(statement){
+ return statement.strip()
+ });
+ compiledSpec[testName] = body.join('\n');
+ titles[testName] = specName;
+ }
+ }
+ new Test.Unit.Runner(compiledSpec, { titles: titles, testLog: log || 'testlog', context: name });
+}; \ No newline at end of file
diff --git a/js/tablecontrol.js b/js/tablecontrol.js
new file mode 100644
index 0000000..f389c42
--- /dev/null
+++ b/js/tablecontrol.js
@@ -0,0 +1,487 @@
+/** coding:utf-8 */
+
+/** Some helper's functions
+ * Public domain or unknown author(s)
+ * TODO : move it to another file
+ **/
+function findPos(obj) {
+ var curleft = curtop = 0;
+ if (obj.offsetParent) {
+ curleft = obj.offsetLeft
+ curtop = obj.offsetTop
+ while (obj = obj.offsetParent) {
+ curleft += obj.offsetLeft
+ curtop += obj.offsetTop
+ }
+ }
+ return [curleft,curtop];
+}
+
+function getParent(element, parentTagName)
+{
+ if ( ! element )
+ return null;
+ else if ( element.nodeType == 1 && element.tagName.toLowerCase() == parentTagName.toLowerCase() )
+ return element;
+ else
+ return getParent(element.parentNode, parentTagName);
+}
+function getNextSibling(elt)
+{
+ var sibling = elt.nextSibling;
+ while (sibling != null) {
+ if (sibling.nodeName == elt.nodeName) return sibling;
+ sibling = sibling.nextSibling;
+ }
+ return null;
+}
+function getPreviousSibling(elt)
+{
+ var sibling = elt.previousSibling;
+ while (sibling != null) {
+ if (sibling.nodeName == elt.nodeName)
+ return sibling;
+ sibling = sibling.previousSibling;
+ }
+ return null;
+}
+function strRepeat(str, n) {
+ var i, ret = '';
+ for ( i = 0; i < n; i++ )
+ ret += str;
+ return ret;
+}
+
+/** @class TableControl
+ * @author RĂ©mi Lanvin
+ */
+var TableControl = {
+ controlled_tables: [],
+ active_rows: [],
+ default_options: {
+ tree: false, // way of sorting rows
+ activeClassName: 'active',
+ spreadActiveClass: true, // spread the 'active' class to childrens ?
+ controlBox: null // an id
+ },
+
+ /**
+ * Init the table 'table_id'
+ * @param table_id table id
+ * @param options an 'options' object - optional
+ */
+ create: function(table_id)
+ {
+
+ var table = $(table_id);
+ if ( ! table || table.tagName != 'TABLE' )
+ return;
+
+ var options = Object.extend(this.default_options, arguments[1] || {});
+
+ var tbody = table.getElementsByTagName('TBODY');
+ var row = tbody[0].getElementsByTagName('TR');
+
+ var i, j, input;
+ for (i = 0; i < row.length; i++ ) {
+ row[i].table_id = table_id;
+
+ input = row[i].getElementsByTagName("INPUT");
+ // initialize tree values
+ if ( options.tree ) {
+ row[i].tree_left = 0;
+ row[i].tree_right = 0;
+
+ for ( j = 0; j < input.length; j++ ) {
+ if ( input[j].name.substring(0,3) == 'lft' )
+ row[i].tree_left = input[j];
+ else if ( input[j].name.substring(0,3) == 'rgt' )
+ row[i].tree_right = input[j];
+ }
+
+ row[i].tree_diff = parseInt(row[i].tree_right.value,10) - parseInt(row[i].tree_left.value,10);
+
+ span = row[i].getElementsByTagName("SPAN");
+ for ( j = 0; j < span.length; j++ ) {
+ if ( span[j].className == "depthmark" )
+ row[i].tree_depthmark = span[j];
+ }
+ }
+ // initialize classical position values
+ else {
+ for ( j = 0; j < input.length; j++ ) {
+ if ( input[j].name.substring(0,13) == 'list_position' )
+ row[i].list_position = input[j];
+ }
+ }
+ Event.observe(row[i], 'click', function(e) { TableControl._onClick(e) }, false);
+ }
+ if ( options.controlBox ) {
+ options.controlBoxElt = $(options.controlBox);
+ // may not be a control box if there are no rows currently
+ if (options.controlBoxElt)
+ options.controlBoxElt.style.left = parseInt(findPos(table)) + parseInt (table.scrollWidth - 30) + 'px';
+ }
+
+
+ if ( options.tree ) {
+ this._buildTree(table);
+ var form = getParent(table, "FORM");
+ if ( form )
+ Event.observe(form, 'submit', function(e) { TableControl._calculateValues(table.root_node) }, false);
+ }
+
+ this.controlled_tables[table_id] = options;
+ },
+
+ /**
+ * Move up the active row
+ */
+ up: function(table_id)
+ {
+ var options;
+ if ( ! ( options = this.controlled_tables[table_id] ) )
+ return;
+
+ var row = this.active_rows[table_id];
+ if ( ! row )
+ return;
+
+ if ( options.tree ) {
+ var previous_row = this._getPreviousTreeNode(row);
+ // already on the top
+ if ( ! previous_row ) return;
+
+ var parent = row.parentNode;
+ this._swapTreeNode(row, previous_row);
+ this._moveSubTreeBefore(row, previous_row, parent);
+ }
+ else {
+ var previous_row = getPreviousSibling(row);
+ if ( ! previous_row )
+ return;
+ var parent = row.parentNode;
+ parent.removeChild(row);
+ parent.insertBefore(row, previous_row);
+
+ var tmp = row.list_position.value;
+ row.list_position.value = previous_row.list_position.value;
+ previous_row.list_position.value = tmp;
+ }
+ },
+
+ /**
+ * Move down the active row
+ */
+ down: function(table_id)
+ {
+ var options;
+ if ( ! ( options = this.controlled_tables[table_id]) )
+ return;
+
+ var row = this.active_rows[table_id];
+ if ( ! row )
+ return;
+
+ if ( options.tree ) {
+ var next_row = this._getNextTreeNode(row);
+ // already on the bottom
+ if ( ! next_row ) return;
+
+ var next_next_row = this._getNextTreeNode(next_row);
+ var parent = row.parentNode;
+
+ this._swapTreeNode(row, next_row);
+
+ if ( next_next_row )
+ this._moveSubTreeBefore(row, next_next_row, parent);
+ else {
+ var last_child = ( next_row.childs.length > 0 ? next_row.childs[next_row.childs.length - 1] : next_row );
+ var end_row = getNextSibling(last_child);
+ this._moveSubTreeBefore(row, end_row, parent);
+ }
+ }
+ else {
+ var next_row = getNextSibling(row);
+ if ( ! next_row )
+ return;
+ var parent = next_row.parentNode;
+ parent.removeChild(next_row);
+ parent.insertBefore(next_row, row);
+
+ var tmp = row.list_position.value;
+ row.list_position.value = next_row.list_position.value;
+ next_row.list_position.value = tmp;
+ }
+ },
+
+ /**
+ * Move deeper the active row
+ * Only works when the option 'tree' is true
+ */
+ deeper: function(table_id)
+ {
+ var options;
+ if ( ! ( options = this.controlled_tables[table_id] ) )
+ return;
+ if ( ! options.tree )
+ return;
+
+ var row = this.active_rows[table_id];
+ if ( ! row )
+ return;
+
+ // check if futur parent is deeper enough
+ var previous_row = getPreviousSibling(row);
+ if ( ! previous_row || (this._getDepth(previous_row) < this._getDepth(row) ))
+ return;
+
+ previous_row = this._getPreviousTreeNode(row);
+ this._removeTreeNode(row);
+ this._addTreeNode(row, previous_row);
+
+ this._forEachChilds(row, function(node) {
+ var old_depth = TableControl._getDepth(node);
+ var new_depth = old_depth + 1;
+ var e = new RegExp('depth' + old_depth, "g");
+ node.className = node.className.replace(e, 'depth' + new_depth);
+ node.tree_depthmark.innerHTML = strRepeat('&rarr;', new_depth);
+ });
+ },
+
+ /**
+ * Move shallower the active row
+ * Only works when the option 'tree' is true
+ */
+ shallower: function (table_id)
+ {
+ var options;
+ if ( ! ( options = this.controlled_tables[table_id] ) )
+ return;
+ if ( ! options.tree )
+ return;
+
+ var row = this.active_rows[table_id];
+ if ( ! row )
+ return;
+
+ // check the depth
+ if ( this._getDepth(row) <= 0 )
+ return;
+
+ var parent = row.parent;
+ this._removeTreeNode(row);
+ this._addTreeNode(row, parent.parent, parent);
+
+ this._forEachChilds(row, function(node) {
+ var old_depth = TableControl._getDepth(node);
+ var new_depth = old_depth - 1;
+ var e = new RegExp('depth' + old_depth, "g");
+ node.className = node.className.replace(e, 'depth' + new_depth);
+ node.tree_depthmark.innerHTML = strRepeat('&rarr;', new_depth);
+ });
+ },
+
+ /** @internal stuff **/
+
+ /** @private
+ * OnClick handler. Activate the selected row
+ */
+ _onClick: function(e)
+ {
+ var row = Event.element(e);
+ if ( row.tagName != 'TR' )
+ row = getParent(row, 'TR');
+
+ var active_row = this.active_rows[row.table_id];
+ var options = this.controlled_tables[row.table_id];
+
+ // desactivate previously active row
+ if ( active_row ) {
+ Element.removeClassName(active_row, options.activeClassName);
+ if ( options.tree && options.spreadActiveClass ) {
+ this._forEachChilds(active_row, function(e) {
+ Element.removeClassName(e, options.activeClassName);
+ });
+ }
+ }
+ else if ( options.controlBoxElt ) {
+ Element.addClassName(options.controlBoxElt, options.activeClassName);
+ }
+ // if clicking on the same row : no more active row
+ if ( active_row && active_row == row ) {
+ this.active_rows[row.table_id] = null;
+ Element.removeClassName(options.controlBoxElt, options.activeClassName);
+ }
+ // else activate the new selected row
+ else {
+ Element.addClassName(row, options.activeClassName);
+ if ( options.tree && options.spreadActiveClass ) {
+ this._forEachChilds(row, function(e) {
+ Element.addClassName(e, options.activeClassName);
+ });
+ }
+ this.active_rows[row.table_id] = row;
+ }
+ return;
+ },
+
+ /** @private
+ * Convert a class name like "depthN" to "N"
+ */
+ _getDepth: function(elt)
+ {
+ return ( elt ? parseInt(elt.className.substr(5),10) : -1 );
+ },
+
+ /** @private
+ * Return the previous node in the tree
+ */
+ _getPreviousTreeNode: function(node)
+ {
+ if ( ! node || ! node.parent ) return null;
+ var i = node.parent.childs.indexOf(node);
+ return (i > 0 ? node.parent.childs[i-1] : null);
+ },
+
+ /** @private
+ * Return the next node in the tree
+ */
+ _getNextTreeNode: function (node)
+ {
+ if ( ! node || ! node.parent ) return null;
+ var i = node.parent.childs.indexOf(node);
+ return (i < node.parent.childs.length - 1 ? node.parent.childs[i+1] : null);
+ },
+
+ /** @private
+ * Swap 'node1' and 'node2' in the tree
+ */
+ _swapTreeNode: function(node1, node2)
+ {
+ if ( !node1 || !node2 || (node1.parent != node2.parent) )
+ return false;
+
+ var node1_pos = node1.parent.childs.indexOf(node1);
+ var node2_pos = node1.parent.childs.indexOf(node2);
+ node1.parent.childs[node1_pos] = node2;
+ node1.parent.childs[node2_pos] = node1;
+ return true;
+ },
+
+ /** @private
+ * Remove 'nove' from the tree
+ */
+ _removeTreeNode: function(node)
+ {
+ if ( ! node || ! node.parent )
+ return false;
+ var i = node.parent.childs.indexOf(node);
+ node.parent.childs.splice(i, 1);
+ node.parent = null;
+ },
+
+ /** @private
+ * Add 'node' as child of 'parent'.
+ * If 'position' if given, 'node' is added before 'position'. Else it is
+ * added after the last child.
+ */
+ _addTreeNode: function(node, parent, position)
+ {
+ if ( ! node || ! parent )
+ return;
+ node.parent = parent;
+ if ( position ) {
+ var i = parent.childs.indexOf(position) + 1;
+ if ( i < parent.childs.length )
+ parent.childs.splice(i, 0, node);
+ else
+ parent.childs.push(node);
+ }
+ else
+ parent.childs.push(node);
+ },
+
+ /** @private
+ * Do f(node) for each node's childs (including itself).
+ */
+ _forEachChilds: function(node, f)
+ {
+ f(node);
+ var i;
+ for (i = 0; i < node.childs.length; i++ )
+ this._forEachChilds(node.childs[i], f);
+ },
+ /** @private
+ * Move the subtree starting from 'node' before 'position'
+ * @param parent the DOM parent
+ */
+ _moveSubTreeBefore: function(node, position, parent)
+ {
+ this._forEachChilds(node, function(node) {
+ parent.removeChild(node);
+ if ( position )
+ parent.insertBefore(node, position);
+ else
+ parent.appendChild(node);
+ });
+ },
+ /** @private
+ * Rebuild a tree from a non-recursive DOM structure
+ */
+ _buildTree: function(table)
+ {
+ if ( ! table )
+ return;
+
+ table.root_node = {
+ is_root_node: true,
+ childs: new Array()
+ };
+ var tbody = table.getElementsByTagName("TBODY");
+ var row = tbody[0].getElementsByTagName("TR");
+ var i;
+ for ( i = 0; i < row.length; i++ ) {
+ if ( this._getDepth(row[i]) == 0 ) {
+ table.root_node.childs.push(row[i])
+ this._buildSubTree(row[i], table.root_node);
+ }
+ }
+ },
+ _buildSubTree: function(node, parent)
+ {
+ node.parent = parent;
+ var node_depth = this._getDepth(node);
+ var child_depth = node_depth + 1;
+ var next_node = getNextSibling(node);
+ var next_node_depth = -1;
+ node.childs = new Array();
+ while ( next_node && ( (next_node_depth = this._getDepth(next_node)) > node_depth ) ) {
+ if ( next_node_depth == child_depth ) {
+ node.childs.push(next_node);
+ this._buildSubTree(next_node, node);
+ }
+ next_node = getNextSibling(next_node);
+ }
+ },
+ /** @private
+ * Do a tree traversal algorithm and fill "lft" and "rgt" values
+ */
+ _calculateValues: function(node, n)
+ {
+ if ( node.is_root_node ) {
+ n = new Array();
+ n.push(1);
+ }
+ else {
+ node.tree_left.value = ++(n[0]);
+ }
+ var i;
+ for ( i = 0; i < node.childs.length; i++ )
+ this._calculateValues(node.childs[i], n);
+
+ if ( ! node.is_root_node ) {
+ node.tree_right.value = ++(n[0]);
+ }
+ }
+}
diff --git a/js/tabs.js b/js/tabs.js
new file mode 100644
index 0000000..58828a7
--- /dev/null
+++ b/js/tabs.js
@@ -0,0 +1,148 @@
+/*
+ * $Id$
+ */
+addEvent(window, "load", initTabs);
+function addEvent(elm, evType, fn, useCapture)
+// addEvent and removeEvent
+// cross-browser event handling for IE5+, NS6 and Mozilla
+// By Scott Andrew
+{
+ if (elm.addEventListener){
+ elm.addEventListener(evType, fn, useCapture);
+ return true;
+ } else if (elm.attachEvent){
+ var r = elm.attachEvent("on"+evType, fn);
+ return r;
+ } else {
+ alert("Handler could not be removed");
+ }
+}
+
+var _TAB_DIVS;
+
+// tabs handling {{{
+// show tab with given id
+function showTabById(tabid, noEval) { // {{{
+ var divs = document.getElementsByTagName('div');
+ var tab = document.getElementById(tabid);
+ var submenu = document.getElementById('submenu');
+ var i;
+ var el = document.getElementById(tabid + "taba");
+
+ if (!noEval && el) {
+ eval(el.getAttribute('onmousedown'));
+ }
+ for (i=0; i<divs.length; i++) {
+ if (divs[i].className && (divs[i].className.indexOf('tab') > -1)) {
+ //divs[i].style.display = 'none';
+ if (divs[i].className && (divs[i].className.indexOf(' active') > -1)) {
+ divs[i].className = divs[i].className.substr(0, divs[i].className.length-7);
+ }
+ }
+ }
+
+ if (tab) {
+ //tab.style.display = 'block';
+ tab.className = tab.className +' active';
+
+ if (submenu) {
+ var links = submenu.getElementsByTagName('a');
+ for (i=0; i<links.length; i++) {
+ if (links[i].href.match('^.*#'+tabid+'$')) {
+ links[i].className = links[i].className.replace(/ active\b/g, '') + ' active';
+ } else { links[i].className = links[i].className.replace(/ active\b/g, ''); }
+ }
+ }
+ }
+ //if (window.scrollTo(0,0)) {
+ // window.scrollTo(0,0);
+ //}
+} // }}}
+
+// create JavaScript calls to switch tabs
+function makeTabLinks() { // {{{
+ var submenu = document.getElementById('submenu');
+ var links, i, target;
+
+ if (submenu) {
+ links = submenu.getElementsByTagName('a');
+ for (i=0; i<links.length; i++) {
+ var href = links[i].getAttribute('href');
+ target = href.substring(href.indexOf('#')+1);
+ links[i]['onclick'] = new Function("showTabById('"+target+"'); return false;");
+ }
+ }
+} // }}}
+
+// show tab with given number
+function showTabByNumber(number) { // {{{
+ var targets = new Array(); // tab names
+ var divs = document.getElementsByTagName('div');
+ var i;
+
+ for (i=0; i<divs.length; i++) {
+ // tweak for displaying comments-tab 'tab active' also if javascript is disabled.
+ if (divs[i].className == 'tab' || divs[i].className == 'tab active') {
+ targets[targets.length] = divs[i].id; //array[array.length]= same as .push, but IE-compatible.
+ }
+ }
+ if (number >= targets.length) {
+ number = targets.length-1;
+ }
+ showTabById(targets[number]);
+} // }}}
+
+// get list of all DIVs that contain tabs
+function getTabDivs() {/*{{{*/
+ if (_TAB_DIVS == null) {
+ _TAB_DIVS = new Array();
+ var divs = document.getElementsByTagName('div');
+ var i;
+ for (i=0; i<divs.length; i++) {
+ if (divs[i].className && (divs[i].className.indexOf('tab') > -1)) {
+ _TAB_DIVS[_TAB_DIVS.length] = divs[i]; //array[array.length]= same as .push, but IE-compatible.
+ }
+ }
+ }
+ return _TAB_DIVS;
+}/*}}}*/
+
+// tabs init
+// show first tab or tab with given name (string after #)
+function initTabs() {/*{{{*/
+ var target = location.href.substring(location.href.indexOf('#')+1);
+ if (target.match(/comment/)) {
+ target = "comments";
+ }
+
+ makeTabLinks();
+
+ if (target && document.getElementById(target) && document.getElementById(target).className == 'tab') {
+ showTabById(target);
+ } else {
+ showTabByNumber(0);
+ }
+ var history = document.getElementById('history');
+ if (history) {
+ addEvent(history,'click',uglyHistoryCommentFix);
+ }
+
+}/*}}}*/
+function uglyHistoryCommentFix(e) {
+ var target = e.target || window.event.srcElement;
+ if ('A' == target.nodeName) {
+ var re= /#comments/;
+ if (re.test(target.href)) {
+ showTabById('comments');
+ }
+ }
+ var history = document.getElementById('history');
+ if (history) {
+ addEvent(history,'click',uglyHistoryCommentFix);
+ }
+}
+// }}}
+
+// }}}
+
+// vim:enc=utf-8:fenc=utf-8:fdm=marker